深入淺出:Oracle 數據庫 SQL 執行計劃查看詳解(1)——基礎概念與查看方式

背景

在當今的軟件開發領域,盡管主流開發模式往往傾向于采用單表模式,力圖盡可能地減少表之間的連接操作,以期達到提高數據處理效率、簡化應用邏輯等目的。然而,對于那些已經上線運行多年的運維老系統而言,它們內部往往遺留了大量的復雜 SQL 語句。這些 SQL 語句在系統初建時,可能是基于當時的業務需求和數據量規模設計與實現。但隨著時間的推移,數據庫中的數據量持續不斷地累積和膨脹,原先執行起來速度較快的 SQL 語句,在面對如今海量的數據時,往往會出現性能大幅下降的情況,甚至可能成為整個系統的性能瓶頸,嚴重影響業務的正常運轉。

因此,在這樣的背景下,對這些關鍵 SQL 語句優化變得重要,而優化的前提則是對SQL進行分析,其重要手段就是查看SQL語句的執行計劃。

本文以Oracle數據庫為例,介紹下如何通過執行計劃來分析和解決問題。

一、什么是執行計劃?

執行計劃是 Oracle 數據庫用于執行 SQL 語句的一系列步驟。它描述了數據庫如何訪問和處理數據,包括表的掃描方式、連接順序、使用的索引等。

需要注意的是,數據庫根據內部的優化器成本模型來生成最優的執行計劃,以期以最快速度、最少資源完成 SQL 語句的執行。因此,并不是添加了索引,實際執行的時候一定會使用索引,數據庫會進行判斷和處理。

二、如何查看執行計劃?

查看執行計劃有以下幾種方式:

V$SQL_PLAN 視圖

首先,通過系統視圖V$SQL 獲取到SQL_ID,

 SELECT * FROM V$SQL order by last_load_time desc

如下圖所示:

然后,通過V$SQL_PLAN 動態性能視圖,查看對應的 SQL 語句的執行計劃。

SELECT * FROM V$SQL_PLAN WHERE SQL_ID = '62v30b9v1fvcc'; 

結果如下圖所示:

這種方式依托于oracle數據庫提供的視圖,操作起來比較繁瑣,且結果也不夠直觀,不推薦。

explain plan 語句

語法

EXPLAIN PLAN FOR 是最基本的查看執行計劃的語法。它將生成的執行計劃存儲在數據字典表中。

分為兩步,第一步我們需要生成執行計劃,可以使用以下語句創建:

EXPLAIN PLAN  SET STATEMENT_ID = 'stmt1' FOR  select * from WEB_LINK where name='Property Sheet Pages';

這條語句會為查詢 WEB_LINK 表中 name 為 Property Sheet Pages 的記錄生成執行計劃,并且將這條計劃標記為 ‘stmt1’。

第二步是查看執行計劃,通過查詢 PLAN_TABLE 表來查看具體的執行計劃。

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'stmt1', 'ALL')); 

這里 DBMS_XPLAN.DISPLAY 函數用于格式化和顯示存儲在 PLAN_TABLE 中的執行計劃,參數 ‘PLAN_TABLE’ 指明存儲計劃的表,‘stmt1’ 是之前指定的標記,‘ALL’ 表示顯示所有信息,包括基本節點信息、成本、分區信息等。

執行結果如下:

Plan hash value: 506061415--------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |            |     1 |   165 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| WEB_LINK   |     1 |   165 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | WEB_LINK_N |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------1 - SEL$1 / WEB_LINK@SEL$12 - SEL$1 / WEB_LINK@SEL$1Predicate Information (identified by operation id):
---------------------------------------------------2 - access("NAME"='Property Sheet Pages')Column Projection Information (identified by operation id):
-----------------------------------------------------------1 - "WEB_LINK"."IDENTITY"[VARCHAR2,20], "WEB_LINK"."DESCRIPTION"[VARCHAR2,255], "WEB_LINK"."GROUP_ID"[VARCHAR2,30], "WEB_LINK"."MODIFIABLE"[VARCHAR2,1], "WEB_LINK"."MODIFIED_ON"[DATE,7], "WEB_LINK"."MODIFIED_BY"[VARCHAR2,30], "WEB_LINK"."REMOVEFLAG"[VARCHAR2,1], "NAME"[VARCHAR2,100], "WEB_LINK"."URL"[VARCHAR2,255], "WEB_LINK"."SEPARATE_WINDOW"[VARCHAR2,1]2 - "WEB_LINK".ROWID[ROWID,10], "NAME"[VARCHAR2,100]

