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)
清除表的最佳方法是使用TRUNCATE.
由于您正在创建和丢弃,因此假设您没有约束.
TRUNCATE TABLE <target table>
Run Code Online (Sandbox Code Playgroud)
一些优点:
- 使用较少的事务日志空间.
DELETE语句一次删除一行,并在事务日志中为每个已删除的行记录一个条目.TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中记录页面解除分配.
- 通常使用较少的锁.
使用行锁执行DELETE语句时,表中的每一行都被锁定以进行删除.TRUNCATE TABLE总是锁定表(包括模式(SCH-M)锁)和页面,但不是每行.
- 毫无例外,表格中留有零页面.
执行DELETE语句后,表仍可以包含空页.例如,如果没有至少一个独占(LCK_M_X)表锁,则无法释放堆中的空页.如果删除操作不使用表锁,则表(堆)将包含许多空页.对于索引,删除操作可以留下空页,尽管这些页面将通过后台清理过程快速释放.
| 归档时间: |
|
| 查看次数: |
10854 次 |
| 最近记录: |