假设我有这样的查询:
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')
我这样做是为了避免选择all然后进行过滤,但我不确定Oracle将如何处理这种情况,通常在y IN ('a','b')
返回时错误Oracle不应该执行sq1
。< / p>
那么是否有人知道Oracle将如何执行此操作?
答案 0 :(得分:1)
Oracle将根据执行计划执行它。执行计划由 SQL优化器(作为执行的初始阶段之一)准备,根据:
要了解Oracle将如何执行您的特定查询,请运行:
explain plan for <my-query>
然后使用以下方式查看计划:
select plan_table_output
from table(dbms_xplan.display('plan_table',null,'typical'));
这将为您提供所需的详细信息。当然,您需要学习如何阅读计划。这并不难,但需要几周的学习。 提示:计划采用树的形式,首先执行叶节点,直到最后执行根节点。
请记住,执行计划会根据表中的实际数据及时更改,因为Oracle可能会发现在一段时间后以不同的方式执行它会更便宜(有时可能会出错)。
如果您的表从1000行增加到100万行,那么您今天的计划可能与您明天看到的计划不同。只要您更新统计信息,它就会适应现实。