sql - 如果我的查询成功,为什么并行性会影响?
问题描述
本周有一个奇怪的问题,查询第一次失败。它是存储过程的一部分,这就是它失败的地方。(我将字段更改为通用字段)
查询是
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 之外,执行计划是相同的,所以它使用了类似的计划。
所以我想我的问题是为什么并行导致这个查询失败?
解决方案
SQL 是一种查询语言,与过程语言无关。在过程语言中,您可以通过对代码片段进行排序来对每个部分进行排序来控制每条指令的顺序。这被称为“如何”代码......在查询语言中,您只指定“什么”代码,而不是如何,并且查询被翻译成不同的指令序列(如何代码)来执行您的请求,然后解决您的需求的每种不同解决方案都会根据成本进行评估,最后优化器会选择将执行的最佳解决方案。
有时,由于查询中的细微差异、会话执行参数、数据值的分布,代码的更改方式......
因此,您绝不能假定查询将以相同的方式执行。您需要通过消除误解的逻辑来保护您的查询......
推荐阅读
- latex - 如何使用 Rmarkdown-PDF 更改字体样式字体,已发送错误:“无法找到包含 Times New Roman 的包”
- django - 我正在创建一个表格并根据 + 或 - 值将文本着色为绿色或红色,有没有办法可以从数字中删除符号
- java - 从 BufferedInputStream 中读取 byte[]
- java - 有没有办法在 Java 中协调 Python C-Extensions
- java - Button ActionListener 导致大量错误,我不知道为什么
- sql-server - Flyway 是否有我们可以在 SQL 迁移中使用的“数据库名称”占位符?
- android - 如何在 android 和 ios 上运行 Angular 7 应用程序?
- xamarin - Xamarin.Forms 应用恢复时恢复导航堆栈
- python - 我可以在没有 Python 文件的情况下创建 sqlite3 连接吗?
- excel - 是否有一个公式可以根据当前选项卡上的输入让单元格在另一个选项卡上显示单元格的内容?