トリガーは毎回コンパイルされますか?
CPU使用率が高いサーバーのトラブルシューティングを行っています。クエリが実際に原因ではないことがわかった後、コンパイルを検討し始めました。 パフォーマンスモニターは、50コンパイル/秒未満および15再コンパイル/秒未満を示しています。 XEセッションを実行してコンパイルを探した後、毎秒数千のコンパイルが発生しています。 このシステムは、トリガーを使用して変更を監査しています。ほとんどのコンパイルはトリガーによるものです。トリガーはsys.dm_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 …