小编j.r*_*j.r的帖子

“EXISTS (...) OR EXISTS (...)”中的子句顺序

我有一类查询测试两件事中的一个的存在。它的形式

SELECT CASE
  WHEN EXISTS (SELECT 1 FROM ...)
  OR EXISTS (SELECT 1 FROM ...)
THEN 1 ELSE 0 END;
Run Code Online (Sandbox Code Playgroud)

实际语句是用 C 生成的,并作为通过 ODBC 连接的即席查询执行。

最近发现,在大多数情况下,第二个 SELECT 可能比第一个 SELECT 更快,并且切换两个 EXISTS 子句的顺序导致至少在我们刚刚创建的一个滥用测试用例中急剧加速。

显而易见的事情就是继续并切换这两个子句,但我想看看更熟悉 SQL Server 的人是否愿意对此进行权衡。感觉就像我依靠巧合和“实施细节”。

(似乎如果 SQL Server 更智能,它将并行执行两个 EXISTS 子句,并让其中一个先完成另一个短路。)

有没有更好的方法让 SQL Server 持续改进此类查询的运行时间?

更新

感谢您抽出时间和对我的问题感兴趣。我没想到有关实际查询计划的问题,但我愿意分享它们。

这是用于支持 SQL Server 2008R2 及更高版本的软件组件。根据配置和使用的不同,数据的形状可能会有很大不同。我的同事考虑对查询进行此更改,因为(在示例中)dbf_1162761$z$rv$1257927703表中的行数总是大于或等于dbf_1162761$z$dd$1257927703表中的行数——有时要多得多(数量级)。

这是我提到的滥用案例。第一个查询很慢,大约需要 20 秒。第二个查询立即完成。

值得一提的是,最近还添加了“优化未知”位,因为参数嗅探会破坏某些情况。

原始查询:

SELECT CASE
  WHEN EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$rv$1257927703 rv INNER JOIN zumero.dbf_1162761$t$tx tx ON tx.txid=rv.txid WHERE tx.generation BETWEEN …
Run Code Online (Sandbox Code Playgroud)

sql-server

11
推荐指数
1
解决办法
970
查看次数

标签 统计

sql-server ×1