我有一张包含约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
答案 0 :(得分:6)
清除表格的最佳方法是使用TRUNCATE。
因为你正在创建和丢弃,所以假设你没有约束。
TRUNCATE TABLE <target table>
一些优点:
- 使用较少的事务日志空间。
DELETE语句一次删除一行并记录一个条目 在每个已删除行的事务日志中。 TRUNCATE TABLE删除 通过释放用于存储表数据的数据页来获取数据 并仅记录事务日志中的页面解除分配。
- 通常使用较少的锁。
使用行锁执行DELETE语句时,每行都有 该表被锁定以进行删除。 TRUNCATE TABLE总是锁定 表(包括模式(SCH-M)锁)和页面但不是每一行。
- 无一例外,表格中都留有零页。
执行DELETE语句后,表仍然可以包含 空页。例如,无法释放堆中的空页 没有至少一个独占(LCK_M_X)表锁。如果删除 操作不使用表锁,表(堆)将包含 很多空页。对于索引,删除操作可以留空 后面的页面,虽然这些页面将被快速解除分配 后台清理过程。