加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 删除所有(1200万)记录后SQL Server“空表”很慢?

发布时间:2020-12-12 17:00:48 所属栏目:MsSql教程 来源:网络整理
导读:我有一个大约150列的SQL Server 2008实例.我之前已经在这个表中填充了大约1200万个条目,但之后已经清理了表格以准备新的数据集. 但是,曾经在空表上立即运行的命令(如count(*)和SQL Management Studio中的前1000名)现在可以运行. SELECT COUNT(*) FROM TABLE_N
我有一个大约150列的SQL Server 2008实例.我之前已经在这个表中填充了大约1200万个条目,但之后已经清理了表格以准备新的数据集.

但是,曾经在空表上立即运行的命令(如count(*)和SQL Management Studio中的前1000名)现在可以运行.

SELECT COUNT(*) FROM TABLE_NAME

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

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

DELETE FROM TABLE_NAME

世界上到底发生了什么?!?

解决方法

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

为什么DELETE完成后SELECT会变慢?

那是因为DELETE只有幻影行.该表与12M行一样大,即使它没有.要计算行数(0),计算12M行所需的时间就相同.及时,ghost清理过程将垃圾收集这些幻影记录并释放仅包含鬼影的页面,并且您的SELECT将加速.但是现在如果你在perfmon中检查Skipped Ghosted Records/sec可能在SELECT COUNT(*)期间暴涨.您还可以通过重建表来加快速度:ALTER TABLE … REBUILD.

TRUNCATE也会照顾这个问题,因为它不会留下任何鬼魂.

另见Inside the Storage Engine: Ghost cleanup in depth.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读