我正在阅读以下文章:
http://www.sqlservercentral.com/articles/Parameter+Sniffing/98481/
在两个示例中,如果我使用相同的参数值执行存储的proc超过3次,SQL Server(2017)似乎会自动切换到更正确的执行计划。
例如:
CREATE PROECEDURE Sales
@OrderDate datetime
AS
SELECT
sod.SalesOrderID,sod.OrderQty,sod.UnitPrice,soh.OrderDate
FROM
sales.salesorderdetail sod
INNER JOIN
sales.salesorderheader soh
ON
sod.SalesOrderID = soh.SalesOrderID
WHERE
soh.OrderDate < @OrderDate
ORDER BY
sod.UnitPrice
GO
EXEC Sales '20110730'
EXEC Sales '20140730'
如果我两次运行最高执行程序,则SQL选择执行计划A。 如果我随后运行第二个exec,它将多次使用执行计划A。但是在执行了3次之后,它将更改为执行计划B。 如果我返回并运行第一个查询几次,最终它将切换回A。 两个问题。请同时回答:
SQL如何确定何时停止使用缓存的计划并创建一个新计划?
由于SQL似乎会在使用不同的参数执行完足够多的时间后自动切换查询计划,这是否会使任何“错误的参数嗅探”问题变得多余,因为SQL应该在执行几次后自行纠正?
< / li>