清除 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 表的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将数据插入 Oracle 表的最快方法是啥?

清除具有大量形状/多线程的组的最快方法

获取临时表的结构(如生成 sql 脚本)并清除当前实例的临时表

SQL 清除数据库中所有表的数据

excel中清除的快捷键是啥,excel表格中清除的快捷键是啥?

更新表的多行的最快方法是啥