1. 程式人生 > >執行計劃檢視方法(Explain plan)

執行計劃檢視方法(Explain plan)

什麼是執行計劃

所謂執行計劃,顧名思義,就是對一個查詢任務,做出一份怎樣去完成任務的詳細方案。舉個生活中的例子,我從珠海要去英國,我可以

選擇先去香港然後轉機,也可以先去北京轉機,或者去廣州也可以。但是到底怎樣去英國划算,也就是我的費用最少,這是一件值得考究

的事情。同樣對於查詢而言,我們提交的SQL僅僅是描述出了我們的目的地是英國,但至於怎麼去,通常我們的SQL中是沒有給出提示資訊

的,是由資料庫來決定的。

生成執行計劃的方法

1.設定autotrace

序號

命令

解釋

1

SET AUTOTRACE OFF

此為預設值,即關閉Autotrace 

2

SET AUTOTRACE ON EXPLAIN

只顯示執行計劃

3

SET AUTOTRACE ON STATISTICS

 只顯示執行的統計資訊

4

SET AUTOTRACE ON

 包含2,3兩項內容

5

SET AUTOTRACE TRACEONLY

 與ON相似,但不顯示語句的執行結果

例:

SQL> select * from emp; 


執行計劃
----------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------


統計資訊
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1455  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         14  rows processed

2.使用SQL

SQL>EXPLAIN PLAN FOR sql語句;

SQL>SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

SQL> explain plan for select * from emp;
 
Explained
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
 
8 rows selected

OR
 
SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
 
8 rows selected

3.使用Toad,PL/SQL develpoer等工具

這個方法就不詳細介紹了,在工具上找到點一點就行了。

執行計劃中各個列的含義:

在執行計劃中,除了ID、Operation和Name之外,還有其他一些列。這些列的資料是根據需要從PLAN_TABLE、V$SQL_PLAN、V$SQL_PLAN_STATISTICS_ALL等表和檢視中讀取的。它們可以幫助我們進一步理解該執行計劃(例如優化器對各個操作的估算資料、實際執行中各個操作的效能資料等)。以下就是各個列的描述。

Rows/E-Rows:優化器估算出當前操作返回給上一級操作的資料記錄數,如果計劃中同時輸出收集到實際記錄數,則會顯示為E-Rows以和實際記錄數區別,在優化器中,又稱為資料集的勢(Cardinality);

Bytes/E-Bytes:優化器估算出當前操作返回給上一級操作的資料的位元組數,如果計劃中同時輸出收集到實際位元組數,則會顯示為E-Bytes以和實際位元組數區別;

TempSpc/E-Temp:優化器估算出完成當前操作(僅部分操作需要臨時空間,如SORT、Hash Join)所需要的臨時表空間的大小,如果計劃中同時輸出收集到實際臨時空間大小,則會顯示為E-Temp以和實際臨時空間大小區別;

Cost(%CPU):優化器估算出完成當前操作的代價(包含子操作的代價),它是IO代價和CPU代價總和。其中,IO代價是最基本的代價。而對於CPU代價,在預設情況下,優化器會將CPU代價計算在內,並且將CPU代價根據系統配置由特定的轉換公式轉換為IO代價。也可以通過優化器引數_optimizer_cost_model指定是否在代價模型中包括CPU代價。括號中資料即為CPU代價在總代價中的比例;

Time/E-Time:優化器估算出完成當前操作所需要的時間,這個時間是其子操作的累計時間,如果計劃中同時輸出收集到實際時間,則會顯示為E-Time以和實際時間區別;

Pstart:分割槽裁剪(Partition Prunning)後,訪問的起始分割槽,僅在含有分割槽表訪問操作的執行計劃中出現;

Pstop:分割槽裁剪(Partition Prunning)後,訪問的結束分割槽,僅在含有分割槽表訪問操作的執行計劃中出現;

Inst:分散式查詢中,遠端物件所在的資料庫例項名;

TQ:並行查詢中的表佇列(Table Queue),我們會在相關操作中進一步闡述該列資料;

IN-OUT:並行查詢或分散式查詢中資料傳輸方式;

PQ Distrib:並行查詢中,並行服務程序之間的資料分發方式;

Starts:當前操作實際被啟動的次數,如果輸出格式中指定了LAST關鍵字,則為計劃最後一次執行中當前操作實際被啟動的次數,否則為所有被啟動次數總和;

Rows:當前操作實際返回的記錄數,如果輸出格式中指定了LAST關鍵字,則為最後一次執行的記錄數,否則為所有執行的記錄數總和;

