本文介紹了如何刪除 SQL 2005 中的記錄以檢查事務日志的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在運行以下存儲過程來刪除大量記錄.我知道 DELETE 語句寫入事務日志,刪除多行會使日志增長.
I am running the following stored procedure to delete large number of records. I understand that the DELETE statement writes to the transaction log and deleting many rows will make the log grow.
我已經研究了創建表和插入記錄以保留然后截斷源的其他選項,這種方法對我不起作用.
I have looked into other options of creating tables and inserting records to keep and then Truncating the source, this method will not work for me.
如何使下面的存儲過程更高效,同時確保事務日志不會出現不必要的增長?
CREATE PROCEDURE [dbo].[ClearLog]
(
@Age int = 30
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- DELETE ERRORLOG
WHILE EXISTS ( SELECT [LogId] FROM [dbo].[Error_Log] WHERE DATEDIFF( dd, [TimeStamp], GETDATE() ) > @Age )
BEGIN
SET ROWCOUNT 10000
DELETE [dbo].[Error_Log] WHERE DATEDIFF( dd, [TimeStamp], GETDATE() ) > @Age
WAITFOR DELAY '00:00:01'
SET ROWCOUNT 0
END
END
推薦答案
我會這樣做:
CREATE PROCEDURE [dbo].[ClearLog] (
@Age int = 30)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @d DATETIME
, @batch INT;
SET @batch = 10000;
SET @d = DATEADD( dd, -@Age, GETDATE() )
WHILE (1=1)
BEGIN
DELETE TOP (@batch) [dbo].[Error_Log]
WHERE [Timestamp] < @d;
IF (0 = @@ROWCOUNT)
BREAK
END
END
- 使時間戳比較 SARGable
- 在批處理開始時分離 GETDATE() 以產生一致的運行(否則它會在無限循環中阻塞,因為新記錄隨著舊記錄被刪除而老化").
- 使用 TOP 而不是 SET ROWCOUNT(已棄用:
使用 SET ROWCOUNT 不會影響下一版本 SQL Server 中的 DELETE、INSERT 和 UPDATE 語句.
) - 檢查@@ROWCOUNT 以打破循環而不是多余的 SELECT
這篇關于如何刪除 SQL 2005 中的記錄以檢查事務日志的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!
【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!