數據庫執行SQL都會先進行語義解析,然后將SQL分成一步一步可執行的計劃,然后逐步執行。通過分析執行計劃,我們可以清晰的看到數據庫執行的操作,這對于數據庫SQL的優化具有重大意義。
1. 執行計劃
用戶成功連接數據庫之后,用戶和數據庫成功建立起了會話。此后,用戶每通過會話發出一條SQL語句,數據庫系統都會對其進行一系列檢查、分析、處理。
同時優化器會對SQL進行一些優化,并選擇出一個它覺得最優的執行計劃,然后再去執行這些操作。由于SQL不同的寫法會影響優化器為之生成和選定的執行計劃。所以我們就可以通過改寫SQL語句來改變其執行計劃,從而提升SQL語句性能。
2. 系統統計數據
系統統計數據反映了數據庫系統的處理能力,會對執行計劃中左右操作成本(其實就是性能消耗)計算產生重要影響。系統統計數據主要包括轉速、單塊讀消耗時間、多塊讀消耗時間、多塊讀平均每次讀取的數據塊等。
系統統計數據會影響優化器計算分析SQL語句執行計劃的成本所選擇的算法,也會影響SQL語句生成和選擇的執行計劃。
3. 對象統計數據
優化器對SQL進行解析的時候,會根據系統統計數據和對象統計數據等信息,計算成本,最后選出最低成本的執行計劃。由于系統統計數據認為很難干涉,所以對象統計數據對于SQL執行計劃來說影響更大。
對象統計數據主要包括三個部分:表(分區及子分區)相關統計數據、索引相關統計數據和字段相關統計數據。所以收集這些信息則可以進行對象統計數據的分析,從而進行SQL優化。
4. 獲取執行計劃
獲取執行計劃有多種方法,下面分別介紹一下。
4.1 通過各種GUI工具獲得執行計劃
通過各種GUI可以獲取到執行計劃,其優點是操作簡單,靈活;獲取的信息也比較多。
下面是通過Sql Developer中的工具直接獲取到的執行計劃示例
4.2 autotrace功能
autotrace功能是Oracle公司的產品,其功能強大、使用靈活,因而應用廣泛。
4.2.1使用方法介紹
set autot off 關閉autotrace功能
set autot on 開啟autotrace功能,輸出SQL語句的查詢結果,執行計劃以及相關的性能統計數據
set autot on expl 開啟autotrace功能,輸出SQL語句的查詢結果,執行計劃,不輸出性能統計數據
set autot on stat 開啟autotrace功能,輸出SQL語句的查詢結果以及相關性能數據,不輸出執行計劃
set autot trace 開啟autotrace功能,只輸出SQL語句的執行計劃以及性能數據,不輸出查詢結果
set autot trace expl 開啟autotrace功能,只輸出SQL的執行計劃,不輸出查詢結果及性能數據
set autot trace stat 開啟autotrace功能,只輸出SQL的性能統計數據,不輸出執行計劃以及查詢結果
如下示例:
set autotrace on
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
圖中輸出了執行計劃以及性能數據.
4.3 使用DBMS_XPLAN包
DBMS_XPLAN是Oracel數據庫的內置包,該包提供了多個函數,通過這些函數,用戶可以比較容易的獲取執行計劃等數據。
4.3.1 DISPLAY方法
DBMS_XPLAN.DISPLAY(
table_name in varchar2 default 'PLAN_TABLE',
statement_id in varchar2 default null,
format in varchar2 default 'TYPICAL',
filter_preds in varchar2 default null);
以上是DISPLAY的語法,默認執行計劃存儲表為PLAN_TABLE,如果要查詢此表需要有SELECT的權限。
其中的參數含義如下:
- table_name :存儲執行計劃的表名。
- statement_id :SQL語句的ID ,可以使用set statement_id 來指定其ID。如果為null,則表示獲取最近被解釋的SQL的執行計劃。
- format :執行計劃的具體輸出級別 其值有
- 'BASIC' :基本輸出,經輸出執行計劃中每個節點),
- 'TYPICAL' :典型格式輸出,默認格式。該格式輸出每個節點的ID、操作名、節點的數據行、字節數、優化成本等。
- 'SERIAL' :串行執行格式,輸出與典型格式類似。
- 'ALL' :完全格式, 最高用戶級別的輸出格式,除了輸出典型格式的內容,還會輸出投影以及別名的相關信息。
示例如下:
explain plan for
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display())
為了更好的控制執行計劃的輸出格式,如下的關鍵字可以添加到標準格式后面,用來自定義輸出格式以及信息。
- ROWS 輸出優化器估算出的數據行數
- BYTES 輸出優化器估算出的字節數
- COST 輸出優化器估算出的成本
- PARTITION 輸出分區裁剪相關信息
- PREDICATE 輸出謂詞部分相關信息
- PARALLEL 輸出并行操作(PX)相關信息
- PROJECTION 輸出字段映射部分相關信息
- ALIAS 輸出查詢塊/對象 別名相關信息
- REMOTE 輸出分布式查詢相關信息
- NOTE 輸出執行計劃的提醒部分相關信息
示例如下:
explain plan for
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display());
select * from table(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));
select * from table(dbms_xplan.display(null,null,'ALL -PROJECTION -NOTE'));
select * from table(dbms_xplan.display(null,null,'ALL PROJECTION NOTE'));
4.3.2 DISPLAY_CURSOR方法
語法如下
DBMS_XPLAN.DISPLAY_CURSOR(
sql_id in varchar2 default null,--默認獲取會話最后一個游標處的執行計劃
child_number in number default null,--游標的子號
format in varchar2 default 'TYPICAL' --輸出級別,與之前介紹相同
);
此函數可以獲取內存游標緩存處的執行計劃和統計信息。
示例如下:
alter session set statistics_level = all;
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
執行結果:
以下函數使用較少,所以僅介紹其語法及功能。
4.3.3 DISPLAY_AWR
語法如下
DBMS_XPLAN.DISPLAY_AWR(
sql_id IN varchar2
plan_hash_value in number default null,
db_id in number default null,
format in varchar2 default 'TYPICAL');
DISPLAY_AWR函數獲取存儲在AWR歷史庫中SQL語句的執行計劃相關信息。
4.3.4 DISPLAY_PLAN
語法如下
DBMS_XPLAN.DISPLAY_PLAN(
table_name in varchar2 default 'PLAN_TABLE',
statement_id in varchar2 default null,
format in varchar2 default 'TYPICAL',
filter_preds in varchar2 default null,
type in varchar2 default null --輸出類型,其值為'TEXT','ACTIVE','HTML','XML'
);
該函數可獲取執行計劃存儲表的內容。可顯示CLOB類型信息,包括執行計劃以及相關統計信息。
4.3.5 DISPLAY_SQL_PLAN_BASELINE
語法如下
DISPLAY_XPLAN.DISPLAU_SQL_PLAN_BASELINE(
sql_handle in varchar2 := null,
plan_name in varchar2 := null,
format in varchar2 := 'TYPICAL')
return dbms_xpaln_type_table;
此函數和獲取存儲在系統視圖中SQL語句計劃基線的執行計劃相關的信息。
4.3.6 DISPLAY_SQLSET
DBMS_XPLAN.DISPLAY_SQLSET(
sqlset_name in varchar2,
sql_id in varchar2,
plan_hash_value in number := null,
format in varchar2 := 'TYPICAL',
sqlset_owner in varchar2 := null
)
return DBMS_XPLAN_TYPE_TABLE PIPELINED;
此函數獲取存儲在SQL調優集中SQL語句的執行計劃以及相關信息。
4.4 查詢PLAN_TABLE獲取執行計劃
我們可以通過編寫的SQL語句來查詢執行計劃。即直接查詢執行計劃存儲表(默認為PLAN_TABLE)
explain plan SET STATEMENT_ID = 'TEST1' for
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
SELECT ID, PARENT_ID ,OPERATION ,OBJECT_NAME NAME , BYTES ,IO_COST ,CPU_COST
FROM PLAN_TABLE WHERE STATEMENT_ID = 'TEST1' ORDER BY ID ;
或者使用如下SQL查詢
SELECT ID, PARENT_ID ,
LPAD(' ', LEVEL-1)||OPERATION||' '||OPTIONS||' '||OBJECT_NAME NAME
FROM PLAN_TABLE
CONNECT BY prior id = parent_id
and prior statement_id = statement_id
start with id = 0
and statement_id = 'TEST1'
ORDER BY ID ;
結果如下
4.5 跟蹤計劃
通過對SQL語句進行跟蹤,從而獲取相關執行計劃等。
主要方法有SQL_TRACE 和OPTIMIZER_TRACE ,前者會在跟蹤文件里輸出執行計劃及性能統計等相關數據。OPTIMIZER_TRACE 在跟蹤文件里記錄優化器分析、選擇執行計劃的過程。
-
SQL
+關注
關注
1文章
760瀏覽量
44081 -
數據庫
+關注
關注
7文章
3767瀏覽量
64279 -
函數
+關注
關注
3文章
4308瀏覽量
62444 -
GUI
+關注
關注
3文章
650瀏覽量
39553
發布評論請先 登錄
相關推薦
評論