Time:執行當前操作的實際時間,如果輸出格式中指定了LAST關鍵字,則為最後一次執行的時間,否則為所有執行的時間總和;

Buffers:當前操作中發生讀記憶體的次數,如果輸出格式中指定了LAST關鍵字,則為最後一次執行的讀記憶體次數,否則為所有執行的讀記憶體次數總和。記憶體讀次數包括一致性讀(Consistent Read,CR)和當前模式讀(Current Get,CU);

Reads:當前操作中發生讀磁碟的次數,如果輸出格式中指定了LAST關鍵字,則為最後一次執行的讀磁碟次數,否則為所有執行的讀磁碟次數總和;

Writes:當前操作中發生寫磁碟的次數,如果輸出格式中指定了LAST關鍵字,則為最後一次執行的寫磁碟次數,否則為所有執行的寫磁碟次數總和;

OMem:當前操作完成所有記憶體工作區(Work Area)操作所總共使用私有記憶體(PGA)中工作區的大小。需要使用記憶體工作區的操作為:雜湊操作,如雜湊分組(Hash Group)、雜湊關聯(Hash Join)和排序(Sort)操作,它們分別佔有工作區中雜湊區(Hash Area)和排序區(Sort Area)進行工作,這個資料是由優化器統計資料以及前一次執行的效能資料估算得出的;

1Mem:當工作區大小無法滿足操作所需要的大小時,需要將部分資料寫入臨時磁碟空間中(如果僅需要寫入一次就可以完成操作,就稱為一次通過,One-Pass;否則為多次通過,Multi-Pass)。該列資料為語句最後一次執行中,單次寫磁碟所需要的記憶體大小,這個資料是由優化器統計資料以及前一次執行的效能資料估算得出的;

Used-Mem:語句最後一次執行中,當前操作所使用的記憶體工作區大小,括號裡面為(發生磁碟交換的次數,1次即為One-Pass,大於1次則為Multi-Pass,如果沒有使用磁碟,則顯示OPTIMAL);

Used-Tmp:語句最後一次執行中,當前操作所使用的臨時段的大小,無法一次在工作區完成操作的資料被臨時寫入該段;

O/1/M:語句所有的執行總共使用記憶體或磁碟完成操作的執行次數,分別是Optimal(優化的,僅適用記憶體完成操作)/One-Pass/Multi-Pass;

Max-Tmp:語句所有執行中,當前操作所使用的臨時段的最大空間。



相關推薦

執行計劃檢視方法Explain plan

什麼是執行計劃 所謂執行計劃,顧名思義,就是對一個查詢任務,做出一份怎樣去完成任務的詳細方案。舉個生活中的例子,我從珠海要去英國,我可以 選擇先去香港然後轉機,也可以先去北京轉機,或者去廣州也可以。但是到底怎樣去英國划算,也就是我的費用最少,這是一件值得考究 的事情。同樣

Oracle 執行計劃Explain Plan 說明

如果要分析某條SQL的效能問題,通常我們要先看SQL的執行計劃,看看SQL的每一步執行是否存在問題。 如果一條SQL平時執行的好好的,卻有一天突然效能很差,如果排除了系統資源和阻塞的原因,那麼基本可以斷定是執行計劃出了問題。        看懂執行計劃也就成了SQL優化的

oracle 執行計劃explain plan說明

        基於oracle的應用系統很多效能問題,是由應用系統sql效能低劣引起的,所以,sql的效能優化很重要,分析與優化sql的效能我們一般通過檢視該sql的執行計劃,本文就如何看懂執行計劃,以及如何通過分析執行計劃對sql進行優化做相應說明。 一、什麼是執行計劃

Oracle SQL執行計劃基線總結SQL Plan Baseline

為了驗證基線中一個處於不可接受狀態的執行計劃是否比一個處於可接受狀態的執行計劃具有更高的效率,必須通過演化來驗證,需要讓優化器以不同的執行計劃來執行這條SQL語句,觀察不可接受狀態的執行計劃基線是否會帶來更好的效能,如果效能確實更高,這個不可接受狀態的基線將會轉換為可接受狀態。演化的方式有兩種:

mysql的sql執行計劃詳解非常有用

引言: 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃描表、怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,

SQL Server 性能調優 之執行計劃Execution Plan調優

mod isp jsb see 環境 指定 logical term alt SQL Server 存在三種 Join 策略:Hash Join,Merge Join,Nested Loop Join。 Hash Join:用來處理沒有排過序/沒有索引的數據,它在內存中把

Pycharm在執行過程中,檢視每個變數的方法show variables

