Oracle 執行計划詳解


CSDN:

https://blog.csdn.net/qq_34745941/article/details/106068346

 

文章目錄
1 概述
1.1 思維導圖
1.2 概念
2 執行計划
2.1 預估的
2.2 真實的
3 示例
4 備選命令
1 概述
什么是 Oracle 的執行計划?

執行計划是一條查詢語句在 Oracle 中的執行過程或訪問路徑的描述
簡單一點說,就是: Oracle 是如何執行 sql 語句的。

比如說,就像咱去一個地方,事先會計划好怎么坐車一樣。先坐公交車到哪兒再坐地鐵,oracle 的執行計划也是如此,就是一步一步地執行 sql。
oracle 的執行計划是很復雜的,一般我們看到的執行計划都是 oracle 通過內部算法計算以后選擇的一個消耗比較少的執行路徑,就像我們去哪里也要選擇一條捷徑一樣的道理。
1.1 思維導圖


1.2 概念
表訪問方式 - (全表掃描、通過 rowid 掃描、通過索引掃描)

表連接方式詳解 - (nested loops、hash join、sort merge join)

2 執行計划
2.1 預估的
最簡單的方式:通過 pl/sql developer 的 F5 進行查看:


2.2 真實的
前提說明:

(1) 該用戶(如:scott)要有訪問動態視圖的權限(最常用的用戶:system)
    grant select any dictionary to scott;

(2) sql 已執行完成
1
2
3
4
具體步驟:

1. 獲取執行計划的統計信息(兩種方式) '下列兩條命令必須在同一個窗口執行哦'
alter session set statistics_level = all; -- 推薦
select * from dual;
-- 設置前,可以用下列兩種方式查詢當前的 參數信息
-- select * from v$parameter t where t.name = 'statistics_level';
-- show parameter statistics_level
或(每次查詢時,每個 sql 語句都加上下列 hint):
select /*+ gather_plan_statistics */ * from dual;

2. 找出執行語句的 'sql_id'
select t.*
  from v$sql t
 where t.sql_text like '%select * from%'
 order by t.last_active_time desc;

3. 根據 'sql_id' 查出 '真實執行計划(最近一條)'
select * from table(dbms_xplan.display_cursor('cyfzxc61h3g3r',null,'allstats last')); 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3 示例
獲取 真實的執行計划

1. 執行的 sql 語句:

select /*+ gather_plan_statistics*/
 t.*
  from scott.emp t
 where t.empno >= 7782;
1
2
3
4
2. 找出執行語句的 ‘sql_id’:

select t.*
  from v$sql t
 where t.sql_text like '%where t.empno >= 7782%'
 order by t.last_active_time desc;
1
2
3
4
3. 根據 ‘sql_id’ 查出 ‘真實執行計划(最近一條)’:

select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));
1
最終結果:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
Connected as system@orcl

SQL> select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID  92dkjj0sw6wjr, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/  t.*   from scott.emp t  where
t.empno >= 7782
Plan hash value: 169057108
------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |      1 |        |      8 |00:00:00.01 |       2 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |      1 |      5 |      8 |00:00:00.01 |       2 |
|*  2 |   INDEX RANGE SCAN          | PK_EMP |      1 |      5 |      8 |00:00:00.01 |       1 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("T"."EMPNO">=7782)
20 rows selected

SQL> 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
參數說明:

Starts      該 sql 執行的次數
E-Rows      預計返回的行數
A-Rows      實際返回的行數。可以和 E-Rows 比對,確定哪一步出現了問題
A-Time          每一步實際執行的時間
Buffers     每一步實際執行的邏輯讀或一致性讀
Reads        每一步實際執行的物理讀
Writes      每一步實際執行的物理寫
OMem        最優執行模式所需的內存評估值
1Mem        one-pass模式所需的內存評估值
Used_Mem    則為當前操作實際執行時消耗的內存
            括號里面為(發生磁盤交換的次數,1次即為One-Pass,大於1次則為Multi_Pass,如果沒有使用磁盤,則顯示0)
1
2
3
4
5
6

文章目錄
1 概述
1.1 思維導圖
1.2 概念
2 執行計划
2.1 預估的
2.2 真實的
3 示例
4 備選命令
1 概述
什么是 Oracle 的執行計划?

