【问题标题】:What's the best way to delete all data from a table?从表中删除所有数据的最佳方法是什么?
【发布时间】:2011-11-10 21:34:53
【问题描述】:

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

从表中删除非常慢;

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

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

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

【问题讨论】:

  • 你试过TRUNCATE TABLE吗?
  • SQLite 没有TRUNCATE,但是当有DELETE 没有WHERE 时,它应该进行截断优化
  • @Lamak 我知道在 MySQL 中没有 WHERE 的 DELETE 相当于 TRUNCATE
  • @Lamak 对我来说似乎不是很优化:)
  • @Jon - 这很奇怪,因为如果没有触发器,它应该会自动删除并重新创建您的表。 sqlite.org/compile.html#omit_truncate_optimization

标签: sql sqlite


【解决方案1】:

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

如果您只需要注意性能,则可以删除并重新创建表。如果您在导入中需要事务,那么您必须知道 DDL 不包括在内,并且无法回滚。

【讨论】:

  • 目前我做的第一件事就是删除它,然后重新创建它,然后创建一个事务并导入数据。
  • ..以及何时必须回滚您的事务?桌子是空的可以吗?还是必须包含导入失败前的数据?
  • 那么只要没有其他并发事务,您就可以使用更快的解决方案来删除和重新创建表。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    TRUNCATE TABLE 要快很多。

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

    “删除”执行正常的 DML。也就是说,它们对行进行锁定,它们生成重做(很多),并且它们需要 UNDO 表空间中的段。小心地从块中删除清除记录。如果发生错误,可以发出回滚以在提交之前恢复记录。删除不会放弃段空间,因此已删除所有记录的表保留其所有原始块。

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

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

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

    【讨论】:

    • 对不起,没有看到你使用 sqlite。我认为这篇文章回答了你的问题。 stackoverflow.com/questions/4280041/…
    • 这是对用户没有提出的问题的非常准确的回答。用户正在使用 SQLite,这是一种与 Oracle 截然不同的动物。
    • @Larry Lustig - 是的,我没有意识到 TRUNCATE 不可用。我的错。也就是说,为什么 TRUNCATE 更快的要点与执行 TRUNCATE 的 Oracle 以外的数据库有关,例如SQL Server。
    【解决方案4】:

    我不认为 SQLite 实现了 TRUNCATE,但如果它实现了,它可能会比 DELETE 更高效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 2016-08-31
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多