我正在编写一个脚本,它打算通过创建一个带有聚集索引的虚拟列然后立即删除它来对基于 HEAP 的表进行碎片整理。(这是别人的应用程序,我不想进行任何永久性更改 - 不过他们做得很好。)
ALTER TABLE my_heap ADD dummy BIGINT IDENTITY;
GO
CREATE CLUSTERED INDEX ix_dummy ON my_heap (dummy);
GO
-- need to wait here until index completes
DROP INDEX ix_dummy ON my_heap;
ALTER TABLE my_heap DROP COLUMN dummy;
GO
Run Code Online (Sandbox Code Playgroud)
当我运行脚本的各个步骤时,它工作正常。当我一次运行它时,似乎什么也没有发生(碎片级别不会下降)。我相信这是因为 DROP 发生在 CREATE CLUSTERED 完成之前 - 所以 CREATE CLUSTERED 没有时间做它的事情。
如何让 DROP 等待 CREATE CLUSTERED 完成?我正在为大约 30 张桌子这样做,所以我不想为每张桌子设置一个简单的等待延迟 15 分钟。
PS 使用 SQL Server 2005