代码改变世界

oracle truncate表的原理

2022-05-21 16:36  abce  阅读(518)  评论(0编辑  收藏  举报

首先,对要truncate的表发生检查点,将SGA中的数据写入到磁盘。然后更新字典,表明没有数据块包含数据了,将表的高水位线移回到segment的头部块,变成零。

truncate并不是删除表和重建表,而是将高水位线移回到segment的开始。表的结构,索引和触发器被保留,所做的只是数据没了。数据还是在的,只是被标记为被删除了。

此外,任何从属对象都将被删除,并且表上的所有索引都将初始化回空状态。数据缓冲区缓存也会使缓存中的所有数据块失效。在10gR2及更高版本中,有一种新机制消除了完全扫描缓冲区以查找表块的要求。有一个基于对象的链表贯穿给定对象的所有缓冲区标头(buffer headers),使"彻底清扫"有效。

存在与truncate table命令相关的系统等待。"本地写入等待(local write wait)"的存在是因为当truncate表时,会话(而不是DBWR)会写入该表的表段头块(segment header block)、任何索引段头块(segment header block)以及任何索引根块。写入在会话时间内是同步的(而不是留给DBWR稍后写入),这使得它们对truncate表的直接性能影响比正常情况大得多。

truncate表很危险,因为无法使用闪回或ROLLBACK语句恢复该表。

可以使用BBED实用程序从truncate的表中恢复。