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

时间:2015-07-13 15:39:20

标签: 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

这花了将近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

1 个答案:

答案 0 :(得分:6)

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

因为你正在创建和丢弃,所以假设你没有约束。

TRUNCATE TABLE <target table>

一些优点:

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

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

     
      
  • 通常使用较少的锁。
  •   
     

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

     
      
  • 无一例外,表格中都留有零页。
  •   
     

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