हम एक सर्वर का समस्या निवारण कर रहे हैं जिसमें उच्च CPU उपयोग है। यह जानने के बाद कि प्रश्न वास्तव में पैदा नहीं कर रहे थे, हमने संकलन देखना शुरू किया।
प्रदर्शन मॉनीटर 50 संकलनों / सेकंड से कम और 15 पुनरावर्ती / सेकंड से कम दिखा रहा है।
संकलन की तलाश में XE सत्र चलाने के बाद, हम प्रति सेकंड हजारों संकलन देख रहे हैं।
यह प्रणाली ऑडिट परिवर्तनों के लिए ट्रिगर का उपयोग कर रही है। अधिकांश संकलन ट्रिगर के कारण होते हैं। ट्रिगर संदर्भ sysinos_tran_active_transactions।
हमारा पहला विचार यह था कि शायद एक ट्रिगर में DMV को संदर्भित करने से यह हर बार संकलित हो जाएगा, या शायद यह विशिष्ट DMV इसका कारण होगा। इसलिए मैंने उस सिद्धांत का परीक्षण शुरू किया। यह प्रत्येक बार संकलित करता है, लेकिन मैंने यह नहीं जांचा था कि ट्रिगर हर बार ट्रिगर होने पर संकलित होता है जब यह DMV को संदर्भित नहीं करता है और इसके बजाय एक मान को हार्डकोड करता है। यह ट्रिगर होने पर भी हर बार संकलन कर रहा था। ट्रिगर छोड़ने से संकलन बंद हो जाता है।
- हम संकलनों को ट्रैक करने के लिए एक XE सत्र में sqlserver.query_pre_execution_showplan का उपयोग कर रहे हैं। क्यों वहाँ और PerfMon काउंटर के बीच एक विसंगति है?
- क्या यह सामान्य है कि आपको ट्रिगर रन के दौरान हर बार एक संकलन घटना मिलती है?
रेप्रो स्क्रिप्ट:
CREATE TABLE t1 (transaction_id int, Column2 varchar(100));
CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100));
GO
CREATE TRIGGER t2_ins
ON t2
AFTER INSERT
AS
INSERT INTO t1
SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2
FROM inserted;
GO
--Both of these show compilation events
INSERT INTO t2 VALUES ('row1', 'value1');
INSERT INTO t2 VALUES ('row2', 'value2');
GO
ALTER TRIGGER t2_ins
ON t2
AFTER INSERT
AS
INSERT INTO t1
SELECT 1000, Column2
FROM inserted;
GO
--Both of these show compilation events
INSERT INTO t2 VALUES ('row3', 'value3');
INSERT INTO t2 VALUES ('row4', 'value4');
DROP TRIGGER t2_ins;
--These do not show compilation events
INSERT INTO t2 VALUES ('row5', 'value5');
INSERT INTO t2 VALUES ('row6', 'value6');
DROP TABLE t1, t2;