2008-09-15 188 views

回答

67

退房truncate table这快很多。

+4

TRUNCATE是最快的,只要记住,在事件发生的时候你将无法回滚数据。 – 2008-09-15 15:50:52

+9

有关TRUNCATE的说明,如果其中一列是IDENTITY列,则TRUNCATE会将该列的SEED重置为其初始值(定义表时指定的一个值)。所以从某种意义上说,它就像是从一张全新的桌子开始。我发现它在重新填充表之前清理数据很有用 – kristof 2008-09-23 16:53:09

+0

是的,而在Oracle世界中我们称之为水印转换,并不确定其他人。 – 2008-12-30 09:55:11

0

是的,删除500万行可能需要很长时间。我能想到的唯一可能更快的方法是放弃表格并重新创建表格。当然,如果你想删除表中的所有数据,这只会起作用。

0

截断表client_log

是你最好的选择,截断杀死表和索引的所有内容并重置你有过任何种子。

1

在SQL Server上,您可以使用Truncate Table命令,该命令比常规删除更快,并且使用的资源也更少。它会将任何标识字段重置为种子值。

截断的缺点是它不能用于被外键引用的表,并且不会触发任何触发器。如果出现任何问题,您也将无法回滚数据。

30

我在msdn transact-SQL参考中发现了TRUNCATE TABLE。对于这里所有感兴趣的是:

TRUNCATE TABLE在功能上与不带WHERE子句的DELETE语句相同:都删除表中的所有行。但是TRUNCATE TABLE比DELETE使用更少的系统和事务日志资源。

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

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

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

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

5

仅供参考TRUNCATE TABLE也适用于MySQL的

1

truncate table独立 SQL平台。如果您怀疑可能曾经更改数据库提供程序,您可能会谨慎使用它。

0

“删除并重新创建表格”的建议可能不是一个好建议,因为这会导致您的外键失效。

您正在使用外键,对不对?

1

请注意,TRUNCATE还会重置任何自动递增键,如果您正在使用这些键。

如果不希望丢失自动递增键,可以通过删除组(例如,DELETE FROM表WHERE id> 1 AND id < 10000)来加快删除速度。它将显着提高速度,并在某些情况下防止数据被锁定。

0

我修改我先前说的:

你应该明白,通过使用 截断的数据将被清除,但 什么都不会被记录到 事务日志。写入日志 是为什么DELETE将永远占用5行0,万行。我在开发过程中经常使用TRUNCATE ,但是您应该注意 在生产 数据库上使用它,因为您不能使用 回滚您的更改。你应该 立即做一个完整的数据库 备份后做一个TRUNCATE到 建立一个新的恢复基础。

以上声明旨在提示您确定您明白两者之间存在差异。不幸的是,它写得很差,并且没有支持的语句,因为我没有在两者之间自己做任何测试。它基于我从别人那里听到的声明。

MSDN

DELETE语句删除行一个 在同一时间,并记录在 事务日志删除的每一行的条目。 TRUNCATE TABLE删除数据 解除分配用于存储表数据的数据页,并且只有 页解除分配记录在 事务日志中。

我只是想说这两者之间存在根本差异,因为存在差异,会有应用程序在其中一个或另一个可能不合适。

12

TRUNCATE以某种方式跳过事务日志有个常见的误解。

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

这个神话在这里的几个注释中被调用。让我们来根除它在一起;)

0

如果你不能使用,因为外键和/或触发TRUNCATE TABLE,你可以考虑:

  • 删除所有索引;
  • 做一般的DELETE;
  • 重新创建所有索引。

这可能会加快DELETE的速度。

3

忘记截断和删除。维护你的表定义(如果你想重新创建它),并使用drop table。

3

我使用下面的方法来清零表格,并带来额外的好处,它为我留下了表格的存档副本。

CREATE TABLE `new_table` LIKE `table`; 
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`; 
0
DELETE * FROM table_name; 

过早的优化可能是危险的。优化可能意味着做一些奇怪的事情,但如果它起作用,您可能想要利用它。

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy; 

对于速度,我认为这取决于...

  • 底层数据库:甲骨文,微软,MySQL和PostgreSQL,其他人,自定义...

  • 表,它的内容和相关表格:

可能存在删除规则。是否存在删除表中所有内容的现有过程?这可以针对特定的底层数据库引擎进行优化吗?我们对打破事物/相关数据有多重视?假设其他相关表不依赖于此表,执行DELETE可能是“最安全”的方式。是否有其他表和查询相关/取决于此表中的数据?如果我们不关心这个表格是否在意,使用DROP可能是一种快速方法,同样取决于底层数据库。

DROP TABLE table_name; 

有多少行被删除?是否还有其他信息能够快速收集到优化删除的信息?例如,我们可以告诉桌子是否已经空了吗?我们能否分辨出是否有数百,数千,数百亿行?

相关问题