我在执行计划中收到以下警告。请提供有关如何解决此错误的建议。
表达式中的类型转换(CONVERT(int,STRING_SPLIT.[value],0))可能会影响查询计划选择中的“CardinalityEstimate”
上述警告见以下SQL语句
SELECT TE.value AS GroupID
,ISNULL(TM.TotalCount, 0) AS GroupCount
FROM #tblWorkQueueDocuemnt TM
RIGHT OUTER JOIN (
SELECT CONVERT(INT, value) AS value
FROM STRING_SPLIT('1,2,3,4', ',')
) TE ON TM.GroupID = TE.value
3条答案
按热度按时间zed5wv101#
基本上,警告消息表明,由于类型转换,索引不能在派生表中使用,我认为这在这里并不重要,因为派生表本身是基于解析的文本字符串的-所以无论如何都不能有索引。
作为旁注:你真的需要把这个值作为一个CSV字符串传递吗?如果用
values()
构建一个合适的派生表会更简单,如下所示:这样可以避免警告(不需要转换,因为值是以正确的数据类型开始的),但是,我再次认为您不需要担心这个警告。
wecizke32#
这是一个古老的东西,每当他们有一个隐式转换。
在对字段执行隐式转换的情况下,它可能无法使用索引。这与对字段执行显式CAST或CONVERT类似。
如果它运行良好且没有问题,则忽略它。
例如,参见https://www.brentozar.com/archive/2018/10/we-need-to-talk-about-the-warnings-in-your-query-plans/
在本例中,如果需要,可以显式地将string_split之后的值转换为int,这在技术上更简洁,但可能根本不会提高性能。
vfhzx4xs3#
使用此查询:
我得到了同样的警告:
但是将
CONVERT(INT, value)
更改为PARSE(value AS int)
:删除警告: