Kami memecahkan masalah server yang memiliki utilisasi CPU tinggi. Setelah menemukan bahwa pertanyaan tidak benar-benar menyebabkannya, kami mulai mencari kompilasi.
Monitor Kinerja menunjukkan kurang dari 50 Kompilasi / detik dan kurang dari 15 Kompilasi / detik.
Setelah menjalankan sesi XE mencari kompilasi, kami melihat ribuan kompilasi per detik.
Sistem ini menggunakan pemicu untuk mengaudit perubahan. Sebagian besar kompilasi disebabkan oleh pemicu. Pemicu sys.dm_tran_active_transactions referensi.
Pikiran pertama kami adalah bahwa mungkin merujuk DMV di pemicu akan membuatnya mengkompilasi setiap kali, atau mungkin hanya DMV spesifik ini yang akan menyebabkannya. Jadi saya mulai menguji teori itu. Itu mengkompilasi setiap kali, tapi saya belum memeriksa apakah pemicu mengkompilasi setiap kali dipicu ketika itu tidak mereferensikan DMV dan bukan hardcodes nilai. Itu masih mengkompilasi setiap kali dipicu. Menjatuhkan pelatuk menghentikan kompilasi.
- Kami menggunakan sqlserver.query_pre_execution_showplan dalam sesi XE untuk melacak kompilasi. Mengapa ada perbedaan antara itu dan penghitung PerfMon?
- Apakah normal bahwa Anda mendapatkan acara kompilasi setiap kali pemicu berjalan?
Skrip 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;
sumber
Tidak. Pemicu tidak selalu dikompilasi ulang. Namun, pernyataan kueri yang sederhana, tidak membuat rencana mereka di-cache dan karenanya akan selalu dikompilasi ulang.
Pemicu dikompilasi ulang jika jumlah baris yang dimasukkan atau dihapus berubah secara signifikan. Lihat: https://technet.microsoft.com/en-us/library/ms181055.aspx
Saya tidak tahu apakah mereka memiliki hal yang sama di XEvents, tetapi dalam SQL Trace, kompilasi ulang memiliki subkelas acara yang memberi tahu Anda mengapa itu dikompilasi ulang. Itu dijelaskan di tautan yang sama di atas.
sumber