Oracle中的SQL命令TRUNCATE比DELETE FROM table;
快,因为TRUNATE命令首先完全删除其中的指定表,然后创建一个具有相同结构的新表(如果我可能需要澄清,可能需要澄清)强>错)。由于TRUNCATE是DDL的一部分,因此它在执行之前和执行完成之后隐式发出COMMIT。如果是这种情况,那么由TRUNCATE命令删除的表将永久丢失,并且它在数据字典中的整个结构。在这种情况下,TRUNCATE命令如何能够首先删除表并使用相同的结构重新创建相同的表?
答案 0 :(得分:7)
(请注意,我在SQL Anywhere工程中为Sybase工作,我的答案来自于我对truncate
如何在那里实现的知识,但我想它在Oracle中也是类似的。)
我不相信该表实际上已被删除并重新创建;内容被简单地扔掉了。这比delete from <table>
快得多,因为不需要执行任何触发器,而不是一次删除一行(从表和索引中删除),服务器可以简单地丢弃全部包含该表和任何索引的行的页面。
答案 1 :(得分:5)
我认为截断(最其他的事情)只是重置高水位标记。
请参阅: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很明显,截断后数据段会发生变化。