執行計划是一條查詢語句在 Oracle 中的執行過程或訪問路徑的描述
簡單一點說,就是: Oracle 是如何執行 sql 語句的。

比如說,就像咱去一個地方,事先會計划好怎么坐車一樣。先坐公交車到哪兒再坐地鐵,oracle 的執行計划也是如此,就是一步一步地執行 sql。
oracle 的執行計划是很復雜的,一般我們看到的執行計划都是 oracle 通過內部算法計算以后選擇的一個消耗比較少的執行路徑,就像我們去哪里也要選擇一條捷徑一樣的道理。
1.1 思維導圖


1.2 概念
表訪問方式 - (全表掃描、通過 rowid 掃描、通過索引掃描)

表連接方式詳解 - (nested loops、hash join、sort merge join)

2 執行計划
2.1 預估的
最簡單的方式:通過 pl/sql developer 的 F5 進行查看:


2.2 真實的
前提說明:

(1) 該用戶(如:scott)要有訪問動態視圖的權限(最常用的用戶:system)
grant select any dictionary to scott;

(2) sql 已執行完成
1
2
3
4
具體步驟:

1. 獲取執行計划的統計信息(兩種方式) '下列兩條命令必須在同一個窗口執行哦'
alter session set statistics_level = all; -- 推薦
select * from dual;
-- 設置前,可以用下列兩種方式查詢當前的 參數信息
-- select * from v$parameter t where t.name = 'statistics_level';
-- show parameter statistics_level
或(每次查詢時,每個 sql 語句都加上下列 hint):
select /*+ gather_plan_statistics */ * from dual;

2. 找出執行語句的 'sql_id'
select t.*
from v$sql t
where t.sql_text like '%select * from%'
order by t.last_active_time desc;

3. 根據 'sql_id' 查出 '真實執行計划(最近一條)'
select * from table(dbms_xplan.display_cursor('cyfzxc61h3g3r',null,'allstats last'));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3 示例
獲取 真實的執行計划

1. 執行的 sql 語句:

select /*+ gather_plan_statistics*/
t.*
from scott.emp t
where t.empno >= 7782;
1
2
3
4
2. 找出執行語句的 ‘sql_id’:

select t.*
from v$sql t
where t.sql_text like '%where t.empno >= 7782%'
order by t.last_active_time desc;
1
2
3
4
3. 根據 ‘sql_id’ 查出 ‘真實執行計划(最近一條)’:

select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));
1
最終結果:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as system@orcl

SQL> select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID 92dkjj0sw6wjr, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/ t.* from scott.emp t where
t.empno >= 7782
Plan hash value: 169057108
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 8 |00:00:00.01 | 2 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 5 | 8 |00:00:00.01 | 2 |
|* 2 | INDEX RANGE SCAN | PK_EMP | 1 | 5 | 8 |00:00:00.01 | 1 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T"."EMPNO">=7782)
20 rows selected

SQL>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
參數說明:

Starts 該 sql 執行的次數
E-Rows 預計返回的行數
A-Rows 實際返回的行數。可以和 E-Rows 比對,確定哪一步出現了問題
A-Time 每一步實際執行的時間
Buffers 每一步實際執行的邏輯讀或一致性讀
Reads 每一步實際執行的物理讀
Writes 每一步實際執行的物理寫
OMem 最優執行模式所需的內存評估值
1Mem one-pass模式所需的內存評估值
Used_Mem 則為當前操作實際執行時消耗的內存
括號里面為(發生磁盤交換的次數,1次即為One-Pass,大於1次則為Multi_Pass,如果沒有使用磁盤,則顯示0)
1
2
3
4
5
6
7
8
9
10
11
4 備選命令
SQL> set col 100 -- 設置顯示 100 列(若命令窗口顯示不全時使用)
SQL>
SQL> clear -- 清屏
1
2
3

————————————————
版權聲明:本文為CSDN博主「魚丸丶粗面」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34745941/article/details/106068346


7
8
9
10
11
4 備選命令
SQL> set col 100  -- 設置顯示 100 列(若命令窗口顯示不全時使用)
SQL>
SQL> clear -- 清屏
1
2
3

————————————————
版權聲明:本文為CSDN博主「魚丸丶粗面」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34745941/article/details/106068346


免責聲明!

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



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