再发:truncate和delete的区别

红薯 发布于 2010/08/16 18:24
阅读 331
收藏 2

转发的文章,全文如下:

1、无论truncate大表还是小表速度都非常快,因为truncate不产生回滚信息,而且删除行是不能恢复的。
2、truncate是DDL语句进行隐式提交。
3、truncate重新设定表和索引的HWM(高水标记),由于全表扫描和索引快速扫描都要读取所有的数据块知道HWM为止。所以全表扫描的性能不会因为delete而提高,但是经过truncate操作后速度会很快。
4、truncate不会触发任何delete触发器。
5、不能赋给某个用户truncate其它用户表的权限。如果需要trucate其它用户表的权限必须对该用户赋DROP ANY TABLE权限。
6、当表被truncate后,这个表和索引所占的空间会恢复到初始大小,而delete操作不会减少表或索引所占的空间。
7、不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除。

备注:
数据块禁止插入的情况:数据块在使用的时候,当数据块的使用率达到pctfree,这时,oracle将该数据块标识 为full,不允许再插入。另外一种情况,如果计算新插入的行数据将超过pctfree,这时oracle就会将该数据块标识为full,并且新插入的这 个行将插入到其他的数据块中。
数据块允许插入的情况:当标识为full的数据块中的数据被删除,释放空间到pctused以下时,数据块从新被标识为free,可以允许插入新的数据。
高水标识:随着数据不断的放到表中,使用了更多的块,高水标记就会上升,如果删除一些(甚至所有)表中的行,有许多块 可能不再包含数据,但是这些块仍然在高水标记以下,并且保持在高水标记以下直到对象被重建或删减。 在全表扫描期间,oracle将扫描高水标记以下的所有块,即使它们不包含数据。在这里,HWM时针对extents而言的。HWM位于第一个 unformated数据块上。当有新的行插入的时候,oracle会优先从HWM以下的块中去寻找free的块,以插入的新的行数据。如果没有找到,再 去HWM之上的空间中去formate新的数据块来插入数据。

加载中
返回顶部
顶部