相关疑难解决方法(0)

触发器每次都编译吗?

我们正在对 CPU 利用率高的服务器进行故障排除。在发现查询并没有真正导致它之后,我们开始研究编译。

性能监视器显示少于 50 次编译/秒和少于 15 次重新编译/秒。

在运行 XE 会话寻找编译后,我们每秒看到数千次编译。

该系统使用触发器来审计更改。大多数编译是由于触发器。触发器参考 sys.dm_tran_active_transactions。

我们的第一个想法是可能在触发器中引用 DMV 会导致它每次编译,或者可能只是这个特定的 DMV 会导致它。所以我开始测试这个理论。它每次都会编译,但我没有检查触发器是否在每次触发时编译,当它不引用 DMV 而是硬编码一个值时。每次触发时它仍在编译。删除触发器会停止编译。

  1. 我们在 XE 会话中使用 sqlserver.query_pre_execution_showplan 来跟踪编译。为什么这与 PerfMon 计数器之间存在差异?
  2. 每次触发器运行时都会收到编译事件是否正常?

复制脚本:

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 …
Run Code Online (Sandbox Code Playgroud)

trigger performance sql-server performance-tuning

22
推荐指数
2
解决办法
3054
查看次数

跟踪标志 2861 以及“零成本”计划的实际含义

我试图了解跟踪标志 2861 以及它对琐碎查询的实际作用?

简介

SQL Server 通常不会缓存这些简单查询的计划,因为缓存计划的成本高于为此类简单查询生成新计划的成本。

这显然是不正确的,因为我运行的每个“琐碎”查询似乎都被缓存了。所以我想知道 2861 的意义是什么,除非我误解了一个微不足道的计划实际上是什么。当我查询缓存计划并且它说它是临时的和微不足道的时,我没有理由怀疑它。

希望有人能给我解惑。

sql-server plan-cache trace-flags

2
推荐指数
1
解决办法
1156
查看次数