清除SQL表的最快方法是什么?

Jef*_*ady 6 sql-server stored-procedures

我有一个大约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
Run Code Online (Sandbox Code Playgroud)

这花了将近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
Run Code Online (Sandbox Code Playgroud)

mxi*_*xix 8

清除表的最佳方法是使用TRUNCATE.

由于您正在创建和丢弃,因此假设您没有约束.

TRUNCATE TABLE <target table>
Run Code Online (Sandbox Code Playgroud)

一些优点:

  • 使用较少的事务日志空间.

DELETE语句一次删除一行,并在事务日志中为每个已删除的行记录一个条目.TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中记录页面解除分配.

  • 通常使用较少的锁.

使用行锁执行DELETE语句时,表中的每一行都被锁定以进行删除.TRUNCATE TABLE总是锁定表(包括模式(SCH-M)锁)和页面,但不是每行.

  • 毫无例外,表格中留有零页面.

执行DELETE语句后,表仍可以包含空页.例如,如果没有至少一个独占(LCK_M_X)表锁,则无法释放堆中的空页.如果删除操作不使用表锁,则表(堆)将包含许多空页.对于索引,删除操作可以留下空页,尽管这些页面将通过后台清理过程快速释放.

  • 看来我的问题是由于在MS Access中打开了链接表.我通过执行`SET RESTRICTED_USER`,运行truncate,然后是'SET MULTI_USER`来解决这个问题.工作得很好! (2认同)