Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 什么';从表中删除所有数据的最佳方法是什么?_Sql_Sqlite - Fatal编程技术网

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

Sql 什么';从表中删除所有数据的最佳方法是什么?,sql,sqlite,Sql,Sqlite,我有一个包含600万行的SQLite表 从表中删除是相当慢的 放下表格,然后重新创建它似乎更快 我正在使用它进行数据库导入 删除表是更好的方法还是有办法快速删除所有数据?一般来说,删除表将是一个未记录的事务。DELETE-FROM需要一个临时日志来记录这些记录,直到DELETE语句完成 我不认为SQLite实现了TRUNCATE,但如果它实现了,它的性能可能会比DELETE快得多 以下内容(Oracle网站除外)解释了原因: “删除”执行正常的DML。也就是说,它们对行进行锁定,生成redo(很

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

从表中删除是相当慢的

放下表格,然后重新创建它似乎更快

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


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

一般来说,删除表将是一个未记录的事务。DELETE-FROM需要一个临时日志来记录这些记录,直到DELETE语句完成

我不认为SQLite实现了
TRUNCATE
,但如果它实现了,它的性能可能会比
DELETE

快得多

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

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

截断是DDL,从某种意义上说,是欺骗。截断会将表的高水位线移回零。不执行行级锁,不生成重做或回滚。从表中取消分配初始数据块的所有数据块(如果将MINEXTENTS设置为除1以外的任何值,则保留该数据块数,而不仅仅是初始数据块数)。通过重新定位高水位线,它们阻止读取任何表数据,因此它们具有与删除相同的效果,但没有所有开销。只有一个小问题:truncate是一个DDL命令,所以如果您认为自己犯了错误,就不能回滚它。(当然,与deletes不同,不能有选择地截断-不允许使用“WHERE”子句)

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


请注意,默认情况下,即使未指定删除存储,也会截断删除存储

一个很大的区别是
deletfromtable
是DML,而
DROP TABLE
是DDL。对于db事务,这一点非常重要。最后的结果可能是相同的,但这些操作非常不同


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

您是否尝试过执行
截断表
?SQLite没有
截断
,但是当有一个
DELETE
而没有
WHERE
@Lamak时,它应该进行截断优化,我知道在MySQL中,没有WHERE的DELETE相当于TRUNCATE@Lamak对我来说,它似乎不是很优化:)@Jon-这是奇怪的部分,因为如果没有触发器,它应该自动删除并重新创建您的表。抱歉,没有看到您使用sqlite。我想这篇文章回答了你的问题。这是对用户没有提出的问题的非常精确的回答。用户正在使用SQLite,一种与Oracle截然不同的动物。@Larry Lustig-是的,我没有意识到TRUNCATE不可用。我的错。也就是说,TRUNCATE为什么更快的要点与实现TRUNCATE的DBs(而非Oracle)有关,例如SQL Server。目前,我要做的第一件事是删除它,然后重新创建它,然后创建事务并导入数据……以及何时必须回滚事务?桌子是空的可以吗?或者它必须在导入失败之前包含数据?那么您可以使用更快的解决方案删除并重新创建表,只要没有其他并发事务。