我有一个大约有 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/sec在SELECT COUNT(*). 您也可以通过重建表加快东西:ALTER TABLE ... REBUILD。
TRUNCATE 也会解决这个问题,因为它不会留下任何鬼魂。
另请参阅存储引擎内部:深入清除 Ghost。
小智 13
DELETE语句一次从表中删除一行,记录 中的每一行transaction log,并维护log sequence number (LSN)信息。由于您提到您的表中有大量数据(1200 万条记录),删除这些数据后您的硬盘空间不足,请检查数据库日志文件的大小。它很可能会增长。
更好的方法是:
TRUNCATE TABLE_NAME
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15874 次 |
| 最近记录: |