删除所有(1200 万)条记录后,SQL Server“空表”变慢了?

27 sql-server-2008 sql-server

我有一个大约有 150 列的 SQL Server 2008 实例。我之前在这个表中填充了大约 1200 万个条目,但此后清除了该表以准备新的数据集。

但是,曾经在空表上立即运行的命令,例如count(*)select top 1000inSQL Management Studio现在需要花费大量时间才能运行。

SELECT COUNT(*) FROM TABLE_NAME 
Run Code Online (Sandbox Code Playgroud)

花了 11 多分钟才返回 0,SELECT TOP 1000花了将近 10 分钟才返回一张空桌子。

我还注意到我硬盘上的可用空间实际上已经消失了(从大约 100G 减少到 20G)。之间发生的唯一事情是我运行的一个查询:

DELETE FROM TABLE_NAME
Run Code Online (Sandbox Code Playgroud)

这世界到底怎么回事?!?

Rem*_*anu 42

您已经被告知为什么TRUNCATE比 更快/更好/更性感DELETE,但仍有一个问题需要解决:

为什么完成SELECT后更慢?DELETE

那是因为DELETE只对行进行了幻影。该表和它有 1200 万行时一样大,即使它没有。要计算行数 (0),所需的时间与计算 12M 行所需的时间一样多。鬼清除过程将及时收集这些鬼记录并释放包含鬼的页面,并且您的 SELECT 将加速。但是现在,如果您Skipped Ghosted Records/secSELECT COUNT(*). 您也可以通过重建表加快东西:ALTER TABLE ... REBUILD

TRUNCATE 也会解决这个问题,因为它不会留下任何鬼魂。

另请参阅存储引擎内部:深入清除 Ghost


小智 13

DELETE语句一次从表中删除一行,记录 中的每一行transaction log,并维护log sequence number (LSN)信息。由于您提到您的表中有大量数据(1200 万条记录),删除这些数据后您的硬盘空间不足,请检查数据库日志文件的大小。它很可能会增长。

更好的方法是:

TRUNCATE TABLE_NAME
Run Code Online (Sandbox Code Playgroud)

  • +1,对于 Oracle DB 完全相同。如果您使用导致记录记录的语句,随着时间的推移,它会减慢数据库的速度。 (2认同)