Jeff Leonard Asked: 2009-05-15 07:22:55 +0800 CST2009-05-15 07:22:55 +0800 CST 2009-05-15 07:22:55 +0800 CST 我如何知道何时对我的 SQLServer 数据库进行碎片整理? 772 测量 SQLServer 数据库碎片/性能下降和确定何时对 SQLServer 数据库表进行碎片整理的最佳实践是什么? 我最感兴趣的是了解有用的指标是什么以及应该触发碎片整理的性能下降程度。 sql-server optimization defrag 1 个回答 Voted Best Answer Paul Randal 2009-05-15T08:32:10+08:002009-05-15T08:32:10+08:00 我相信对此会有一些有趣的答案,因为对于要查看的指标存在很多分歧。我编写了 DBCC INDEXDEFRAG、SHOWCONTIG 并为 2005 年设计了它们的替代品,另外还编写了 Books Online 内容,所以我将给出我的观点,并解释我选择的 Books Online 中的数字和 2005 年维护计划向导。 查看索引碎片的两个最佳指标是:1) (2005) 平均碎片百分比 / (2000) 逻辑扫描碎片 2) (2005) 平均页面密度 / (2000) 每页平均可用字节数 这些同样适用于聚集索引和非聚集索引。 1 是衡量有多少逻辑碎片。这是当索引的叶级页面的逻辑顺序与物理顺序不匹配时。这可以防止存储引擎在范围扫描期间进行有效的预读。所以#1 影响范围扫描性能,而不是单例查找性能。 2 在索引的叶级别测量每个页面上浪费了多少空间。浪费的空间意味着您使用更多的页面来存储记录,这意味着更多的磁盘空间来存储索引,更多的 IO 来读取索引,以及更多的内存来保存缓冲池中内存中的页面。 门槛?我的一般经验法则是碎片少于 10%,什么都不做。10-30%,做一个 ALTER INDEX ... REORGANIZE (2005) / DBCC INDEXDEFRAG (2000)。超过 30%,执行 ALTER INDEX ... REBUILD (2005) / DBCC DBREINDEX (2000)。这些是完整的概括,您的阈值会有所不同。 要找到您的阈值,请针对碎片级别对工作负载性能进行一些跟踪,并确定何时性能下降过多。那时你需要解决碎片问题。在碎片化生活和消除碎片化资源之间存在平衡。 我在这里没有谈到消除碎片的两种方法之间的权衡,例如 FILLFACTOR/PADINDEX 试图减轻碎片并减少碎片整理,更改架构/访问模式以减轻碎片,或不同类型的维护计划. 哦,顺便说一句,我总是建议不要担心少于 1000 页的索引中的碎片。这是因为索引可能主要驻留在内存中(并且因为人们要求一个数字,而我必须想出一个)。 您可以在我的 TechNet 杂志关于数据库维护的文章中阅读更多信息,网址为http://technet.microsoft.com/en-us/magazine/cc671165.aspx,在我帮助编写的关于索引碎片整理最佳实践的 2000 年白皮书中http://technet.microsoft.com/en-us/library/cc966523.aspx和我的博客上的碎片类别下http://www.sqlskills.com/BLOGS/PAUL/category/Fragmentation.aspx。 我想我有点过度回答了,但这是我的热门按钮之一。希望这可以帮助 :-)
我相信对此会有一些有趣的答案,因为对于要查看的指标存在很多分歧。我编写了 DBCC INDEXDEFRAG、SHOWCONTIG 并为 2005 年设计了它们的替代品,另外还编写了 Books Online 内容,所以我将给出我的观点,并解释我选择的 Books Online 中的数字和 2005 年维护计划向导。
查看索引碎片的两个最佳指标是:1) (2005) 平均碎片百分比 / (2000) 逻辑扫描碎片 2) (2005) 平均页面密度 / (2000) 每页平均可用字节数
这些同样适用于聚集索引和非聚集索引。
1 是衡量有多少逻辑碎片。这是当索引的叶级页面的逻辑顺序与物理顺序不匹配时。这可以防止存储引擎在范围扫描期间进行有效的预读。所以#1 影响范围扫描性能,而不是单例查找性能。
2 在索引的叶级别测量每个页面上浪费了多少空间。浪费的空间意味着您使用更多的页面来存储记录,这意味着更多的磁盘空间来存储索引,更多的 IO 来读取索引,以及更多的内存来保存缓冲池中内存中的页面。
门槛?我的一般经验法则是碎片少于 10%,什么都不做。10-30%,做一个 ALTER INDEX ... REORGANIZE (2005) / DBCC INDEXDEFRAG (2000)。超过 30%,执行 ALTER INDEX ... REBUILD (2005) / DBCC DBREINDEX (2000)。这些是完整的概括,您的阈值会有所不同。
要找到您的阈值,请针对碎片级别对工作负载性能进行一些跟踪,并确定何时性能下降过多。那时你需要解决碎片问题。在碎片化生活和消除碎片化资源之间存在平衡。
我在这里没有谈到消除碎片的两种方法之间的权衡,例如 FILLFACTOR/PADINDEX 试图减轻碎片并减少碎片整理,更改架构/访问模式以减轻碎片,或不同类型的维护计划.
哦,顺便说一句,我总是建议不要担心少于 1000 页的索引中的碎片。这是因为索引可能主要驻留在内存中(并且因为人们要求一个数字,而我必须想出一个)。
您可以在我的 TechNet 杂志关于数据库维护的文章中阅读更多信息,网址为http://technet.microsoft.com/en-us/magazine/cc671165.aspx,在我帮助编写的关于索引碎片整理最佳实践的 2000 年白皮书中http://technet.microsoft.com/en-us/library/cc966523.aspx和我的博客上的碎片类别下http://www.sqlskills.com/BLOGS/PAUL/category/Fragmentation.aspx。
我想我有点过度回答了,但这是我的热门按钮之一。希望这可以帮助 :-)