Oracle獲取執行計劃之EXPLAIN PLAN 技術詳解

#Oracle? #執行計劃? #EXPLAIN PLAN

一、引言

在Oracle數據庫性能優化中,?執行計劃(Execution Plan)?是理解SQL語句如何被數據庫處理的關鍵工具。EXPLAIN PLAN是Oracle提供的一種靜態分析SQL執行路徑的方法,它通過生成邏輯執行計劃幫助開發者和DBA預測SQL的性能表現,而無需實際執行SQL語句。本文將深入探討EXPLAIN PLAN的原理、使用場景、操作步驟及最佳實踐,并結合DBA_OBJECTS表提供完整案例。

二、EXPLAIN PLAN 的核心原理

  • ?靜態分析?:EXPLAIN PLAN不會實際執行SQL,而是將優化器生成的執行計劃寫入PLAN_TABLE(系統臨時表)。
  • ?無副作用?:適合測試敏感操作(如DDL、DML)的執行計劃,避免對生產數據產生影響。
  • ?依賴優化器統計信息?:執行計劃的準確性高度依賴表和索引的統計信息(如行數、塊數、直方圖等)。

三、使用 EXPLAIN PLAN 的步驟

1. ?準備環境?

1.1 確認 PLAN_TABLE 存在

默認情況下,Oracle會通過腳本UTLXPLAN.SQL創建PLAN_TABLE。若表不存在,需以DBA身份執行:

@?/rdbms/admin/utlxplan.sql

1.2 權限要求

用戶需具備以下權限:

  • SELECT ANY TABLE(訪問目標表如DBA_OBJECTS)
  • CREATE SESSION(登錄數據庫)

2. ?基本語法

EXPLAIN PLAN FOR [SQL語句];SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

關于DBMS_XPLAN.DISPLAY包的使用,會在專題文章中詳解說明。

四、實戰案例

1. ?案例背景?

假設需要分析以下SQL的執行計劃,查詢TEST1表中所有類型為TABLE的對象:

create table test1 as select * from dba_objects;select count(1) from test1;COUNT(1)
----------86259

2. ?生成執行計劃?

2.1 使用 EXPLAIN PLAN

SQL> explain plan for SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE FROM TEST1 WHERE OBJECT_TYPE = 'TABLE';Explained.-- 查看執行計劃
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'BASIC'));

2.2 輸出解析

示例輸出:

   SQL> 
set linesize 1000
set pages 1000
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'ALL'));PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4122059633---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |  2013 |   176K|   336   (1)| 00:00:05 |
|*  1 |  TABLE ACCESS FULL| TEST1 |  2013 |   176K|   336   (1)| 00:00:05 |
---------------------------------------------------------------------------Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------1 - SEL$1 / TEST1@SEL$1Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("OBJECT_TYPE"='TABLE')Column Projection Information (identified by operation id):
-----------------------------------------------------------1 - "OBJECT_NAME"[VARCHAR2,128], "OBJECT_ID"[NUMBER,22],"OBJECT_TYPE"[VARCHAR2,19]Note
------ dynamic sampling used for this statement (level=2)28 rows selected.

?關鍵字段說明?:

  • ?Id?:步驟編號,根節點為0。
  • ?Operation?:操作類型(如全表掃描TABLE ACCESS FULL)。
  • ?Name?:涉及的索引或表名
  • Rows?:優化器估算的返回行數。
  • ?Cost?:總成本。

五、關于explian plan底層原理

在Oracle 10g及更高版本中,當對目標SQL執行explain plan命令時 ,Oracle會把解析該SQL所生成執行計劃的具體執行步驟,寫入PLAN_TABLE$表。PLAN_TABLE$是一個提交時保留行的全局臨時表(ON COMMIT PRESERVE ROWS GLOBAL TEMPORARY TABLE)。這就使得各個會話(Session)只能看到自己執行SQL產生的執行計劃,而且不同會話往PLAN_TABLE$寫入執行計劃的操作互不干擾。后續執行select * from table(dbms_xplan.display) ,只是將PLAN_TABLE$的執行步驟以格式化形式展示出來。

1、PLAN_TABLE$

查看表定義

