提高SQL Server中触发器的性能

问题描述 投票:0回答:2

我不是数据库专家,但是我需要一些帮助,以确保我们用来跟踪表更新的触发器是处理我们的情况的最佳方法,并且可以按预期方式执行。加载触发器后,我们注意到实际业务系统(用户端)的性能有所下降。

背景:我们正在尝试捕获发生的交易的日期/时间,以便可以在我们网站的客户门户网站上引用它。

[理论:触发器监视对“ PI”的列的更新,如果发生,它将数据写入到表中,该表提供了来自其他2个与更新有关的表的一些基本信息。

表1列

RH.kbranch, RH.kordnum, RH.kcustnum, RH.custsnum, RH.[program]

表2列

RD.kbranch, RD.kordnum, RD.kpart

表3列(附加触发器的地方)

EQ.kequipnum, EQ.eqpstatus

触发器

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[PICKUPTrigger] 
ON [TEST].[dbo].[equip]
FOR UPDATE
AS  
    IF (SELECT eqpstatus FROM inserted) = 'PI'
    BEGIN
        SET NOCOUNT ON

        INSERT INTO [Workfiles].[dbo].[PickupAudit] ([HHBranch],[HHOrder],[HHCustomer], [HHShipTo], [EquipID], [EQStatus], [PickupNo], [StatusDate])
            SELECT 
                RH.kbranch, RH.kordnum, RH.kcustnum, RH.custsnum, 
                RD.kpart, EQ.eqpstatus, RH.[program], GETDATE()
            FROM 
                TEST.dbo.renthead RH
            JOIN 
                TEST.dbo.rentdetl RD ON RH.kbranch = RD.kbranch 
                                     AND RH.kordnum = RD.kordnum 
                                     AND RH.program NOT LIKE 'OPSS%'
            JOIN 
                TEST.dbo.equip EQ ON EQ.kequipnum = RD.kpart
            WHERE 
                RD.kpart = (SELECT kequipnum FROM inserted);
END

触发器有效,但似乎引起问题并减慢了实际的用户体验。我们非常感谢您调整我们所做的工作,如果您有任何疑问,请随时提出。谢谢。

sql-server tsql database-trigger
2个回答
0
投票
INSERT INTO [Workfiles].[dbo].[PickupAudit] ([HHBranch],[HHOrder],[HHCustomer],[HHShipTo],[EquipID],[EQStatus],[PickupNo],[StatusDate]) SELECT RH.kbranch, RH.kordnum, RH.kcustnum, RH.custsnum, RD.kpart, EQ.eqpstatus, RH.[program], GETDATE() FROM TEST.dbo.renthead RH JOIN TEST.dbo.rentdetl RD ON RH.kbranch = RD.kbranch AND RH.kordnum = RD.kordnum AND RH.program NOT LIKE 'OPSS%' JOIN TEST.dbo.equip EQ ON EQ.kequipnum = RD.kpart JOIN inserted i ON RD.kpart = i.kequipnum;

为了提高性能,您希望按以下顺序在JOIN中使用的列上建立索引:

TEST.dbo.rentdetl(kpart, kbanch, kordnum)

    TEST.dbo.equip(kequipnum)
  • TEST.dbo.renthead(kbranch, kbanch, program)

0
投票
获得更好性能的解决方案是创建“索引视图”,而不仅仅是“视图”并在触发器中使用它,您将看到剧烈的影响
© www.soinside.com 2019 - 2024. All rights reserved.