Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server何时选择自动重新编译存储过程执行计划?_Sql_Sql Server_Tsql - Fatal编程技术网

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

SQL Server何时选择自动重新编译存储过程执行计划?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在阅读以下文章: 在这两个示例中,如果我使用相同的参数值执行存储过程超过3次,SQL Server(2017)似乎会自动切换到更正确的执行计划 例如: CREATE PROECEDURE Sales @OrderDate datetime AS SELECT sod.SalesOrderID,sod.OrderQty,sod.UnitPrice,soh.OrderDate FROM sales.salesorderdeta

我正在阅读以下文章:

在这两个示例中,如果我使用相同的参数值执行存储过程超过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'
创建项目销售
@订单日期时间
作为
挑选
sod.SalesOrderID、sod.OrderQty、sod.UnitPrice、soh.OrderDate
从…起
sales.salesorderdetail
内连接
sales.salesorderheader soh
在…上
sod.SalesOrderID=soh.SalesOrderID
哪里
soh.OrderDate<@OrderDate
订购人
单价
去
执行销售“20110730”
执行销售“20140730”
如果我运行两次top exec,那么SQL选择执行计划A。 如果我运行第二个exec,它会多次使用执行计划。但在执行3次后,更改为执行计划B。 如果我返回并运行第一个查询几次,它最终会切换回a。 两个问题。请回答两个问题:

  • SQL如何决定何时停止使用缓存计划并创建新计划

  • 由于SQL似乎会在使用不同参数执行足够多的查询后自动切换查询计划,这难道不会使任何“错误的参数嗅探”问题变得多余,因为SQL应该在执行几次之后进行自我更正吗

  • 请注意,有问题的数据库已打开参数嗅探: