Oracle中的SQL命令截断比DELETE FROM table;更快,因为TRUNATE首先将指定的表完全删除,然后创建一个具有相同结构的新表(可能需要澄清,以防我是错误的)。由于截断是DDL的一部分,所以它在执行之前和完成执行之后隐式地发出COMMIT。如果是这种情况,那么由于数据字典中的整个结构,截断命令删除的表将永久丢失。在这种情况下,截断命令如何能够先删除表,然后用相同的结构重新创建相同的表?
发布于 2011-11-05 21:14:37
我认为截断(大量其他东西)只是简单地重置高水标志。
请参阅:http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10007.htm#SQLRF01707
然而,在http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2816964500346433991中
很明显,数据段在截断后会发生变化。
发布于 2011-11-05 04:23:06
(请注意,我在Sybase工程中为Sybase工作,我的回答来自我对truncate是如何在那里实现的知识,但我认为在Oracle中也是类似的。)
我不相信这个表实际上是被丢弃和重新创建的;内容只是被丢弃。这比delete from <table>要快得多,因为不需要执行任何触发器,而不是每次删除一行(从表和索引中删除),服务器可以简单地丢弃包含该表和任何索引的行的所有页面。
https://stackoverflow.com/questions/8018137
复制相似问题