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

Rel*_*ike 9 index sql-server-2005 sql-server dbcc

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

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

DBCC INDEXDEFRAG (0, 829610394, 1)

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

小智 15

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

谢谢

  • 您无法从编写它的人那里得到更准确的答案!不要忘记与同时进行多次重建或重组相关的 IO 负载,并且一定要使用 ALTER INDEX 而不是 DBCC 命令。 (2认同)

Eri*_*elp 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/