2012-09-27 149 views
2

在我們的應用程序在數據庫級別,我有一個表架構計費和Billing_History中的分期付款。SQL插入/更新/刪除觸發效率

顯示的觸發器位於賬單模式的分期付款表中。

這樣做是每次在計費架構中插入/更新記錄時,它也會寫入歷史記錄文件中。

如果記錄從記帳表中被刪除,它將被寫入歷史記錄表,其中「已刪除」指示符= true。

我認爲,「如果不存在(從安裝選擇*)被殺死了我的表現,更多的記錄得到補充。

有沒有更effecient是寫這個觸發器?

Create TRIGGER [Billing].[Installments_InsertDeleteUpdate_History] 
ON [Billing].[Installments] 
AFTER INSERT, DELETE, UPDATE 
AS BEGIN 
Insert Into Billing_History.Installments 
    Select *, GetDate(), 0 From Inserted 

If Not Exists (Select * From Inserted) 
    Insert Into Billing_History.Installments 
     Select *, GetDate(), 1 From Deleted 

SET NOCOUNT ON; 

-- Insert statements for trigger here 

END

+0

建議您爲正在使用的RDBMS添加標籤。 – Smandoli

+0

'如果不存在(選擇*從插入)'不會損害您的性能,但您可以用'IF @@ ROWCOUNT> 0'檢查替換它以獲得相同的語義。 –

+1

在插入中選擇*是非常糟糕的做法。 – HLGEM

回答

1

因爲它是必需的任務,所以我建議您具有的觸發器表現最好。實際上沒有更好的方法來實現相同的審計結果。

答案在這裏會同意Creating audit triggers in SQL Server和這裏是long discussion關於審計解決方案的性能。

您的情況稍有不同,因爲您實際上不希望在UPDATE情況下刪除(原始)表,因此IF。

+0

感謝所有的評論。在這一點上,我不認爲有足夠的令人信服的證據來改變/消除觸發器。我將尋找其他地方獲得性能提升。 – AWeim

0

創建插入和更新的一個觸發並刪除第二個,然後你不必使用IF語句和慢查詢以檢查記錄。

從設計的角度來看,看看你是否可以消除觸發器。他們一團糟。

+0

'IF EXISTS(...)'不是一個慢速查詢。如果OP出現性能問題,我建議他們看看其他地方的說明。 –

+0

@MartinSmith我認爲你是對的。話雖如此,使用多個觸發器來消除不必要的IF,IMO仍然有意義。 –

0

那麼你可以把這個簡單的變化:

Create TRIGGER [Billing].[Installments_InsertDeleteUpdate_History] 
ON [Billing].[Installments] 
AFTER INSERT, DELETE, UPDATE 
AS BEGIN 

If Not Exists (Select * From Inserted) 
    Insert Into Billing_History.Installments 
     Select *, GetDate(), 1 From Deleted 
ELSE 
    Insert Into Billing_History.Installments 
     Select *, GetDate(), 0 From Inserted 

SET NOCOUNT ON; 

-- Insert statements for trigger here 

這是邏輯更有效,但無論是物理更好的性能是一個懸而未決的問題。如果它實際上更快,那肯定不會太多。