【发布时间】:2018-04-12 14:26:02
【问题描述】:
假设我有这样的查询:
SELECT *
FROM
(SELECT x,y,z
FROM Foo
WHERE x NOT IN (sq1)
UNION SELECT x,y,z
FROM Foo2
WHERE x NOT IN (sq2))
WHERE y IN ('a','b')
AND z IN ('xa','xb','xc')
然后我将其转换为:
SELECT x,y,z
FROM Foo
WHERE x NOT IN (sq1) AND y IN ('a','b') AND z IN ('xa','xb','xc')
UNION
SELECT x,y,z
FROM Foo2
WHERE x NOT IN (sq2) AND y IN ('a','b') AND z IN ('xa','xb','xc')
我这样做是为了避免选择全部然后过滤,但我不确定 Oracle 将如何处理这个问题,通常当 y IN ('a','b') 返回 false 时 Oracle 不应该执行 sq1。
那么有人知道 Oracle 将如何执行此操作吗?
【问题讨论】:
-
观察执行计划
-
sq1和sq2是什么?它们看起来像列名。 -
不要假设您的数据库将如何执行您的 sql。查看执行计划,看看它将如何实际执行您的 sql。您可能会惊讶地发现您的假设是错误的,而且背后的复杂性要高得多。