我有以下表格的查询
exec sp_executesql N' UPDATE table SET column1 = 1, modify_date=N''2020-02-12 04:55:59.000'' WHERE (column5=@P1 AND column6=@P2 )',N'@P1 nvarchar(36),@P2 int',N'458986156148',87
我无法更改有关此查询本身的任何内容。它来自应用程序。
每次执行时,更新值都会发生变化,从而导致生成新的查询计划,而不是重用以前的计划。
强制参数化已打开,但似乎对此查询没有影响,可能是它的执行方式。
执行查询本身时,我看到更新总共有 4 次读取。在这种情况下,执行本身不会导致更新,因为 where 子句没有返回任何行。
使用分析器,我看到查询进入和开始之间的时间几乎是查询的整个时间(1 秒)。实际执行几乎是立即的。
分析器显示 455.000 次读取!查询执行本身没有显示。
所以现在我想知道
- 我可以强制查询在这里使用相同的计划吗?计划指南似乎仅可用于同一查询或受强制参数化影响的查询。
- 我们可以提高这个查询的编译速度吗?455.000 次读取从何而来?该表上有很多统计数据(+- 100),但 455.000 次读取似乎相当多。
这是在 SQL Server 2019 上,还没有累积更新。我扫描了 CU 更改日志以查找可能与此有关的任何内容。
编辑/进一步调查显示在编译期间其他表上有很多锁。我有 300 个表,它们的外键引用了我要插入的表中的主键。
所有外键关系都是可信的。在编译阶段有什么方法可以防止这些检查吗?
编辑 2/ 依赖项不是外键约束,而是表上的视图。使用该表的所有视图在执行期间都具有 SCH-S 锁,这是预期的。目前尚不清楚这是否也导致读取...
编辑 3/ 显然 455.000 次读取是通过扫描 sys.sysmultiobjrefs 系统表超过一百万次完成的。这似乎不是正确的行为。