Normaly我会做一个delete * from XXX
,但在这个表上非常慢,它通常有大约500k到1m的行(如果匹配则一个是varbinary(MAX))。
基本上我想知道是否有一种快速的方式来显示所有内容的表,它实际上更快地删除并重新创建它然后通过删除sql语句删除内容
我不想重新创建表的原因是因为它的重用和删除/重新创建我认为会破坏sql server收集的索引和统计信息
我也希望有一种方法可以做到这一点,因为有一种“聪明”的方法可以通过sys.sysindexes获取行数,所以我希望有一种同样聪明的方法来删除内容
答案 0 :(得分:75)
Truncate table
比delete * 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)