通过创建聚集索引并立即删除它来对 HEAP 进行碎片整理

S. *_*mes 3 index sql-server-2005 clustered-index scripting t-sql

我正在编写一个脚本,它打算通过创建一个带有聚集索引的虚拟列然后立即删除它来对基于 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

孔夫子*_*孔夫子 6

如何让 DROP 等待 CREATE CLUSTERED 完成?

你没有,它已经有了。这些语句是顺序的,即同步的,一个接一个。

什么是堆存储? 保罗兰德尔解释

所以你真正拥有的只是一叠纸,几乎是字面意思。您的操作将右下角的页面整齐地编号,按顺序整理页面,绑定它们,然后……解绑并再次将它们堆成一堆扔回桌面。总成绩接近于零。当然你会从整理和删除转发的页面中重新获得一些使用,数据页面可能会更紧凑一些。除此之外,它和你开始时一样混乱。