可以同时在不同的表上运行两个DBCC INDEXDEFRAG命令吗?


9

我当前正在运行一个脚本,该脚本在SQL Server 2005数据库中的每个表上一次执行一个DBCC INDEXDEFRAG。由于空间限制和正常运行时间的要求,不能选择使用DBCC DBREINDEX而不是INDEXDEFRAG。

我注意到,某些表需要很长时间才能进行碎片整理。例如,如果我检查“ sys.dm_exec_requests”动态管理视图,则可以看到以下INDEXDEFRAG当前正在删除table_id为829610394的表的聚集索引:

DBCC索引(0,829610394,1)

我知道碎片整理过程需要很长时间才能完成。撇开当前正在运行的脚本最终会对所有表进行碎片整理这一事实,在执行当前命令时在另一个表的聚集索引上手动运行另一个DBCC INDEXDEFRAG是否对我有什么危害?如果执行此操作,实际上是否会同时对两个表进行碎片整理?

Answers:


15

是的,您可以对多个表执行此操作。您不能对同一张表上的多个索引执行此操作-我发明了一个新的索引锁定子资源来防止这种情况。在ALTER INDEX中具有相同的行为...在2005年我将其替换为REORGANIZE。

谢谢


2
您所得到的答案不可能比写此书的人更准确!不要忘记与同时进行多个重建或重组有关的IO负载,并且一定要使用ALTER INDEX而不是DBCC命令。
AndrewSQL 2011年

同意,我不知道有什么比保罗·兰德尔(Paul Randal)的答案更准确的答案。谢谢保罗。
RelentlessMike

6

请注意,不建议使用DBCC INDEXDEFRAG和DBREINDEX并由ALTER INDEX代替:

重要

将来的Microsoft SQL Server版本将删除此功能。不要在新的开发工作中使用此功能,请尽快修改当前使用此功能的应用程序。请改用ALTER INDEX。- http://msdn.microsoft.com/en-us/library/ms177571(v=SQL.90).aspx

至于同时运行两个,则取决于您的文件布局。如果它们都在同一磁盘上,您可能会减慢它们的速度,因为它们将在I / O方面相互竞争。最好在必要时只进行REORG或REBUILD。在此处查看Michelle Ufford的脚本以获取自动化解决方案:http : //sqlfool.com/2010/04/index-defrag-script-v4-0/


谢谢埃里克。在这种特殊情况下,数据库分布在多个数据文件中,位于不同分区上以及位于IBM DS8300 SAN之上。因此,我认为就I / O而言我会没事的。
RelentlessMike
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.