查询计划“基数估计”中的警告

Mik*_*son 19 sql-server execution-plan type-conversion sql-server-2012 cardinality-estimates

create table T(ID int identity primary key)
insert into T default values
insert into T default values

go

select cast(ID as varchar(10)) as ID
from T
where ID = 1
Run Code Online (Sandbox Code Playgroud)

上面的查询在查询计划中有一个警告。

<Warnings>
  <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" />
</Warnings>
Run Code Online (Sandbox Code Playgroud)

为什么它有警告?

字段列表中的强制转换如何影响基数估计?

Mik*_*son 12

此警告是 SQL Server 2012 的新增内容。

SQL2012 中新的“表达式中的类型转换.....”警告,到实际使用的嘈杂

我明白你的意思了。虽然我同意在大多数情况下这是噪音,但我们修复的优先级较低。如果我们得到更多反馈,我们会查看它。现在我已经按设计关闭了它。

Connect 已被终止,看起来原始问题并未转移到 UserVoice。这是关于同一问题的不同 UserVoice 问题,类型转换可能会影响 CardinalityEstimate - Convert/cast on selected columns

我会提供无聊的答案,直到有人提出更好的答案。

为什么它有警告?

我的猜测。
在 where 子句中使用的列上有一个强制转换,这使得该列的统计信息变得有趣。数据类型的更改使统计数据不好,因此让我们警告一下,以防字段列表中的值最终可能会在某处使用。

字段列表中的强制转换如何影响基数估计?

除非它是派生表中的字段列表,否则不能。