删除表中的所有行

EKS*_*EKS 58 t-sql sql-server

Normaly我会做一个,delete * from XXX但是在这个表上非常慢,它通常有大约500k到1m的行(如果相关,则一个是varbinary(MAX)).

基本上我想知道是否有一个快速的方法来emty所有内容的表,它的实际更快删除并重新创建它然后通过删除sql语句删除内容

我不想重新创建表的原因是因为它的重用和删除/重新创建我认为会破坏sql server收集的索引和统计信息

我也希望有一种方法可以做到这一点,因为有一种"聪明"的方式来通过sys.sysindexes获取行数,所以我希望有一种同样聪明的方法来删除内容

Sco*_*ott 76

Truncate table比...更快delete * from XXX.Delete很慢,因为它一次只能运行一行.在某些情况下,truncate不起作用,您可以在MSDN上阅读.

  • 这也有不加行删除的行到事务日志的效果.因此,它不能回滚,也不会浪费一堆磁盘空间 (12认同)

adr*_*nks 23

正如其他人所说,TRUNCATE TABLE速度要快得多,但确实有一些限制(取自这里):

您不能对以下表使用TRUNCATE TABLE:

- 由FOREIGN KEY约束引用.(您可以截断具有引用自身的外键的表.)
- 参与索引视图.
- 使用事务复制或合并复制发布.

对于具有一个或多个这些特征的表,请改用DELETE语句.

最大的缺点是,如果您尝试清空的表具有指向它的外键,则截断调用将失败.


Dun*_*ers 12

您可以重命名有问题的表,创建一个具有相同模式的表,然后在闲暇时放下原始表.

有关[ RENAME TABLE] [1]和[ CREATE TABLE] [2]命令的信息,请参见MySQL 5.1参考手册.

RENAME TABLE tbl TO tbl_old;

CREATE TABLE tbl LIKE tbl_old;

DROP TABLE tbl_old; -- at your leisure
Run Code Online (Sandbox Code Playgroud)

这种方法可以帮助最大限度地减少应用程


Ste*_*ple 11

我建议使用TRUNCATE TABLE,它比DELETE FROM xxx更快,使用更少的资源

这是相关的MSDN文章