2012-09-27 101 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 

这是逻辑更有效,但无论是物理更好的性能是一个悬而未决的问题。如果它实际上更快,那肯定不会太多。