2009-01-14 60 views
2

這裏是我的情況:MS-SQL 2000:存儲過程中關閉日誌

我有一個簡單的存儲過程,從表中刪除一組特定的行(我們會說大約30K行),然後插入大約相同數量的行。這通常應該只需要幾秒鐘;然而,表上有一個觸發器,用於監視插入/刪除操作,並試圖模仿另一臺服務器上的鏈接表發生了什麼。

由於觸發器的原因,該過程反過來非常緩慢,並且在此過程中表格也被鎖定。所以這裏是我的兩個問題:

  1. 我猜測減速的一個體面的部分是由於事務日誌。有沒有辦法讓我在我的存儲過程中指定我不想記錄過程中的內容?
  2. 有沒有一種方法可以讓我在整個過程中不用鎖定表而執行'DELETE FROM'和'INSERT INTO'命令?

謝謝!

編輯 - 感謝您的答案;我認爲是這種情況(不能夠做到上述任何一種),但想確保。觸發器很早以前就創建好了,而且看起來效果不是很好,所以看起來我的下一步將是進入並找出需要什麼以及如何改進。謝謝!

回答

2

1)沒有,也你是不是做像截斷或BULK INSERT最低限度記錄操作

2)不,你會怎麼防止腐敗,否則?

1

我不會自動假設性能問題是由於日誌記錄造成的。事實上,觸發器可能會導致性能問題。我鼓勵您修改原始問題並顯示觸發器的代碼。

1

修改數據時,您無法關閉事務完整性。當您使用表(nolock)中的select *選擇數據時,您可以忽略鎖定;但是,您需要非常小心,並確保您的應用程序可以處理髒讀操作。

1

它對您的觸發器沒有幫助,但鎖定問題的解決方案是以較小的批次執行事務。

而不是

DELETE FROM Table WHERE <Condition> 

這樣做

WHILE EXISTS (SELECT * FROM table WHERE <condition to delete>) 
BEGIN 
    SET ROWCOUNT 1000 
    DELETE FROM Table WHERE <Condition> 
    SET ROWCOUNT 0 
END 
1

您可以暫時禁用觸發器,運行PROC,然後爲所欲爲觸發是做一個更有效的方式。

-- disable trigger 
ALTER TABLE [Table] DISABLE TRIGGER [Trigger] 
GO 

-- execute your proc 
EXEC spProc 
GO 

-- do more stuff to clean up/sync with other server 
GO 

-- enable trigger 
ALTER TABLE [Table] ENABLE TRIGGER [Trigger] 
GO