這種方式相比第一種,無論是便捷性,還是直觀性都要好上不少。

自動執行計劃

在 SQL*Plus 中,可以通過設置 AUTOTRACE打開自動追溯功能后,來自動顯示執行計劃,包括操作步驟、行數預估、字節預估和成本等信息。

在 SQL Developer 中,執行 SQL 語句后,可以在 “執行計劃” 選項卡中查看圖形化或詳細文本形式的執行計劃,非常直觀方便。

該方式的便捷性和直觀性最佳,推薦采用該方式來查看執行計劃。

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

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

相關文章

每天掌握一個Linux命令 - fail2ban

Linux 命令工具 fail2ban 使用指南 目錄 Linux 命令工具 fail2ban 使用指南一、工具概述二、安裝方式1. 包管理器安裝(推薦)Debian/Ubuntu 系統CentOS/RHEL 系統Arch Linux 系統 2. 手動編譯安裝(適用于自定義需求) 三、核心功能四…

互聯網大廠智能體平臺體驗筆記字節扣子羅盤、阿里云百煉、百度千帆 、騰訊元器、TI-ONE平臺、云智能體開發平臺

互聯網大廠 字節扣子、阿里云百煉、百度千帆 、騰訊元器、TI-ONE平臺、云智能體開發平臺 體驗 開始動手 了解 智能體,發現已經落后時代太遠 光頭部互聯網大廠對開 公開的平臺就已經這么多,可以學習和了解,相關的信息 整理了對應的平臺地址…

ansible-playbook 進階 接上一章內容

1.異常中斷 做法1:強制正常 編寫 nginx 的 playbook 文件 01-zuofa .yml - hosts : web remote_user : root tasks : - name : create new user user : name nginx-test system yes uid 82 shell / sbin / nologin - name : test new user shell : gete…

LRC and VIP

//首先排除所有數相等的情況,再把最大值放在一個組&#xff0c;那么最大值的gcd就等于其本身&#xff0c;再判斷剩下的gcd是否等于最大值就可以了 #include<bits/stdc.h> using namespace std;const int N1e3100; int a[N]; map<int,int>mapp; int main(){int t;ci…

企業應用AI對向量數據庫選型思考

一、向量數據庫概述 向量數據庫是一種專門用于存儲和檢索高維向量數據的數據庫系統&#xff0c;它能夠高效地處理基于向量相似性的查詢&#xff0c;如最近鄰搜索等&#xff0c;在人工智能、機器學習等領域的應用中發揮著重要作用&#xff0c;為處理復雜的向量數據提供了有力的…

設計模式——迭代器設計模式(行為型)

摘要 本文詳細介紹了迭代器設計模式&#xff0c;這是一種行為型設計模式&#xff0c;用于順序訪問集合對象中的元素&#xff0c;同時隱藏集合的內部結構。文章首先定義了迭代器設計模式并闡述了其核心角色&#xff0c;包括迭代器接口、具體迭代器、容器接口和具體容器。接著&a…

Java8 list集合根據屬性分組

在Java8中&#xff0c;可以使用Collectors.groupingBy方法對List集合根據屬性進行分組。以下是一個完整的示例&#xff0c;展示如何根據對象的不同屬性分組。 根據對象屬性分組 假設有一個Student類&#xff0c;包含name、age和grade屬性&#xff1a; public class Student …

更新已打包好的 Spring Boot JAR 文件中的 class 文件

# 1. 解壓原始 JAR unzip -q original-app.jar -d temp # 2. 替換 class 文件 cp ~/projects/new-classes/*.class temp/BOOT-INF/classes/com/example/ # 3. 保留原始清單 cp temp/META-INF/MANIFEST.MF . # 4. 重新打包 jar -cf0m new-app.jar MANIFEST.MF -C temp/ . # …

《HelloGitHub》第 110 期

興趣是最好的老師&#xff0c;HelloGitHub 讓你對開源感興趣&#xff01; 簡介 HelloGitHub 分享 GitHub 上有趣、入門級的開源項目。 github.com/521xueweihan/HelloGitHub 這里有實戰項目、入門教程、黑科技、開源書籍、大廠開源項目等&#xff0c;涵蓋多種編程語言 Python、…

當 “歐洲版 Cursor” 遇上安全危機

