Belirli bir sütundan belirli bir değerden başka bir değere değişen belirli bir sütunu izleyen bir tabloda bir GÜNCELLEME tetikleyicim var. Bu durumda, tek bir UPDATE deyimi aracılığıyla başka bir tablodaki bazı ilgili verileri güncelleştirir.
Tetikleyicinin yaptığı ilk şey, güncellenmiş satırların bu sütunun değerinin söz konusu değerden değiştirilip değiştirilmediğini kontrol etmektir. INSERTED ile DELETED arasına katılır ve bu sütundaki değeri karşılaştırır. Hiçbir şey uygun değilse, UPDATE deyimi çalışmaz, bu yüzden erken kurtarır.
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
Bu durumda, CUSTNMBR temel alınan tablonun birincil anahtarıdır. Bu tabloda (5000+ satır gibi) büyük bir güncelleme yaparsam, CUSTCLAS sütununa dokunmamış olsam bile, bu ifade YAŞ alır. Profiler'de birkaç dakika boyunca bu açıklamada durmasını izleyebilirim.
Uygulama planı tuhaf. 3.714 yürütme ve ~ 18.5 milyon çıkış satırı içeren bir Eklenmiş Tarama gösterir. Bu, CUSTCLAS sütunundaki bir filtreden geçer. Bunu (iç içe döngü aracılığıyla) yalnızca bir kez yürüten ve 5000 çıkış satırı olan Silinmiş Tarama'ya (CUSTCLAS üzerinde de filtrelenir) birleştirir.
Buna neden olmak için burada ne aptalca bir şey yapıyorum? Tetikleyicinin çok satırlı güncellemeleri kesinlikle doğru şekilde işlemesi gerektiğini unutmayın.
DÜZENLE :
Ayrıca böyle yazmayı denedim (EXISTS'in hoş olmayan bir şey yapması durumunda), ama yine de korkunç.
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