回答
退房truncate table这快很多。
是的,删除500万行可能需要很长时间。我能想到的唯一可能更快的方法是放弃表格并重新创建表格。当然,如果你想删除表中的所有数据,这只会起作用。
截断表client_log
是你最好的选择,截断杀死表和索引的所有内容并重置你有过任何种子。
在SQL Server上,您可以使用Truncate Table
命令,该命令比常规删除更快,并且使用的资源也更少。它会将任何标识字段重置为种子值。
截断的缺点是它不能用于被外键引用的表,并且不会触发任何触发器。如果出现任何问题,您也将无法回滚数据。
我在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不能用于参与索引视图的表格。
仅供参考TRUNCATE TABLE也适用于MySQL的
truncate table
独立不 SQL平台。如果您怀疑可能曾经更改数据库提供程序,您可能会谨慎使用它。
“删除并重新创建表格”的建议可能不是一个好建议,因为这会导致您的外键失效。
您正在使用外键,对不对?
请注意,TRUNCATE还会重置任何自动递增键,如果您正在使用这些键。
如果不希望丢失自动递增键,可以通过删除组(例如,DELETE FROM表WHERE id> 1 AND id < 10000)来加快删除速度。它将显着提高速度,并在某些情况下防止数据被锁定。
我修改我先前说的:
你应该明白,通过使用 截断的数据将被清除,但 什么都不会被记录到 事务日志。写入日志 是为什么DELETE将永远占用5行0,万行。我在开发过程中经常使用TRUNCATE ,但是您应该注意 在生产 数据库上使用它,因为您不能使用 回滚您的更改。你应该 立即做一个完整的数据库 备份后做一个TRUNCATE到 建立一个新的恢复基础。
以上声明旨在提示您确定您明白两者之间存在差异。不幸的是,它写得很差,并且没有支持的语句,因为我没有在两者之间自己做任何测试。它基于我从别人那里听到的声明。
从MSDN:
DELETE语句删除行一个 在同一时间,并记录在 事务日志删除的每一行的条目。 TRUNCATE TABLE删除数据 解除分配用于存储表数据的数据页,并且只有 页解除分配记录在 事务日志中。
我只是想说这两者之间存在根本差异,因为存在差异,会有应用程序在其中一个或另一个可能不合适。
TRUNCATE以某种方式跳过事务日志有个常见的误解。
这是误解,在MSDN中明确提到。
这个神话在这里的几个注释中被调用。让我们来根除它在一起;)
如果你不能使用,因为外键和/或触发TRUNCATE TABLE,你可以考虑:
- 删除所有索引;
- 做一般的DELETE;
- 重新创建所有索引。
这可能会加快DELETE的速度。
忘记截断和删除。维护你的表定义(如果你想重新创建它),并使用drop table。
我使用下面的方法来清零表格,并带来额外的好处,它为我留下了表格的存档副本。
CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
DELETE * FROM table_name;
过早的优化可能是危险的。优化可能意味着做一些奇怪的事情,但如果它起作用,您可能想要利用它。
SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;
对于速度,我认为这取决于...
底层数据库:甲骨文,微软,MySQL和PostgreSQL,其他人,自定义...
表,它的内容和相关表格:
可能存在删除规则。是否存在删除表中所有内容的现有过程?这可以针对特定的底层数据库引擎进行优化吗?我们对打破事物/相关数据有多重视?假设其他相关表不依赖于此表,执行DELETE可能是“最安全”的方式。是否有其他表和查询相关/取决于此表中的数据?如果我们不关心这个表格是否在意,使用DROP可能是一种快速方法,同样取决于底层数据库。
DROP TABLE table_name;
有多少行被删除?是否还有其他信息能够快速收集到优化删除的信息?例如,我们可以告诉桌子是否已经空了吗?我们能否分辨出是否有数百,数千,数百亿行?
- 1. 删除不在数据表中的文件的最快方法?
- 2. 从sql 2005数据库中删除所有表的最佳方法
- 3. 什么是删除Excel表格的所有空行的最快方法?
- 4. 使用NHibernate删除表中所有行的最佳方法?
- 5. 删除t-sql中所有大表的最佳方法是什么?
- 6. 删除/删除矢量项的最有效/最快捷的方法
- 7. 删除列表中的重复项的最快方法Python
- 8. 从Sugar ORM中删除所有表中的所有数据
- 9. 从数据表中删除重复条目的最佳方法
- 10. 如何删除Seed方法中的所有数据?
- 11. 删除数据库中的所有内容并从头开始重建的最快方法?
- 12. 联合所有最快的方法
- 13. 从数据库的所有表中删除所有记录
- 14. 从数据库的所有表中删除所有行
- 15. 所有数据有删除
- 16. 根据空白单元格删除整行的最快方法
- 17. 从表中删除所有重复行的最有效方法是什么?
- 18. 删除页面中所有样式的最简单方法
- 19. 删除表的最快方法(如果存在)
- 20. 删除表格内容的最快方法
- 21. 使用连接快速删除记录的最有效方法?
- 22. 使用jQuery,什么是最有效的方法一次删除一个HTML表中的所有数据行?
- 23. 什么是删除我所有blobstore数据的最简单方法?
- 24. 从大量ASCII文件中读取数据的最快方法
- 25. 在Android中查询大型数据集的最快方法
- 26. 从列名列表中删除大熊猫数据框中的列的最快方式是什么
- 27. 什么是删除模型对象数组的最快方法?
- 28. 删除数百万个文件的最快方法
- 29. 从sqlite数据库中删除除最新500行以外的所有数据
- 30. 删除datagridview中的所有数据
TRUNCATE是最快的,只要记住,在事件发生的时候你将无法回滚数据。 – 2008-09-15 15:50:52
有关TRUNCATE的说明,如果其中一列是IDENTITY列,则TRUNCATE会将该列的SEED重置为其初始值(定义表时指定的一个值)。所以从某种意义上说,它就像是从一张全新的桌子开始。我发现它在重新填充表之前清理数据很有用 – kristof 2008-09-23 16:53:09
是的,而在Oracle世界中我们称之为水印转换,并不确定其他人。 – 2008-12-30 09:55:11