在 AI 編程助手蓬勃發展的當下&#xff0c;安全問題正成為行業不容忽視的隱憂。近期&#xff0c;AI 編程助手公司 Replit 與號稱 “歐洲版 Cursor” 的 Lovable 之間&#xff0c;因安全漏洞問題掀起了一場風波&#xff0c;引發了業界的廣泛關注。? Replit 的員工 Matt Palmer…

centos掛載目錄滿但實際未滿引發系統宕機

測試服務器應用系統突然掛了&#xff0c;經過排查發現是因為磁盤“滿了”導致的&#xff0c;使用df -h查看磁盤使用情況/home目錄使用率已經到了100%,但使用du -sh /home查看發現實際磁盤使用還不到1G&#xff0c;推測有進程正在寫入或占用已刪除的大文件&#xff08;Linux 系統…

乾坤qiankun的使用

vue2 為主應用 react 為子應用 在項目中安裝乾坤 yarn add qiankun # 或者 npm i qiankun -Svue主應用 在main.js中新增 &#xff08;需要注意的是路由模型為history模式&#xff09; registerMicroApps([{name: reactApp,entry: //localhost:3011,container: #container,/…

PostgreSQL的擴展 auth_delay

PostgreSQL的擴展 auth_delay auth_delay 是 PostgreSQL 提供的一個安全相關擴展&#xff0c;主要用于防止暴力破解攻擊。它通過在認證失敗后引入人為延遲來增加暴力破解的難度。 一、擴展基礎 功能&#xff1a;在認證失敗后增加延遲目的&#xff1a;減緩暴力破解和字典攻擊…

Web前端為什么要打包?Webpack 和 Vite 如何助力現代開發?

一. 為什么要使用框架庫? 1.1 傳統網頁與現代前端的差異 在最早期的網頁開發中,我們只需要寫幾個.html文件,配上.css和.js文件,瀏覽器直接加載就能展現頁面,每個文件都是獨立的靜態資源,簡單且直觀 但現在網站越來越復雜了: 需要用到最新的js語法(比如ES6)使用框架(Vue…

使用pdm+uv替換poetry

用了好幾年poetry了&#xff0c;各方面都還挺滿意&#xff0c;就是lock實在太慢&#xff1b; 已經試用pdmuv一段時間了&#xff0c;確實是快&#xff0c;也基本能覆蓋poetry的功能。 至于為什么用pdmuv&#xff0c;而不是只用uv&#xff0c;原因很多&#xff0c;有興趣的可以…

java后端生成心電圖-jfreechart

用jfreechart生成心電圖 先上成功的圖片 上代碼 1.導入包 implementation org.jfree:jfreechart:1.5.4implementation org.jfree:jcommon:1.0.242.實現代碼 對數據進行濾波 轉換單位 package com.shinrun.infrastructure.util;import java.util.ArrayList; import java.ut…

微軟Build 2025:Copilot Studio升級,解鎖多智能體協作未來

微軟Build 2025大會圓滿落幕&#xff0c;作為年度科技盛會&#xff0c;它一直是開發與AI技術突破性創新的重要展示平臺。對于工程師、創作者和領域專家來說&#xff0c;這是了解微軟生態未來動向的關鍵時刻。今年&#xff0c;Microsoft Copilot Studio推出了一系列新功能&#…

LabVIEW雜草識別與精準噴灑

基于LabVIEW構建了一套集成機器視覺、智能決策與精準控制的農業雜草識別系統。通過高分辨率視覺傳感器采集作物圖像&#xff0c;利用 LabVIEW 的 NI Vision 模塊實現圖像顏色匹配與特征分析&#xff0c;結合 Arduino 兼容的工業級控制硬件&#xff0c;實現雜草定位與除草劑精準…

使用 Akamai 分布式云與 CDN 保障視頻供稿傳輸安全

作者簡介&#xff1a;David Eisenbacher 是 EZDRM 公司的首席執行官兼聯合創始人&#xff0c;該公司是首家提供 "DRM 即服務" 的企業。作為 CEO&#xff0c;David 始終秉持為企業確立的使命&#xff1a;為視頻服務商提供簡潔有效的數字版權管理方案&#xff0c;助力其…

javascript 實戰案例 二級聯動下拉選框

本案例完全使用原生javascript實現&#xff0c;使用時只需填充platform_list二維數組即可&#xff0c;platform_list填充規則如下&#xff1a; [‘一級選項1’,‘二級選項11’,‘二級選項12’,‘二級選項13’,‘二級選項14’,…], [‘一級選項2’,‘二級選項21’,‘二級選項22’…