SQL> set long 90000
set heading off
set serveroutput on size 1000000
select dbms_metadata.get_ddl('TABLE', 'PLAN_TABLE$', 'SYS') from dual;CREATE GLOBAL TEMPORARY TABLE "SYS"."PLAN_TABLE$"(    "STATEMENT_ID" VARCHAR2(30),"PLAN_ID" NUMBER,"TIMESTAMP" DATE,"REMARKS" VARCHAR2(4000),"OPERATION" VARCHAR2(30),"OPTIONS" VARCHAR2(255),"OBJECT_NODE" VARCHAR2(128),"OBJECT_OWNER" VARCHAR2(30),"OBJECT_NAME" VARCHAR2(30),"OBJECT_ALIAS" VARCHAR2(65),"OBJECT_INSTANCE" NUMBER(*,0),"OBJECT_TYPE" VARCHAR2(30),"OPTIMIZER" VARCHAR2(255),"SEARCH_COLUMNS" NUMBER,"ID" NUMBER(*,0),"PARENT_ID" NUMBER(*,0),"DEPTH" NUMBER(*,0),"POSITION" NUMBER(*,0),"COST" NUMBER(*,0),"CARDINALITY" NUMBER(*,0),"BYTES" NUMBER(*,0),"OTHER_TAG" VARCHAR2(255),"PARTITION_START" VARCHAR2(255),"PARTITION_STOP" VARCHAR2(255),"PARTITION_ID" NUMBER(*,0),"OTHER" LONG,"OTHER_XML" CLOB,"DISTRIBUTION" VARCHAR2(30),"CPU_COST" NUMBER(*,0),"IO_COST" NUMBER(*,0),"TEMP_SPACE" NUMBER(*,0),"ACCESS_PREDICATES" VARCHAR2(4000),"FILTER_PREDICATES" VARCHAR2(4000),"PROJECTION" VARCHAR2(4000),"TIME" NUMBER(*,0),"QBLOCK_NAME" VARCHAR2(30)) ON COMMIT PRESERVE ROWS

2、測試explain plan與PLAN_TABLE$

2.1 使用explain plan對目標SQL解析

SQL>
select sid from v$mystat where rownum<2;SID
----------23explain plan for SELECT OBJECT_ID, OBJECT_NAME, OBJECT_TYPE FROM TEST1 WHERE OBJECT_TYPE = 'TABLE';Explained.

2.2 查看PLAN_TABLE$信息

SQL>
set linesize 1000
col OPERATION for a20
col OPTIONS for a20
col OBJECT_NAME for a20
select operation,options,object_name,id,cardinality,cost from sys.plan_table$;OPERATION            OPTIONS              OBJECT_NAME                  ID CARDINALITY       COST
-------------------- -------------------- -------------------- ---------- ----------- ----------
SELECT STATEMENT                                                        0        2013        336
TABLE ACCESS         FULL                 TEST1                         1        2013        336

2.3 查看session、事務和對象關系

  • 當前session產生的事務
SQL> select saddr from v$session where sid=23;SADDR
----------------
00000000924403A0select count(1) from v$transaction where SES_ADDR='00000000924403A0';COUNT(1)
----------1
  • 查看產生事務的對象
 select object_id from v$locked_object where session_id=23;OBJECT_ID
----------5187select owner,object_name from dba_objects where object_id=5187;OWNER                          OBJECT_NAME
------------------------------ --------------------
SYS                            PLAN_TABLE$
  • 對比其它事務
SQL> select sid from v$mystat where rownum<2;SID
----------35SQL> SQL> select count(1) from sys.plan_table$;COUNT(1)
----------0

其它事務中沒有任何執行計劃相關信息。

從上面的實驗可能看出:在Oracle 10g及以上版本中,explain plan命令執行后會將解析目標SQL所產生的執行計劃具體步驟寫入 PLAN_TABLE$表,而 select * from table(dbms_xplan.display) 則是從 PLAN_TABLE$ 表中以格式化方式展示這些執行步驟,幫助用戶了解SQL執行計劃,以便優化SQL。

五、EXPLAIN PLAN 的優缺點

1. ?優點?

  • ?零風險?:不執行SQL,避免對生產環境造成影響。
  • ?輕量級?:適合快速驗證復雜查詢(如多表關聯、子查詢)的計劃。
  • ?兼容性?:適用于所有Oracle版本。

2. ?缺點?

  • ?依賴統計信息?:若統計信息過期,生成的計劃可能不準確。
  • ?不執行實際語句?:無法捕獲運行時問題(如鎖等待、死鎖)。

