เรากำลังแก้ไขปัญหาเซิร์ฟเวอร์ที่มีการใช้งาน CPU สูง หลังจากพบว่าคำค้นหาไม่ได้เป็นสาเหตุของปัญหาจริงๆเราเริ่มมองหาการรวบรวม
การตรวจสอบประสิทธิภาพแสดงน้อยกว่า 50 การคอมไพล์ / วินาทีและน้อยกว่า 15 การคอมไพล์ / วินาที
หลังจากใช้งานเซสชัน XE เพื่อค้นหาการรวบรวมเราจะเห็นการรวบรวมนับพันต่อวินาที
ระบบนี้ใช้ทริกเกอร์เพื่อตรวจสอบการเปลี่ยนแปลง การรวบรวมส่วนใหญ่เกิดจากทริกเกอร์ ทริกเกอร์การอ้างอิง sys.dm_tran_active_transactions
ความคิดแรกของเราคือการอ้างอิง DMV ในทริกเกอร์อาจทำให้คอมไพล์ในแต่ละครั้งหรืออาจเป็นเพียง DMV ที่เจาะจงนี้จะทำให้เกิดขึ้น ดังนั้นฉันจึงเริ่มทดสอบทฤษฎีนั้น มันจะรวบรวมในแต่ละครั้ง แต่ฉันไม่ได้ตรวจสอบว่ามีการทริกเกอร์รวบรวมในแต่ละครั้งจะถูกเรียกเมื่อมันไม่ได้อ้างอิง DMV และแทน hardcodes ค่า มันยังคงรวบรวมทุกครั้งที่มันถูกเรียก การปล่อยไกหยุดการรวบรวม
- เรากำลังใช้ sqlserver.query_pre_execution_showplan ในเซสชั่น XE เพื่อติดตามการคอมไพล์ ทำไมจึงมีความคลาดเคลื่อนระหว่างสิ่งนั้นกับตัวนับ PerfMon
- เป็นเรื่องปกติหรือไม่ที่คุณได้รับเหตุการณ์การคอมไพล์ทุกครั้งที่ทริกเกอร์รัน?
สคริปต์ Repro:
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;