SQL Server何时选择自动重新编译存储过程执行计划?

时间:2019-03-06 13:51:51

标签: sql sql-server tsql

我正在阅读以下文章:

http://www.sqlservercentral.com/articles/Parameter+Sniffing/98481/

https://kohera.be/blog/sql-server/tackle-parameter-sniffing-in-sql-server-2017-and-azure-sql-database/

在两个示例中,如果我使用相同的参数值执行存储的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。 两个问题。请同时回答:

  1. SQL如何确定何时停止使用缓存的计划并创建一个新计划?

  2. 由于SQL似乎会在使用不同的参数执行完足够多的时间后自动切换查询计划,这是否会使任何“错误的参数嗅探”问题变得多余,因为SQL应该在执行几次后自行纠正?

    < / li>

请注意,相关数据库已打开“参数嗅探”: enter image description here

0 个答案:

没有答案