我怎样才能知道何时对SQLServer数据库进行碎片整理?


9

测量SQLServer数据库碎片/性能下降并确定何时对SQLServer数据库表进行碎片整理的最佳实践是什么?

我最感兴趣的是了解有用的指标是什么以及性能下降的水平应触发碎片整理。

Answers:


22

我敢肯定会有一些有趣的答案,因为在看什么指标上存在很多分歧。我写了DBCC INDEXDEFRAG,SHOWCONTIG并设计了它们在2005年的替代产品,还写了联机丛书的内容,所以我将向您介绍一下,并解释一下我选择的联机丛书和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页的索引中的碎片问题而烦恼。这是因为索引可能主要是驻留在内存中的(并且由于人们要求输入数字,所以我不得不提出一个数字)。

您可以在http://technet.microsoft.com/zh-cn/magazine/cc671165.aspx上有关数据库维护的《 TechNet杂志》文章中阅读有关此内容的更多信息,在我帮助撰写的基于2000的索引碎片整理最佳实践白皮书中http://technet.microsoft.com/zh-cn/library/cc966523.aspx,并且在我的博客上的“碎片”类别下为http://www.sqlskills.com/BLOGS/PAUL/category/Fragmentation.aspx

我认为我对此回答过度,但这是我的热键之一。希望这可以帮助 :-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.