csv 需要有关SQL Server中类型转换的执行计划的帮助

kxeu7u2r  于 2023-01-28  发布在  SQL Server
关注(0)|答案(3)|浏览(117)

我在执行计划中收到以下警告。请提供有关如何解决此错误的建议。

表达式中的类型转换(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

tbl工作队列文档:用于创建表的语句。CREATE TABLE #tblWorkQueueDocuemnt(组ID INT,总计数INT)

zed5wv10

zed5wv101#

基本上,警告消息表明,由于类型转换,索引不能在派生表中使用,我认为这在这里并不重要,因为派生表本身是基于解析的文本字符串的-所以无论如何都不能有索引。
作为旁注:你真的需要把这个值作为一个CSV字符串传递吗?如果用values()构建一个合适的派生表会更简单,如下所示:

select te.value as groupid, coalesce(tm.totalcount, 0) as groupcount
from (values (1), (2), (3), (4)) as te(groupid)
left join #tblworkqueuedocuemnt tm on tm.tm.groupid = te.value

这样可以避免警告(不需要转换,因为值是以正确的数据类型开始的),但是,我再次认为您不需要担心这个警告。

wecizke3

wecizke32#

这是一个古老的东西,每当他们有一个隐式转换。
在对字段执行隐式转换的情况下,它可能无法使用索引。这与对字段执行显式CAST或CONVERT类似。
如果它运行良好且没有问题,则忽略它。
例如,参见https://www.brentozar.com/archive/2018/10/we-need-to-talk-about-the-warnings-in-your-query-plans/
在本例中,如果需要,可以显式地将string_split之后的值转换为int,这在技术上更简洁,但可能根本不会提高性能。

vfhzx4xs

vfhzx4xs3#

使用此查询:

SELECT CONVERT(INT, value) AS value
FROM STRING_SPLIT('1,2,3,4', ',')

我得到了同样的警告:

但是将CONVERT(INT, value)更改为PARSE(value AS int)

SELECT PARSE(value AS int) AS value
FROM STRING_SPLIT('1,2,3,4', ',')

删除警告:

相关问题