删除表中的所有行

时间:2009-07-10 23:12:05

标签: sql-server tsql

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

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

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

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

5 个答案:

答案 0 :(得分:75)

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

答案 1 :(得分:23)

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

  

您不能在以下表格上使用TRUNCATE TABLE:

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

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

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

答案 2 :(得分: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

这种方法有助于最大限度地减少应用程序停机时间。

答案 3 :(得分:11)

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

以下是相关的MSDN article

答案 4 :(得分:4)