我在查询存储中的 Azure SQL 数据库(强制参数化 = FORCED、参数嗅探 = ON 和查询优化器修复 = ON)中看到以下查询:
delete from [CMS_WebFarmTask]
where [TaskIsAnonymous] = @0
and [TaskID] not in ( select [TaskID] from [CMS_WebFarmServerTask] )
and [TaskCreated] < dateadd ( minute , @1 , getdate ( ) )
它有大量的计划(最后一小时有 17 个),尽管两个参数都是整数,每个计划中的值都相同:
<ParameterList>
<ColumnReference Column="@1" ParameterDataType="int" ParameterCompiledValue="(-3)" />
<ColumnReference Column="@0" ParameterDataType="int" ParameterCompiledValue="(0)" />
</ParameterList>
为什么不只使用一个计划?
强制参数化<> 强制单一计划。
但是,如果您需要的话,Query Store 确实具有强制执行单一计划的功能。您可以在屏幕截图中看到它的按钮。
但是,如果您更普遍地担心为什么首先要获得多个计划,那么您应该首先确保每次都执行相同的查询。在您的情况下,由于您使用
GETDATE()
的是 ,因此每次运行时查询实际上都是不同的,因此我不希望它仅基于这一点就一定会产生相同的计划。您还需要了解基础表的统计数据也可能随时间变化的事实,这会严重影响计划估算。还有很多其他因素会影响它——本文将更深入地探讨执行计划中的内容以及可能影响它们的内容。数据库是一个有生命的东西,改变计划本身不应该被视为一件坏事,除非它会导致明显的性能问题。