六、總結

EXPLAIN PLAN是Oracle性能調優的基礎工具,通過靜態分析幫助開發者理解優化器的決策邏輯。結合DBA_OBJECTS表的案例實踐,可快速掌握其核心用法。盡管它無法替代動態監控工具(如AWR、SQL Trace),但在SQL開發階段和敏感操作測試中具有不可替代的作用。實際應用中,需結合統計信息維護和多工具交叉驗證,才能全面解決性能問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909819.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909819.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909819.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【論文閱讀】Qwen2.5-VL Technical Report

Arxiv:https://arxiv.org/abs/2502.13923 Source code:https://github.com/QwenLM/Qwen2.5-VL Author’s Institution&#xff1a;Alibaba 背景 多模態大模型 多模態大模型MultiModal Large Language Models (MM-LLMs) 的發展可以通過一篇綜述了解&#xff1a;MM-LLMs: Re…

vue中computed和watch區別

在 Vue 中&#xff0c;computed 和 watch 都是用來響應式地處理數據變化的工具&#xff0c;但它們的用途和行為有明顯區別。 &#x1f50d; 一句話總結 computed&#xff1a;用于聲明式計算屬性&#xff0c;有緩存。 watch&#xff1a;用于監聽響應式數據的變化并執行副作用邏…

大語言模型:提示詞決定自我反思效果: “檢查回答是否錯誤” “驗證回答是否正確”

大語言模型(LLMs)自我反思的結果很容易受提示詞構造的影響 大型語言模型(LLMs)展現出令人印象深刻的零樣本和少樣本推理能力。有人提出,這些能力可以通過自我反思來提升,即讓大型語言模型反思自己的輸出,以識別和糾正初始回答中的錯誤。然而,盡管有一些證據表明自我反…

【iReport】實際開發中,解決iReport中打印圖片不顯示問題

ireport 中增加圖片&#xff0c;添加上屬性&#xff0c;但是運行時報錯如下&#xff0c;是屬性logoPath沒有聲明到map中 1. Parameter not found : logoPath net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Parameter not fo…

【MySQL進階】常用MySQL程序

目錄 一. mysqlcheck——表維護程序 1.1.作用 1.2 注意事項 1.3 使用方法 1.4 常用選項 1.5 mysqlcheck的特殊使用 二. mysqldump——數據庫備份程序 2.1.作用 2.2 注意事項 2.3 使用方法 2.4 常用選項 三. mysqladmin——MySQL 服務器管理程序 3.1.作用 3.2 使用…

EMQX高效存儲消息到MySQL指南

配置 EMQX 存儲消息到 MySQL EMQX 可以通過規則引擎和數據橋接功能將消息和事件存儲到 MySQL 數據庫。以下是具體實現方法&#xff1a; 創建 MySQL 數據表 在 MySQL 中創建用于存儲消息的表結構&#xff1a; CREATE TABLE mqtt_messages (id int(11) NOT NULL AUTO_INCREME…

springboot項目,利用docker打包部署

Windows WSL2 Docker Desktop 部署 SpringBoot 項目指南 &#xff08;沒有安裝docker的&#xff0c;如果是windows家庭中文版的&#xff0c;可以看我上一篇帖子&#xff1a;windows家庭版安裝docker和redis-CSDN博客&#xff09; 本教程將說明如何在 Windows 系統 下&#…

MO+內核32位普冉單片機PY32F003開發板

PY32F003開發板是基于普冉半導體PY32F003微控制器設計的低成本入門級開發工具&#xff0c; PY32F003系列微控制器采用高性能的 32 位ARM Cortex-M0內核&#xff0c;寬電壓工作范圍的 MCU。嵌入高達32Kbytes flash 和 4Kbytes SRAM 存儲器&#xff0c;最高工作頻率 32MHz。PY32…

MySql 用存儲過程刪除所有用戶表

用拼接語句總是會出問題 -- 1. 禁用外鍵約束&#xff08;防止級聯刪除失敗&#xff09;[1]() SET SESSION FOREIGN_KEY_CHECKS 0; -- 2. 生成并執行刪除語句&#xff08;替換 your_database_name&#xff09; SELECT CONCAT(DROP TABLE IF EXISTS , TABLE_NAME, ;) -- 預覽語…

Java八股文——MySQL「鎖篇」

