繁体   English   中英

Oracle如何执行查询

[英]How does Oracle execute queries

假设我有这样的查询:

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

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万行,那么今天的计划可能与明天看到的计划不同。 只要您更新统计信息,它就会适应现实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM