INT 列的串联警告:表达式中的类型转换导致执行计划中的 CardinalityEstimate 警告

Concatenation of INT columns warning: Type conversion in expression causes CardinalityEstimate warnings in execution plan

运行 SQL Server 2017 Developer Edition。

我有一个简单的案例,我试图将两个 INT 列连接成一个名为 "NUMVER" 的列,用分号分隔。虽然我可以重构应用程序中的内容以不同的方式执行此操作,但了解是否可以不重构并更改语法以使其不会引发“!”会很有趣。执行计划中的警告。

详情:

一个叫'DOCS'的table有列,NUMVER,都是INT加上一个PK:

CREATE TABLE [dbo].[DOCS2](
    [DOCS_ID] [int] IDENTITY(1,1) NOT NULL,
    [NUM] [int] NOT NULL,
    [VER] [int] NOT NULL,
 CONSTRAINT [PK_DOCS] PRIMARY KEY CLUSTERED ([DOCS_ID] ASC)
)
GO

一些数据:

INSERT INTO dbo.DOCS (NUM, VER) VALUES (1,1);
INSERT INTO dbo.DOCS (NUM, VER) VALUES (2,1);

我想select将 NUM 和 VER 合并到带有分号分隔符的单列 NUMVER 中:

SELECT CAST(NUM AS varchar(20)) + ';' + CAST(VER AS varchar(20)) AS "MENU" FROM DOCS;

返回的结果很好,我得到“1;1”或“2;1”等,但我在执行计划上收到警告:

Type conversion in expression (CONVERT(varchar(20),[mydb].[dbo].[DOCS].[NUM],0)) may affect "CardinalityEstimate" in query plan choice, Type conversion in expression (CONVERT(varchar(20),[mydb].[dbo].[DOCS].[VER],0)) may affect "CardinalityEstimate" in query plan choice

上面的示例是一个更复杂、异常繁忙的简化示例 table,如果这是微不足道的警告,那很好,我会继续,但我很想得到“!”尽可能消失?

注意:我没有观察到性能问题,我只是积极主动(或者可能过于好奇和谨慎)。

注意 2:为了清楚起见,我添加了有关场景的更多详细信息,例如创建 table DDL 并添加了一些插入语句。

关键词是可以。在这种情况下,这不会影响基数估计,因为该列只是被选中,并未用于任何可能影响估计的过滤或分组操作。

一个连接项目"New Type Conversion in Expression..... warning in SQL2012 ,too noisy to practical use",微软在其中回应

I see what you mean. While I agree that this is noise in most cases, it is low priority for us to fix. We will look at it if we get more feedback. For now I have closed this by design

连接关闭时丢失。 UserVoice site here.

上也有类似的投诉

it seems to be an overreach when converted/casted columns are simply cited in the selected / projected column list and not at all in filtering clause.

可以跳过一些障碍来摆脱它。例如

SELECT FORMAT(NUM, 'N0') + ';' + FORMAT(VER, 'N0') 
FROM [DOCS2];

但我不推荐这个。 FORMAT 有其自身的问题(与性能有关)并且应用不必要的 FORMAT 会使代码的可读性降低。