2013-07-09 96 views
0

我想從一個有2000萬條記錄的巨大表中使用T-SQL刪除幾千條記錄。該表根據它有大約20個觸發器,並且全部指的是或多或少相似的巨大表格。即使使用標識列值,刪除也需要很長時間。如何在不禁用觸發器的情況下刪除這些記錄,或者必須禁用最小數量的觸發器?請幫忙。從大約20個觸發器的表中刪除記錄 - SQL

+6

爲什麼你需要一個桌子上的20個觸發器? –

+1

'如何在不禁用觸發器的情況下刪除這些記錄:刪除記錄。等待。 '或者不得不禁用最少數量的觸發器':找出哪些觸發器可以在刪除過程中安全關閉,同時保持系統的數據完整性。關閉它們,刪除記錄,然後重新打開它們。我不是諷刺;我們無法幫助您,因爲我們不知道您的數據庫中發生了什麼。 –

+1

你是說你想刪除這些記錄而不關閉觸發器,但你需要繞過它們?在我推薦任何東西之前,我需要更多的信息。有機會你有這些觸發器的原因,並可能不想繞過它們。 – Zane

回答

0

請嘗試以下

添加以下SPS

Create PROCEDURE [dbo].[sysUserContextSet] --#1 

@user_name varchar(14), 
@terminal varchar(10) = NULL 
AS 
SET NOCOUNT ON 
SET ANSI_WARNINGS OFF 

declare @context varbinary(128) 

set @context = CONVERT(varbinary(128), isNull(@user_name,'') + SPACE(14 - len(isNull(@user_name,'')))+ isNull(@terminal, '') + space(10 - len(isNull(@terminal, '')))) 
set context_info @context 



Create PROCEDURE [dbo].[sysUserContextClear] --#2 
AS 
SET NOCOUNT ON 
SET ANSI_WARNINGS OFF 
DELETE FROM sysUserContext WITH (ROWLOCK) WHERE [email protected]@SPID 



    exec sysuserContextSet 'username' 
    delete ... 
    exec sysuserContextClear 
0

對我來說,這聽起來像你的問題是與它正在刪除這些行的時間。

我同意贊恩,觸發器是有原因的,我不會禁用它們。

觸發器是否花時間?你能做任何事情來加速觸發器嗎?

你用來識別和刪除初始行的sql是什麼?

我遇到了更新類似的問題。我最終分批進行了更新。你可以批量刪除

1

我曾經爲刪除數據的類似問題。我在桌上有三億六千萬行。它有「A」刪除觸發器來執行參照完整性。我試圖刪除約6000萬條記錄。我可以採用兩種方法,禁用刪除觸發器或限制一次嘗試刪除的刪除數。我必須一次限制刪除10000個記錄。我認爲這與不會超載tranlog有關。

0

這些觸發器是有原因的。禁用它們是一個糟糕的主意。

我會做的是首先看看觸發器,以確保它們以基於集合的方式運行(如果您在觸發器中逐行進行操作,那麼無論如何,幾千條記錄都需要很長時間

假設您的觸發器都被正確寫入,您可能還會遇到級聯刪除或FKs的問題,這些問題需要您在多個表中查找子記錄(我們有一個包含超過100個FK來檢查)如果你不能加速觸發器,那麼最好的辦法是在一個循環中小批量地工作,爲循環中的每一輪提交事務,這樣表就不會被鎖定,然後如果可能的話,在關閉期間進行處理小時。受影響的FK表越多,您需要一次處理的批量越小。

或者您可以設計您的數據庫以進行軟刪除(將記錄標記爲不活動,然後克里特僅顯示活動記錄的視圖)。這樣你就不必刪除了。