做影象處理的人一般都用過MATLAB,好用易上手,並且裡面封裝了大量的演算法,並且MATLAB裡面有一個很貼心的功能就是你可以隨時檢視變數的值,以及變數的型別是什麼: 在進行程式碼除錯的時候,可以清楚的看到是哪些值出現了問題,但是由於MATLAB的深度學習生態環境還是沒

mysql執行計劃看必會explain講解

explain會看到的資訊 共有10個欄位,下面講逐一講解這10個欄位,我經常看的的是id,type,rows這幾個 1、id 表示查詢中執行select子句或操作表的順序,id執行順序從大到小,即id越大越先被執行,如果id相同,則從上到下 2、select_type

學習代碼檢視方法 摘自某圖片

方法 字符串 路徑 拷貝 就會 溢出 輸入 是否 代碼 看見運算,就檢查整數溢出。 看見拷貝,就檢查越界。 看到字符串輸入,就檢查各種註入。 看到打印信息,就檢查格式話攻擊。 看到文件輸入,就檢查路徑利用。 看到加密算法,就檢查是否安全。 看到開源代碼,就找歷史漏洞。 考見

Java併發程式設計3執行緒掛起、恢復與終止的正確方法含程式碼

JAVA大資料中高階架構 2018-11-06 14:24:56掛起和恢復執行緒Thread 的API中包含兩個被淘汰的方法,它們用於臨時掛起和重啟某個執行緒,這些方法已經被淘汰,因為它們是不安全的,不穩定的。如果在不合適的時候掛起執行緒(比如,鎖定共享資源時),此時便可能會發生死鎖條件——其他執行緒在等待該

終止執行緒的方法不看後悔,看了必懂

在java語言中,可以使用stop()方法和suspend()方法來終止執行緒的執行. 當使用Thread.stop()來終止執行緒時,它會釋放已經鎖定的所有監視資源,具有不安全性 suspend()方法不會釋放鎖,容易發生死鎖(兩個或者兩個以上程序在執行過程中,因爭奪資源而造成程序間互

npm run build 打包後,如何執行在本地檢視效果Nginx服務

        這段時間,有點時間,研究了一下vue 打包的很慢的問題。但是當我 npm run build 打包後,在本地檢視效果的時候,活生生被我老大鄙視了,因為我打開了XAMPP。他說:你怎麼不用Nginx啊?用這個一堆的路徑問題!!!!!! 然後我就去研究了N

javac錯誤:cmd下java命令可以用 javac不是內部或外部命令 也不是可執行的程式 解決方法已解決

在Oracle官網下載JDK安裝; jdk安裝路徑:C:\Java\jdk1.8.0_191;(jre路徑為C:\Java\jre8) 下面設定環境變數(重點): 開啟我的電腦,屬性,系統,高階系統設定,找到環境變數,在系統變數裡新建: JAVA_HOME  &n

Oracle之SQL優化專題01-檢視SQL執行計劃方法

在我2014年總結的“SQL Tuning 基礎概述”中,其實已經介紹了一些檢視SQL執行計劃的方法,但是不夠系統和全面,所以本次SQL優化專題,就首先要系統的介紹一下檢視SQL執行計劃的方法。 本文示例SQL為: --set lines 1000 pages 1000 select a.emp

Java多執行緒----執行緒的同步,鎖和死鎖,問題以及解決方法例子說明

一、執行緒併發同步概念 執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。 執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他

靜態程式碼塊-程式碼塊-構造方法父子類執行順序

public class Fu { static { System.out.println("這是父類靜態程式碼塊"); } { System.o

JAVA中執行緒同步的方法7種彙總

同步的方法: 一、同步方法   即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態

spring在web容器啟動時執行初始化方法四種方式

需求:在tomcat啟動時開啟一個定時任務,或初始化slor索引 想法:容器啟動時執行方法,最容易想到的就是servlet中可以配置load-on-startup,設定一個正整數也就可以隨容器一起啟動。 問題:上面的方法很好,但是由於定時任務需要去操作資料庫,而專案

Java應用程式執行時監控方法——JVMTI的應用

The JVM Tool Interface (JVMTI) 是一個由JVM提供的用於開發針對Java程式開發與監控工具的程式設計介面,通過JVMTI介面(Native API)可以建立代理程式(Agent)以監視和控制 Java 應用程式,包括剖析、除錯、監控

ros訂閱函式的多執行緒使用方法C++: 外部變數控制跳出for迴圈

      最初是想實現接收到某個some_topic然後解析內容,若是內容為指令action,action函式進入for迴圈,若是再接收到some_topic,裡面指令為stop則stop=true停止正在進行的action,跳出for迴圈(想