sql-server – DELETE vs TRUNCATE
我试图更好地理解DELETE和TRUNCATE命令之间的差异.我对内部的理解有以下几点: 删除 – >数据库引擎从相关数据页和输入行的所有索引页中查找并删除该行.因此,索引越多,删除所用的时间越长. TRUNCATE – >简单地删除所有表格的数据页面,使其成为删除表格内容的更有效选项. 假设以上是正确的(如果没有,请纠正我): >不同的恢复模式如何影响每个语句?如果有任何影响 解决方法
是的,虽然这里有两种选择.可以由执行基表删除的同一运算符逐行从非聚簇索引中删除行.这称为窄(或每行)更新计划: 或者,非聚集索引删除可以由单独的运算符执行,每个非聚簇索引一个.在这种情况下(称为宽或每索引更新计划),完整的操作集存储在工作表(急切的假脱机)中,然后每个索引重放一次,通常按特定的非聚集索引的键显式排序,以鼓励顺序访问模式.
是.由于多种原因,TRUNCATE TABLE效率更高: >可能需要更少的锁.截断通常只需要在表级别进行单个模式修改锁定(并且每个extent解除分配时使用独占锁定).删除可能会获得较低(行或页面)粒度的锁定以及取消分配的任何页面上的独占锁定.
删除始终完全记录(删除的每一行都记录在事务日志中).如果恢复模型不是FULL,则日志记录的内容会有一些小的差异,但这仍然是技术上的完整日志记录.
删除索引中的行(使用前面显示的窄更新计划或宽更新计划)始终是按键访问(搜索).扫描删除的每一行的整个索引将是非常低效的.让我们再看一下前面显示的每个索引更新计划: 执行计划是需求驱动的管道:父运算符(左侧)通过一次请求一行来驱动子运算符执行工作. Sort运算符是阻塞的(它们必须在生成第一个排序行之前使用它们的整个输入),但它们仍然由它们的父(Index Delete)驱动,请求第一行. Index Delete从完成的Sort中一次拉一行,更新每行的目标非聚集索引. 在广泛的更新计划中,您经常会看到基表更新运算符将行添加到行流中.在这种情况下,“聚簇索引删除”会将非聚簇索引键列添加到流中.存储引擎需要此数据来定位要从非聚集索引中删除的行:
在使用事务或合并复制发布的表上,截断是not allowed.如何复制删除取决于复制的类型及其配置方式.例如,快照复制只是使用批量方法复制表的时间点视图 – 不跟踪或应用增量更改.事务复制的工作原理是读取日志记录并生成适当的事务以在订阅者处应用更改.合并复制使用触发器和元数据表跟踪更改. (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |