【问题标题】:Concatenation of INT columns warning: Type conversion in expression causes CardinalityEstimate warnings in execution planINT 列的连接警告:表达式中的类型转换导致执行计划中的 CardinalityEstimate 警告
【发布时间】:2019-04-06 05:27:59
【问题描述】:

在 SQL Server 2017 开发人员版上运行。

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

详情:

名为“DOCS”的表具有列 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);

我想用分号分隔符将 NUM 和 VER 选择到单列 NUMVER 中:

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

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

表达式中的类型转换 (CONVERT(varchar(20),[mydb].[dbo].[DOCS].[NUM],0)) 可能会影响查询计划选择中的“CardinalityEstimate”,表达式中的类型转换 (CONVERT (varchar(20),[mydb].[dbo].[DOCS].[VER],0)) 可能会影响查询计划选择中的“CardinalityEstimate”

上面的示例是一个更复杂、非常繁忙的表的简化示例,如果这是一个微不足道的警告,我会继续前进,但我希望得到“!”如果可能的话消失?

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

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

【问题讨论】:

  • 无法复制问题,我已根据给定信息创建了表格,但没有警告我。如果您可以制作测试用例,我们可以帮助您。
  • 您的查询是否过于简化?您的真实查询中有WHERE 吗?此外,您应该养成声明数据类型的长度、比例和精度的习惯。不这样做会给你一些(讨厌的)惊喜。
  • UsmanMirza 和 Lamu:针对您的 cmets,我在原始问题中添加了更多细节。感谢您的宝贵时间。
  • 我个人建议在你的情况下使用computed (virtual) columns

标签: sql-server sql-execution-plan


【解决方案1】:

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

微软回应了一个连接项“表达式中的新类型转换.....警告在 SQL2012 中,噪音太大而无法实际使用”

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

连接关闭时丢失。 UserVoice site here 也有类似的投诉。

当转换/转换列很简单时,这似乎是一个过度 在选定/预计的列列表中引用,而不是在 过滤子句。

有可能跳过一些箍来摆脱它。例如

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

但我不建议这样做。 FORMAT 有其自身的问题(性能方面),应用不必要的 FORMAT 会使代码的可读性降低。

【讨论】:

  • 马丁,超级。微软的回应正是我想要的。目前我只是将其视为噪音,但 Mark Freeman 的回复(在上面的 UserVoice 网站上)很好地反映了我的情况。他说,“当几乎每个计划都无缘无故地显示这个警告时,这使得发现真正的问题变得更加困难。”我们一直在查看和重构我们的一些代码,着眼于解决合法警告,现在我必须考虑误报。无论如何,感谢您抽出时间马丁。
  • 我不知道这是否有帮助,但我在 feedback.azure.com/forums/908035/suggestions/32895910 上支持了投诉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
相关资源
最近更新 更多