重建索引所需的时间是否取决于碎片级别?
如果重建相同索引的40%碎片索引需要1分钟,重建80%碎片索引大约需要2分钟吗?
我要求的是执行所需操作所需的RUNTIME(例如,以秒为单位),而不是关于在特定情况下需要执行哪些操作。我知道应该进行索引重组或重建/统计更新时的基本最佳实践。
这个问题不问关于REORG以及REORG和REBUILD之间的区别。
背景:由于设置了不同的索引维护作业(每个晚上,周末工作量较大……),我想知道是否应该对低中级零散的索引更好地执行每日“轻度”离线索引维护作业,以保持关闭时间很小-甚至没有关系,在80%碎片索引上进行重建可能需要与在40%碎片索引上进行相同操作的时间相同。
我遵循了建议,并试图找出自己正在发生的事情。我的实验设置:在没有其他操作且未被任何人或其他任何人使用的测试服务器上,我在uniqueidentifier主键列上创建了带有聚簇索引的表,其中包含一些其他列和不同的数据类型[2数字,9日期时间和2 varchar(1000)]并简单地添加行。对于提出的测试,我增加了约305,000行。
然后,我使用了一条更新命令,并随机更新了对整数值进行过滤的行范围,并使用变化的字符串值更改了VarChar列之一以创建碎片。之后,我检查中的当前avg_fragmentation_in_percent
水平sys.dm_db_index_physical_stats
。每当为基准创建“新”碎片时,都会将此值(包括该physical_page_count
值)添加到下图所组成的录音中。
然后我跑了出来:Alter index ... Rebuild with (online=on);
并CPU time
通过STATISTICS TIME ON
录音来抓取。
我的期望:我期望至少看到一种线性曲线的指示,该线性曲线显示碎片水平和cpu时间之间的依赖关系。
不是这种情况。我不确定此程序是否真的适合取得良好效果。也许行数/页面数太少?
但是结果表明,我最初的问题的答案肯定是“ 否”。看起来SQL Server重建索引所需的cpu时间既不依赖于碎片级别,也不依赖于基础索引的页数。
第一张图表显示了与先前的碎片级别相比,重建索引所需的cpu时间。如您所见,平均线是相对恒定的,碎片与所需的cpu时间之间根本没有关系。
为了尊重更新后索引页数变化可能会影响重建的时间的影响,我计算了FRAGMENTATION LEVEL * PAGES COUNT并在第二张图表中使用了该值,该图表显示了所需cpu时间的关系以及碎片和页数。
如您所见,即使页面数有所变化,这也并不表示重建所需的时间受碎片影响。
在做出这些陈述之后,我想我的程序一定是错误的,因为重建一个庞大且高度分散的索引所需的cpu时间可能仅受行数的影响-我并不真正相信这一理论。
因此,因为我确实非常想立即发现这一点,所以欢迎任何进一步的评论和建议。