行大小、索引和 varchar(max)

行大小、索引和 varchar(max)

我有一张包含 1 亿多行数据的表。随着数据的增长,我们发现查询性能非常差。我注意到行大小非常​​大(10190),我认为这会影响索引/索引性能。

表中有很多列的数据类型设置错误(很多列的数据类型为 int,而 tinyint 更合适,等等)。我去更新了表,做了一些我能做的更改。

原始行大小为 10190,我可以通过将 int 调整为 smallint 或 tinyint 将其减小到 10090。

有两列设置为 varchar(2048)。我将它们更改为 varchar(max),行大小降至约 6000。

我使用了在这里找到的查询http://www.sqlservercentral.com/Forums/Topic226699-5-1.aspx获取行大小。

我的问题是:当这些列不经常使用时,将 varchar(2048) 列更改为 varchar(max) 是否有助于索引/性能? 如果行大小低于 8000 怎么办?

答案1

VARCHAR(2048)和之间基本上没有区别VARCHAR(MAX)。一个会溢出到“行溢出”分配单元,另一个会溢出到 BLOB 分配单元,请参阅表和索引组织。表格选项的默认设置large value types out of row为 0,因此,除非它被更改,VARCHAR(MAX)否则将尽可能保持在行中,就像VARCHAR(2048)会一样。

我建议跑步sys.dm_db_index_physical_stats并获取实际的最大、最小和平均行大小以及avg_page_space_used_in_percent。这将更准确地反映真实的行大小,而不是理论上声明的大小。

答案2

我首先要检查的是聚集索引。如果使用复合索引,则应将其设置为一个较窄的列,一列或尽可能少的列。理想情况下,应将其设置为可以连续的列,例如 bigint,而不是 uniqueIdentifier。如果使用 uniqueIdentifier 聚集索引,有些人会通过添加 bigint 聚集索引并将 uniqueIdentifier 保留为唯一索引来提高性能。

SSMS 有时会提供有用的信息,但索引可能缺失:
http://msdn.microsoft.com/en-us/library/ms345524%28v=SQL.100%29.aspx

接下来是分析查询。找出哪些查询耗时最多,并确定它们是否命中覆盖索引或执行表扫描。您可能想要发布一些 SQL 查询和现有索引的详细信息。

答案3

查询是否编写得仅请求所需的数据,即没有 SELECT *?

我会检查 SQL 服务器的整体设置,验证配置是否遵循推荐的做法(请参阅 Brent Ozar 的优秀清单);然后也许运行一些 perfmon 来查看你的瓶颈在哪里,首先检查磁盘队列长度。

相关内容