【问题标题】:How does Oracle execute queriesOracle 如何执行查询
【发布时间】: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 将如何执行此操作吗?

【问题讨论】:

  • 观察执行计划
  • sq1sq2 是什么?它们看起来像列名。
  • 不要假设您的数据库将如何执行您的 sql。查看执行计划,看看它将如何实际执行您的 sql。您可能会惊讶地发现您的假设是错误的,而且背后的复杂性要高得多。

标签: sql oracle


【解决方案1】:

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

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

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

explain plan for <my-query>

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2012-07-13
    • 2011-04-03
    • 2012-09-02
    • 2016-05-05
    • 2017-01-04
    • 2014-10-20
    相关资源
    最近更新 更多