清除 SQL 表的最快方法是啥?
Posted
技术标签:
【中文标题】清除 SQL 表的最快方法是啥?【英文标题】:What is the fastest way to clear a SQL table?清除 SQL 表的最快方法是什么? 【发布时间】:2015-07-13 15:39:19 【问题描述】:我有一个大约 300,000 行和 30 列的表。我怎样才能快速清除它?如果我执行DROP FROM MyTable
查询,则需要很长时间才能运行。我正在尝试以下存储过程,基本上是复制没有数据的表,删除原始表,并将新表重命名为原始表:
USE [myDatabase]
GO
SET ANSI_NULLS_ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ClearTheTable]
AS
BEGIN
SET NOCOUNT ON;
SELECT * INTO tempMyTable FROM MyTable WHERE 1 = 0;
DROP TABLE MyTable
EXEC sp_rename tempMyTable, MyTable;
END
这需要将近 7 分钟才能运行。有更快的方法吗?我不需要任何日志记录、回滚或任何类似性质的东西。
如果重要,我将从 C# 应用程序调用存储过程。我想我可以在执行DROP TABLE
之后编写一些代码从头开始重新创建表,但我不想在添加或更改列时重新编译应用程序。
谢谢!
编辑
这是我更新的存储过程:
USE [myDatabase]
GO
SET ANSI_NULLS_ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ClearTheTable]
AS
BEGIN
SET NOCOUNT ON;
ALTER DATABASE myDatabase
SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
TRUNCATE TABLE MyTable
ALTER DATABASE myDatabase
SET MULTI_USER
END
【问题讨论】:
用TRUNCATE
怎么样?
截断只会通过清除所有值来保留表的骨架。确保它没有任何约束
***.com/questions/24213299/…
【参考方案1】:
清除表的最佳方法是使用TRUNCATE。
由于您正在创建和删除,因此假设您没有任何限制。
TRUNCATE TABLE <target table>
一些优点:
使用的事务日志空间更少。DELETE 语句一次删除一行并记录一个条目 在每个已删除行的事务日志中。 TRUNCATE TABLE 删除 通过释放用于存储表数据的数据页来获取数据 并且只在事务日志中记录页面释放。
通常使用较少的锁。当使用行锁执行 DELETE 语句时,每一行在 该表被锁定以进行删除。 TRUNCATE TABLE 总是锁定 表(包括模式 (SCH-M) 锁)和页,但不是每一行。
无一例外,表格中剩下零页。在执行 DELETE 语句后,表仍然可以包含 空白页。例如,堆中的空页不能被释放 至少没有排他(LCK_M_X)表锁。如果删除 操作不使用表锁,表(堆)将包含 许多空白页。对于索引,删除操作可以留空 后面的页面,尽管这些页面将被快速释放 后台清理进程。
【讨论】:
感谢您的建议。听起来应该很容易,但运行TRUNCATE TABLE myTable;
已经运行了 30 多分钟。没有外键,但有 3 个索引,如果有区别的话。
看来我的问题是由于在 MS Access 中打开了一个链接表。我通过执行SET RESTRICTED_USER
解决了这个问题,运行截断,然后运行SET MULTI_USER
。效果很好!
根据这个页面:techonthenet.com/sql/truncate.phpTRUNCATE不能回滚,但DELETE可以。那么这不是让 DELETE 成为更安全的选择吗?
更安全,是的。但就速度而言,它是最佳选择。以上是关于清除 SQL 表的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
获取临时表的结构(如生成 sql 脚本)并清除当前实例的临时表