講一下MySQL里有哪些鎖&#xff1f; 面試官您好&#xff0c;MySQL中的鎖機制非常豐富&#xff0c;它是保證數據一致性和并發安全的核心。我通常會從鎖的粒度&#xff08;加鎖范圍&#xff09; 和鎖的模式&#xff08;功能&#xff09; 這兩個維度來理解它們。 第一維度&#…

B站精品課程

【Python并發編程】線程&#xff0c;進程&#xff0c;協程&#xff0c;線程安全&#xff0c;多線程&#xff0c;死鎖&#xff0c;線程池等與案例解析&#xff0c;從入門到精通 https://www.bilibili.com/video/BV1EfdcYmEff/?spm_id_from333.337.search-card.all.click&v…

# ubuntu中安裝使用五筆輸入法

先 清理舊輸入法并重新安裝 fcitx5 五筆輸入法&#x1f447; &#x1f4e6; 第一步&#xff1a;清理舊的 Fcitx5 及相關輸入法組件 sudo apt purge fcitx* mozc* ibus* -y sudo apt autoremove --purge -y&#x1f4dd; 說明&#xff1a; fcitx* 會清除舊版本 Fcitx/Fcitx5。…

LSM樹與B+樹優缺點分析

1. LSM樹優化了順序寫&#xff0c;因此寫性能很好&#xff0c;但在查詢上&#xff1a; 需要從Level 0到Level n一直順序查下去。極端情況是LSM樹中不存在該數據&#xff0c;則需要遍歷L0->Ln&#xff0c;最后返回空集。 解決方法是用布隆過濾器優化查詢。 2. B樹范圍查詢性…

【成都魚住未來身份證】 身份證讀取與解析———未來之窗行業應用跨平臺架構——智能編程——仙盟創夢IDE

讀取身份證開發配置 function readerid魚住未來科技(){const webUrl http:// "127.0.0.1:30004" /api/info$.ajax({url: webUrl,type: GET,dataType: json,success: function (result) {// processContent.text(web api接口&#xff1a; webUrl 讀取身份證信息…

開啟并連接redis以及端口占用問題

開啟命令行 redis-server.exe redis.windows.conf 端口占用問題 查看端口&#xff1a; 輸入命令行&#xff1a; netstat -ano | findstr :6379 找到并停止pid號&#xff1a; 這個要用到cmd管理員身份打開 taskkill /f /pid 你的端口號 重新開啟就行了 再用另一個cmd進行連…

MCP數據可視化服務器配置依賴

# requirements.txt # MCP數據可視化服務器依賴包# 核心MCP包 mcp>=0.1.0# 數據處理 pandas>=2.0.0 numpy>=1.24.0# 可視化 matplotlib>=3.7.0 seaborn>=0.12.0# 異步支持 asyncio-mqtt>=0.13.0# JSON處理 jsonschema>=4.17.0# 圖像處理 Pillow>=9.5.0…

量化面試綠皮書:14. 鐘表零件

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 14. 鐘表零件 一個時鐘(順時針編號為 1-12)從墻上掉了下來&#xff0c;摔成三塊你發現每塊上的數字之和是相等的。 Q: 每塊上的數字是多少&…

AndroidR平臺ToastPresenter引出BinderProxy泄漏

一、問題描述 針對SA8155車機系統Qnx+Android,自動化測試模擬發送CAN信號測試,壓測報出多例BinderProxy leak引起system_server重啟 問題1 [CRASH] system_server osVersion: V1.2.***,提交時間:2025-06-05 ***,復現了2次java.lang.AssertionError: Binder ProxyMap has…

windows11中切換到其他桌面再切回當前桌面,任務欄的WPS有好幾個窗口

感謝知乎的網友 原文鏈接 新建一個后綴為 .reg 的文本文件&#xff0c;將以下內容粘貼進去&#xff0c;保存&#xff0c;然后雙擊運行 Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\kingsoft\Office\6.0\wpsoffice\Application Settings]"enable_m…

從匯編的角度揭開C++ this指針的神秘面紗(下)

<接上篇> 我們接著來看一段C的代碼&#xff1a; class A { public:int func(int j){return j _i;} private:int _i; };int main() {A a;a.func(3);return 0; } 這里定義了一個類A&#xff0c;在main函數中定義了A類的對像a。同時用a調用了成員函數func。我們來看一…