Oracle如何执行查询

时间:2018-04-12 14:26:03

标签: sql oracle

假设我有这样的查询:

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将如何执行此操作?

1 个答案:

答案 0 :(得分:1)

Oracle将根据执行计划执行它。执行计划由 SQL优化器(作为执行的初始阶段之一)准备,根据:

  • 实际数据和每个表的统计信息
  • 表格中现有的索引
  • 过滤器的选择性(WHERE条件)。
  • 可供算法选择。
  • 您可以以评论的形式添加到SQL的
  • 提示
  • 许多其他变数。

要了解Oracle将如何执行您的特定查询,请运行:

explain plan for <my-query>

然后使用以下方式查看计划:

select plan_table_output 
  from table(dbms_xplan.display('plan_table',null,'typical'));

这将为您提供所需的详细信息。当然,您需要学习如何阅读计划。这并不难,但需要几周的学习。 提示:计划采用树的形式,首先执行叶节点,直到最后执行根节点。

请记住,执行计划会根据表中的实际数据及时更改,因为Oracle可能会发现在一段时间后以不同的方式执行它会更便宜(有时可能会出错)。

如果您的表从1000行增加到100万行,那么您今天的计划可能与您明天看到的计划不同。只要您更新统计信息,它就会适应现实。