ฉันได้รับทริกเกอร์ UPDATE ในตารางที่เฝ้าดูคอลัมน์ที่เฉพาะเจาะจงเปลี่ยนจากค่าหนึ่งไปเป็นค่าอื่น ๆ เมื่อสิ่งนี้เกิดขึ้นมันจะอัพเดทข้อมูลที่เกี่ยวข้องในตารางอื่นผ่านคำสั่ง UPDATE เดียว
สิ่งแรกที่ทริกเกอร์ทำการตรวจสอบเพื่อดูว่าแถวที่อัพเดตมีค่าของคอลัมน์นี้เปลี่ยนจากค่าที่เป็นปัญหาหรือไม่ มันจะรวมเข้ากับ INSERTED เพื่อลบและเปรียบเทียบค่าในคอลัมน์นั้น หากไม่มีสิ่งใดที่มีคุณสมบัติมันจะออกไปก่อนกำหนดดังนั้นคำสั่ง UPDATE จะไม่ทำงาน
IF NOT EXISTS (
SELECT TOP 1 i.CUSTNMBR
FROM INSERTED i
INNER JOIN DELETED d
ON i.CUSTNMBR = d.CUSTNMBR
WHERE d.CUSTCLAS = 'Misc'
AND i.CUSTCLAS != 'Misc'
)
RETURN
ในกรณีนี้ CUSTNMBR เป็นคีย์หลักของตารางต้นแบบ หากฉันอัปเดตจำนวนมากในตารางนี้ (พูด, 5,000+ แถว) ข้อความนี้ใช้เวลา AGES แม้ว่าฉันจะไม่ได้แตะคอลัมน์ CUSTCLAS ฉันสามารถดูมันค้างบนคำสั่งนี้เป็นเวลาหลายนาทีใน Profiler
แผนการดำเนินการเป็นที่แปลกประหลาด มันแสดงให้เห็นถึงการสแกนแทรกด้วยการประมวลผล 3,714 และแถวเอาท์พุท ~ 18.5 ล้าน ที่ไหลผ่านตัวกรองในคอลัมน์ CUSTCLAS มันจะรวมสิ่งนี้ (ผ่านลูปซ้อนกัน) ไปยังการสแกนที่ถูกลบ (ยังกรองใน CUSTCLAS) ซึ่งดำเนินการเพียงครั้งเดียวและมี 5,000 แถวเอาต์พุต
ฉันกำลังทำสิ่งที่งี่เง่าที่นี่เพื่อทำให้เกิดสิ่งนี้? โปรดทราบว่าทริกเกอร์ต้องจัดการอัพเดตหลายแถวอย่างถูกต้อง
แก้ไข :
ฉันยังพยายามเขียนแบบนี้ (ในกรณีที่ EXISTS ทำสิ่งที่ไม่พึงประสงค์) แต่มันก็ยังแย่มาก
DECLARE @CUSTNMBR varchar(31)
SELECT TOP 1 @CUSTNMBR = i.CUSTNMBR
FROM INSERTED i
INNER JOIN DELETED d
ON i.CUSTNMBR = d.CUSTNMBR
WHERE d.CUSTCLAS = 'Misc'
AND i.CUSTCLAS != 'Misc'
IF @CUSTNMBR IS NULL
RETURN