【发布时间】:2011-03-27 03:27:59
【问题描述】:
我有一个包含大约 40 列和数亿行的大型 SQL Server 数据库。
这个表在模式中应该是松散的,所以我有很多列作为 VARCHAR(MAX),即使它可能是 BIGINT、DATETIME、INT 等。这对查询时间/效率有影响吗?例如会
SELECT TOP 100 * FROM CustomerId = 34343
快于
SELECT TOP 100 * FROM CustomerId = '34343'
?如果是,快多少?
如果我使用 VARCHAR(MAX) 而不是固定长度的 VARCHAR.. 那么在这方面其他数据库如 mySQL 等呢?
【问题讨论】:
-
一想到表在架构中应该是松散的,我就不寒而栗。这是一个巨大比例的错误。灵活性 - 性能 - 选择一个。我保证您的用户需要的性能不仅仅是灵活的架构。为不属于系统设计主要部分的罕见情况保留灵活性。对数字使用 varchar 已经够糟糕了,这意味着您必须将它们转换回数字才能进行任何报告计算(并且几乎可以保证数据完整性不好),但使用 varchar 作为日期更糟糕。除非您喜欢尝试解释如何处理 02/30/2010。
-
您并没有说您使用的是 EAV 表,但这篇文章可能会向您指出为什么松散模式是一个糟糕的设计 - 您将不得不在某个时候取回数据并查询这个混乱:@ 987654321@
-
实际上我们有时会收到垃圾数据,我们甚至需要记录这些数据。因此,如果我将 customerId 作为数字,我们可能会得到 customerID = 568d4 不会被记录。我们正在尝试找出一些东西
标签: sql database-design optimization performance