DELETE和TRUNCATE之间的区别
DELETE和TRUNCATE之间的区别
摘抄自《SQLSERVER企业级平台管理实践》
与delete相比,truncate具有以下优点:
1、所用的事务日志空间较少
delete语句每次删除一行,并在事务日志中为所删除的每行记录一个项。truncate table通过释放用于存储表数据的数据页来删除数据,并且在事务
日志中只记录页释放这个动作,而不记录每一行
2、使用的锁通常较少
当使用行锁执行delete语句时,将锁定表中各行以便删除。truncate table始终锁定表和页,而不是锁定各行。
3、表中将毫无例外地留下任何页
执行delete语句后,表依然会包含空页。例如,必须至少使用一个排他表锁(LCK_M_X),才能释放堆中的空页。如果执行删除操作
时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。
truncate table删除表中的所有行,但表结构以及列、约束、索引等保持不变。若要删除表定义以及数据,请使用drop table语句
-------------------------------------------------华丽的分割线-----------------------------------------------------------
为了更及时地删除数据,释放空间,可以采用的方法有:
(1)在表格上建立聚集索引
(2)如果所有数据都不要了,要使用truncate table而不是delete
(3)如果表格本身不要了,就直接drop table
----------------------------------------------华丽的分割线------------------------------------------------------
delete了的数据,SQLSERVER却没有完全释放空间,这不是空间泄漏吗?久而久之,我的数据库里会不会充斥着这些“没用”的页面,
把我的空间都浪费掉了?这倒不必担心,虽然这些页面没有被释放掉,但当表格里插入新的数据时,这些页面是会被重新使用的。
所以这些页面并没有被“泄漏”掉,会留给SQLSERVER重用
如果真的看着这些页面碍事,而表格又不能整个删除掉,处理起来有时候有点费事。如果表格有聚集索引,可以重建一下索引能释放掉
这些页面,还是挺简单的。但是如果没有,可能就要重建一张新表,把数据从旧表里倒过去,然后再删除旧表,释放空间;或者
在这张表上建一个聚集索引。这样有点折腾。所以表没用了,就直接删掉他;如果表还有用,那这些页面将来再有新数据插入时,
还会被利用上。一般没必要一定要逼着SQLSERVER把他们释放出来。
--------------------------------------------华丽的分割线---------------------------------------------------------
有朋友说truncate table会使用鬼影记录,truncate table其实是不需要鬼影记录功能的,前者是直接把表里面的所有页面进行释放即可
如果有不对的地方,欢迎大家一起来拍砖o(∩_∩)o
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战