【发布时间】:2018-08-29 12:31:51
【问题描述】:
我有一些参数化的查询,它们每次都在创建新的执行计划,我使用的是 SQL Server 2016
查询类似于:
(@P1 varchar(1043),@P2 varchar(6))
UPDATE table
SET FILEDATA=@P1
WHERE FILEID=@P2
这个查询没有使用缓存中已经生成的执行计划,而是每次执行时都创建一个新的计划
This image shows the plancount an individual query is creating
【问题讨论】:
-
(1) 您如何确认他们没有使用相同的计划? (2) 该表中的数据多久更改一次?如果更改过于频繁,统计信息可能会失效,这将迫使引擎重新生成执行计划。 (3) 您是否有任何重复性的工作来重置统计信息或重建该表上的索引? (4) 是否确认计划缓存未满?
-
1) 我已经运行了一个脚本来获取计划的数量 2) 非常频繁(我可以知道如何验证统计数据)3) 没有这样的工作 4) 是的,我已经验证它不完整
-
(1) 但是您是否真的验证过该查询有重复的计划? (2) 如果数据变化非常频繁——SQL 服务器必须根据新的统计数据更新执行计划——这是一件好事。检查表上的统计信息的最后创建时间,并将其与执行计划上的日期进行比较以进行验证。
-
按照建议,您首先需要确定您是否有针对同一查询的多个计划(以及多少 个)。请注意,数据类型很重要,连接设置(如 ARTIHABORT)也很重要——这样的事情会使 SQL Server 看到不同的查询。
标签: sql sql-server sql-server-2016 sqlperformance parameterized-query