从表中删除所有数据的最佳方法是什么?

时间:2011-11-10 21:34:53

标签: sql sqlite

我有一个包含600万行的SQLite表。

执行DELETE FROM TABLE非常慢;

删除表然后重新创建它似乎更快。

我正在使用它进行数据库导入。

删除表是一种更好的方法还是有办法快速删除所有数据?

4 个答案:

答案 0 :(得分:3)

一个很大的区别是DELETE FROM TABLE是DML而DROP TABLE是DDL。这在数据库事务中非常重要。最后的结果可能是相同的,但这些操作是非常不同的。

如果只是表现你需要注意那么可以删除并重新创建表格。如果您需要在导入中进行交易,那么您应该知道DDL未被覆盖且无法回滚。例如。

答案 1 :(得分:1)

一般来说,DROP TABLE将是一个未记录的事务。 DELETE FROM需要一个瞬态日志来记录记录,直到DELETE语句完成。

答案 2 :(得分:1)

TRUNCATE TABLE快得多。

除了Oracle网站之外,以下内容解释了原因:

'删除'执行正常的DML。也就是说,它们对行进行锁定,它们生成重做(大量的),并且它们需要UNDO表空间中的段。仔细删除块中的清晰记录。如果出现错误,则可以发出回滚以在提交之前恢复记录。删除不会放弃段空间,因此删除了所有记录的表会保留所有原始块。

截断是DDL,从某种意义上说,是作弊。截断物将表格的高水位标记移回零。不进行行级锁定,不会生成重做或回滚。初始化的所有范围都从表中取消分配(如果将MINEXTENTS设置为除1之外的任何值,则保留该数量的范围而不是仅保留初始范围)。通过重新定位高水位线,它们可以防止读取任何表格数据,因此它们具有与删除相同的效果,但没有所有开销。只是一个小问题:截断是一个DDL命令,所以如果你决定犯了错误就不能回滚它。 (当然,你也不能有选择地截断-no“WHERE”子句,这与删除不同。)

通过重置高水位标记,truncate可以防止读取任何表的数据,因此它们与删除具有相同的效果,但没有开销。但是,必须牢记一个截断的一个方面。因为Truncate是DDL,它会在它执行之前发出一个COMMIT,然后在另一个COMMIT之后发出,所以不能回滚该事务。

请注意,默认情况下,即使未指定DROP STORAGE,TRUNCATE也会删除存储空间。

答案 3 :(得分:0)

我不认为SQLite会实现TRUNCATE,但如果确实如此,它可能会比DELETE

更高效