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