PL/SQL Developer 查看查詢的執行計划


https://zhuanlan.zhihu.com/p/65771352

通過 PL/SQL Developer 查看查詢的執行計划

1 什么是執行計划

執行計划是一條查詢語句在 Oracle 中的執行過程或訪問路徑的描述。2 配置執行計划需要顯示的項

 

2 配置執行計划需要顯示的項

3 執行計划的常用列字段解釋

基數(Cardinality):Oracle 估計的當前操作的返回結果集行數

字節(Bytes):執行該步驟后返回的字節數

耗費(COST)、CPU 耗費:Oracle 估計的該步驟的執行成本,用於說明 SQL 執行的

代價,理論上越小越好(該值可能與實際有出入)

時間(Time):Oracle 估計的當前操作所需的時間:

4 使用執行計划

通過工具啟動執行計划。選中需要查看執行計划的查詢語句,在工具欄中選擇Explain Plan

或者是選擇需要查看執行計划的查詢語句后按 F5。

5 查看執行計划

5.1執行順序

縮進最多的最先執行;(縮進相同時,最上面的最先執行)。

5.2表訪問的幾種方式(非全部):

• TABLE ACCESS FULL(全表掃描)

• TABLE ACCESS BY INDEX ROWID(通過 ROWID 的表存取)

• TABLE ACCESS BY INDEX SCAN(索引掃描)

5.2.1TABLE ACCESS FULL(全表掃描)

Oracle 會讀取表中所有的行,並檢查每一行是否滿足 SQL 語句中的 Where 限制條件;

使用建議:數據量太大的表不建議使用全表掃描,除非本身需要取出的數據較多,占到

表數據總量的 5% ~ 10% 或以上.2TABLE ACCESS BY INDEX ROWID(通過 ROWID 的

表存取)

5.2.2.1 什么是 ROWID

ROWID 是由 Oracle 自動加在表中每行最后的一列偽列,既然是偽列,就說明表中並不

會物理存儲 ROWID 的值。

你可以像使用其它列一樣使用它,只是不能對該列的值進行增、刪、改操作。

一旦一行數據插入后,則其對應的 ROWID 在該行的生命周期內是唯一的,即使發生行

遷移,該行的 ROWID 值也不變。

5.2.2.2 TABLE ACCESS BY INDEX ROWID

行的 ROWID 指出了該行所在的數據文件、數據塊以及行在該塊中的位置,所以通過

ROWID 可以快速定位到目標數據上,這也是 Oracle 中存取單行數據最快的方法;

5.2.3TABLE ACCESS BY INDEX SCAN(索引掃描)

在索引塊中,既存儲每個索引的鍵值,也存儲具有該鍵值的行的 ROWID。

5.2.3.1 索引掃描其實分為兩步

1 掃描索引得到對應的 ROWID。

2 通過 ROWID 定位到具體的行讀取數據。

5.2.3.2 五種索引掃描

• INDEX UNIQUE SCAN(索引唯一掃描)

• INDEX RANGE SCAN(索引范圍掃描)

• INDEX FULL SCAN(索引全掃描)

• INDEX FAST FULL SCAN(索引快速掃描)

• INDEX SKIP SCAN(索引跳躍掃描)

5.2.3.2.1 INDEX UNIQUE SCAN(索引唯一掃描)

針對唯一性索引(UNIQUE INDEX)的掃描,每次至多只返回一條記錄;

表中某字段存在 UNIQUE、PRIMARY KEY 約束時,Oracle 常實現唯一性掃描;

5.2.3.2.2INDEX RANGE SCAN(索引范圍掃描)

使用一個索引存取多行數據;

發生索引范圍掃描的三種情況:

1 在唯一索引列上使用了范圍操作符(如:> < <> >= <= between);

2 在組合索引上,只使用部分列進行查詢(查詢時必須包含前導列,否則會走全表掃描);

3 對非唯一索引列上進行的任何查詢;通過 PL/SQL Developer 查看查詢的執行計划

1 什么是執行計划

執行計划是一條查詢語句在 Oracle 中的執行過程或訪問路徑的描述。5.2.3.2.3INDEX FULL SCAN(索引全掃描)

進行全索引掃描時,查詢出的數據都必須從索引中可以直接得到;

5.2.3.2.4INDEX FAST FULL SCAN(索引快速掃描)

掃描索引中的所有的數據塊,與 INDEX FULL SCAN 類似,但是一個顯著的區別是它

不對查詢出的數據進行排序(即數據不是以排序順序被返回);

5.2.3.2.5INDEX SKIP SCAN(索引跳躍掃描)

表有一個復合索引,且在查詢時有除了前導列(索引中第一列)外的其他列作為條件;

5.2.4Oracle 的優化器

5.2.4.1 Oracle 的優化器種類

• RBO(Rule-Based Optimization) 基於規則的優化器

• CBO(Cost-Based Optimization) 基於代價的優化器

5.2.4.2 RBO 優化器

RBO 有嚴格的使用規則,只要按照這套規則去寫 SQL 語句,無論數據表中的內容怎樣,

也不會影響到你的執行計划。換句話說,RBO 對數據“不敏感”,它要求 SQL 編寫人員必

須要了解各項細則。RBO 一直沿用至 ORACLE 9i,從 ORACLE 10g 開始,RBO 已經徹底

被拋棄。

5.2.4.3 CBO 優化器

CBO 是一種比 RBO 更加合理、可靠的優化器,在 ORACLE 10g 中完全取代 RBO。CBO

通過計算各種可能的執行計划的“代價”,即 COST,從中選用 COST 最低的執行方案作為實

際運行方案。

6 執行計划的使用

6.1單表

6.1.1分析查詢表中的所有數據

6.1.1.1 示例

查詢 employees 表中的所有數據.2分析主鍵作為條件的查詢

6.1.2.1 示例

查詢 employees 表中 employees_id 為 100 的雇員

6.1.3分析非主鍵列作為查詢條件

6.1.3.1 示例

查詢雇員名字為 Tarloy 的雇員.4分析 like 條件

6.1.4.1 示例

查詢雇員名字中含有 a 的雇員

6.1.5分析非唯一性索引列作為條件的查詢

6.1.5.1 示例一

將 last_name 創建索引

create index emp_name on

employees(last_name);

6.1.5.2 示例二

查詢雇員名字為 Taylor 的雇員。

6.1.6分析非唯一性索引中=、>、< 、<>條件

6.1.6.1 示例一

對雇員薪水列做=、>、<、<>條件判斷。

6.1.6.2 示例二

對薪水創建索引,使用薪水列做=、>、<、<>條件判斷。

 

6.2多表

6.2.1內連接

6.2.1.1 示例一

使用等值連接,查詢所有部門以及所有部門下的雇員。

6.2.1.2 示例二

使用子查詢,查詢所有部門以及所有部門下的雇員。

6.2.2外連接

6.2.2.1 示例一

查詢所有雇員與雇員的部門名稱,包含那些沒有部門的雇員。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM