sql-server - 提高 SQL Server 中触发器的性能
问题描述
我不是数据库专家,但我需要一些帮助,以确保我们用来跟踪表更新的触发器是处理我们的情况的最佳方式,并且按应有的方式执行。加载触发器后,我们注意到实际业务系统(用户端)的性能有些慢。
背景:我们正在尝试捕获发生交易的日期/时间,以便可以在我们网站的客户门户上引用它。
理论:触发器监视对“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
触发器有效,但它似乎会导致问题并减慢实际用户体验。感谢您对调整我们所做工作的任何帮助,如果您有任何问题,请随时提问。谢谢。
解决方案
您应该使用显式join
s:
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;
为提高性能,您需要 s 中使用的列的索引JOIN
,按以下顺序:
TEST.dbo.rentdetl(kpart, kbanch, kordnum)
TEST.dbo.equip(kequipnum)
TEST.dbo.renthead(kbranch, kbanch, program)
推荐阅读
- c - 在函数中使用预定义数量的参数时避免使用全局变量
- android - 当我放入每 10 秒调用一次的处理程序时,Android BLE BluetoothGatt.readCharacteristic 返回相同的值
- c# - 我可以在 C# LINQ 中创建一个通用的 GroupBy() 吗?
- mysql - 检查密码哈希在烧瓶mysql中不起作用
- javascript - 编剧用Keycloak测试网站,找不到通过pageObjectModel登录的方法
- node.js - nodejs mongoose查找带参数的查询不起作用,返回null
- node.js - Nest.js 与 AWS Cognito,如何访问用户属性
- go - 在作为函数参数传递时修改 http.ResponseWriter
- php - COUNT 字段不正确或语法错误(无占位符或 PDO)
- ios - 允许在 Apple Silicon Mac 的“Designed for iPad”应用程序上调整大小