首页 > 解决方案 > 如果我的查询成功,为什么并行性会影响?

问题描述

本周有一个奇怪的问题,查询第一次失败。它是存储过程的一部分,这就是它失败的地方。(我将字段更改为通用字段)

查询是

SELECT 
p.Type, 
CAST(c.Comment AS int) AS NumberOfComments
FROM Comments c
JOIN Pages p ON c.Id = p.Id
WHERE c.CommentNo = 5 AND p.Type IN ('AAA', 'BBB', 'CCC')

错误消息是

将 varchar 值 'Test Text In here' 转换为数据类型 int 时转换失败。

使用通常的执行顺序,我本来希望 WHERE 在 SELECT CAST 之前执行,但在这种情况下并没有发生这种情况。在 Comments 表的聚集索引扫描之后,有一个计算标量,它在其中进行 Cast,然后它对 Pages 表进行哈希匹配。

注释字段不仅用于数字,而且这些特定类型的所有注释始终是数字。我们通过使用 TRY_CAST 而不是 CAST 来修复它,但我也注意到查询本身已经并行。

当我添加 OPTION (MAXDOP 1) 时,查询成功运行。除了 Parallelism 之外,执行计划是相同的,所以它使用了类似的计划。

所以我想我的问题是为什么并行导致这个查询失败?

标签: sqlsql-serversql-server-2012

解决方案


SQL 是一种查询语言,与过程语言无关。在过程语言中,您可以通过对代码片段进行排序来对每个部分进行排序来控制每条指令的顺序。这被称为“如何”代码......在查询语言中,您只指定“什么”代码,而不是如何,并且查询被翻译成不同的指令序列(如何代码)来执行您的请求,然后解决您的需求的每种不同解决方案都会根据成本进行评估,最后优化器会选择将执行的最佳解决方案。

有时,由于查询中的细微差异、会话执行参数、数据值的分布,代码的更改方式......

因此,您绝不能假定查询将以相同的方式执行。您需要通过消除误解的逻辑来保护您的查询......


推荐阅读