簡體   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