【发布时间】:2023-03-10 11:04:02
【问题描述】:
我很难理解我在 SQL Server 2008 中看到的行为。
我必须创建一个作业,以一种不会创建任何锁的方式删除表内的一些数据。我被建议使用循环来解决这个问题,因为这些表被大量使用并且非常大。
所以以下运行完美,当我自己运行时,查询不会锁定数据库:
DECLARE @pkQ BIGINT
DECLARE DEL_CURSOR CURSOR STATIC FOR Select PK from Table1 where Inserted_Date <= DateAdd(WEEK, -1, Getdate()) order by PK desc
OPEN DEL_CURSOR
FETCH NEXT FROM DEL_CURSOR into @pkQ
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE TOP(10) from Table1 where PK <= @pkQ
FETCH NEXT FROM DEL_CURSOR into @pkQ
PRINT '10 deleted from Table1'
WaitFor DELAY '00:00:01'
END
CLOSE DEL_CURSOR
DEALLOCATE DEL_CURSOR
PRINT 'Cursor Closed'
但是,如果我有 2 个不同的光标,它就会中断。
DECLARE @pkQ BIGINT
DECLARE DEL_CURSOR CURSOR STATIC FOR Select PK from Table1 where Inserted_Date <= DateAdd(WEEK, -1, Getdate()) order by PK desc
OPEN DEL_CURSOR
FETCH NEXT FROM DEL_CURSOR into @pkQ
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE TOP(10) from Table1 where PK <= @pkQ
FETCH NEXT FROM DEL_CURSOR into @pkQ
PRINT '10 deleted from Table1'
WaitFor DELAY '00:00:01'
END
CLOSE DEL_CURSOR
DEALLOCATE DEL_CURSOR
PRINT ''Cursor Closed''
print N'In SecondCursor'
DECLARE DEL_CURSORR CURSOR FOR Select top 1000 PK from Table2 where Insert_Date < DateAdd(Month, -6, Getdate()) order by PK desc
OPEN DEL_CURSORR
FETCH NEXT FROM DEL_CURSORR into @pkQ
WHILE @@FETCH_STATUS = 0
BEGIN
WAITFOR DELAY '00:00:02'
Delete top(10) from Table2 where PK <= @pkQ
FETCH NEXT FROM DEL_CURSORR into @pkQ
WaitFor DELAY '00:00:01'
PRINT '10 deleted from Table2'
END
CLOSE DEL_CURSORR
DEALLOCATE DEL_CURSORR
当我同时运行并尝试查询 table1 或 table2 中的任何内容时,它只是被锁定。
【问题讨论】:
-
根据您的总记录数,那些
WAITFOR延迟肯定会受到伤害。只有 30k 行,这是 50 分钟的空闲时间。 -
“我必须创建一个作业,以一种不会创建任何锁的方式删除表中的一些数据。” 你不能......你一直在给出一个无意义的要求。执行此类过程的一部分意味着行必须被锁定以进行删除。此外,任何页面和索引都需要更新,这可能会导致锁定。
-
我的意思是应用程序必须能够在作业运行时询问表。我知道要删除,必须有一个锁。我刚刚尝试了“With (Rowlock),但没有取得多大成功。
标签: sql sql-server tsql sql-server-2008