我怎样才能使这个执行计划更有效率?

Mer*_*uda 2 sql-server execution-plan type-conversion sql-server-2017

我已经计算出所有隐式转换,但我仍然在计划中看到它的提及。我已附上该计划,任何建议都会有所帮助。

select cardholder_index, sum(value) as [RxCost] 
into #rxCosts 
from RiskPredictionStatistics with (nolock) where model_name = 'prescription_cost_12_months'
 and model_set_name = 'rx_updated' and run_id in (select value from #runIds) 
 and exists (select 1 from StringContainsHelper with (nolock) where IntValue = cardholder_index and ReferenceId = @stringContainsHelperRefId)
group by cardholder_index
Run Code Online (Sandbox Code Playgroud)

https://www.brentozar.com/pastetheplan/?id=SyHl9xFeS

Eri*_*ing 10

看起来,当您填充#runIds表格时——我只是在这里进行了一个疯狂的猜测——您正在使用一个字符串拆分器函数,该函数将值输出为NVARCHAR(MAX).

坚果

您可以尝试转换那里的值以摆脱隐式转换警告。

另一种可能的改进是将NonClustereIndex-CardholderRiskProductionStatistics 上的索引更改model_set_name为键列和model_name, run_id, value包含列。这将解决密钥查找问题。

坚果

坚果

您可能还想检查model_name. 它出现在 Filter 运算符中,我担心它是 MAX 数据类型,这可能会阻止谓词被下推

坚果

由于这是一个估计的计划,并且您没有包含有关查询的任何指标,因此很难说这些更改会有多少改进。