【发布时间】: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怎么样? -
截断只会通过清除所有值来保留表的骨架。确保它没有任何约束
标签: sql-server stored-procedures