删除大表中所有数据的最快方法

Ron*_*fca 45 t-sql sql-server

我不得不从包含大约500万行的日志表中删除所有行.我最初的尝试是在查询分析器中发出以下命令:

从client_log中删除

花了很长时间.

Rob*_*ker 78

查看truncate table,它快得多.

  • 关于TRUNCATE的注释,如果其中一列是IDENTITY列,则TRUNCATE会将该列的SEED重置为其初始值(定义表时指定的值).所以从某种意义上说,这就像从一张全新的桌子开始.我发现在重新填充表之前清理数据很有用 (10认同)
  • @Dillie-O:TRUNCATE可以回滚,它只是取消分配页面的方式不同 - http://blog.sqlauthority.com/2010/03/04/sql-server-rollback-truncate-command-in -交易/ (4认同)

Ron*_*fca 33

我在msdn transact-SQL引用中发现了TRUNCATE TABLE.对于所有感兴趣的人都是这里的评论:

TRUNCATE TABLE在功能上与DELETE语句完全相同,没有WHERE子句:两者都删除表中的所有行.但是TRUNCATE TABLE比DELETE更快并且使用更少的系统和事务日志资源.

DELETE语句一次删除一行,并在事务日志中为每个已删除的行记录一个条目.TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并且只有页面解除分配记录在事务日志中.

TRUNCATE TABLE从表中删除所有行,但表结构及其列,约束,索引等仍然存在.标识用于新行的计数器将重置为列的种子.如果要保留身份计数器,请改用DELETE.如果要删除表定义及其数据,请使用DROP TABLE语句.

您不能在FOREIGN KEY约束引用的表上使用TRUNCATE TABLE; 相反,使用不带WHERE子句的DELETE语句.由于未记录TRUNCATE TABLE,因此无法激活触发器.

TRUNCATE TABLE不能用于参与索引视图的表.


squ*_*tte 15

TRUNCATE以某种方式跳过事务日志有一个共同的神话.

这是误解,在MSDN中明确提到.

在这里的几条评论中引用了这个神话.让我们一起根除它;)

  • 正确.截断是"最小化记录操作",但仍然记录. (2认同)

Unk*_*ech 6

作为参考,TRUNCATE TABLE也适用于MySQL


dar*_*7yl 6

我使用以下方法将表清零,额外的好处是它为我留下了表的存档副本。

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
Run Code Online (Sandbox Code Playgroud)