日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ORACLE数据库查看执行计划

發(fā)布時間:2025/4/9 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORACLE数据库查看执行计划 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于ORACLE的應(yīng)用系統(tǒng)很多性能問題,是由應(yīng)用系統(tǒng)SQL性能低劣引起的,所以,SQL的性能優(yōu)化很重要,分析與優(yōu)化SQL的性能我們一般通過查看該SQL的執(zhí)行計劃,本文就如何看懂執(zhí)行計劃,以及如何通過分析執(zhí)行計劃對SQL進(jìn)行優(yōu)化做相應(yīng)說明。

一、什么是執(zhí)行計劃(explain plan)

執(zhí)行計劃:一條查詢語句在ORACLE中的執(zhí)行過程或訪問路徑的描述。

二、如何查看執(zhí)行計劃

1: 在PL/SQL下按F5查看執(zhí)行計劃。第三方工具toad等。

很多人以為PL/SQL的執(zhí)行計劃只能看到基數(shù)、優(yōu)化器、耗費等基本信息,其實這個可以在PL/SQL工具里面設(shè)置的??梢钥吹胶芏嗥渌畔?#xff0c;如下所示

2: 在SQL*PLUS(PL/SQL的命令窗口和SQL窗口均可)下執(zhí)行下面步驟

?

SQL>EXPLAIN PLAN FORSELECT * FROM SCOTT.EMP; --要解析的SQL腳本SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

?

?

3: 在SQL*PLUS下(有些命令在PL/SQL下無效)執(zhí)行如下命令:

?

SQL>SET TIMING ON             --控制顯示執(zhí)行時間統(tǒng)計數(shù)據(jù)SQL>SET AUTOTRACE ON EXPLAIN       --這樣設(shè)置包含執(zhí)行計劃、腳本數(shù)據(jù)輸出,沒有統(tǒng)計信息SQL>執(zhí)行需要查看執(zhí)行計劃的SQL語句SQL>SET AUTOTRACE OFF           --不生成AUTOTRACE報告,這是缺省模式SQL> SET AUTOTRACE ON           --這樣設(shè)置包含執(zhí)行計劃、統(tǒng)計信息、以及腳本數(shù)據(jù)輸出SQL>執(zhí)行需要查看執(zhí)行計劃的SQL語句SQL>SET AUTOTRACE OFFSQL> SET AUTOTRACE TRACEONLY      --這樣設(shè)置會有執(zhí)行計劃、統(tǒng)計信息,不會有腳本數(shù)據(jù)輸出SQL>執(zhí)行需要查看執(zhí)行計劃的SQL語句SQL>SET AUTOTRACE TRACEONLY STAT --這樣設(shè)置只包含有統(tǒng)計信息SQL>執(zhí)行需要查看執(zhí)行計劃的SQL語句

?

SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]

參考文檔:SQLPlus User’s Guide and Reference Release 11.1

注意:PL/SQL Developer 工具并不完全支持所有的SQL*Plus命令,像SET AUTOTRACE ON 就如此,在PL/SQL Developer工具下執(zhí)行此命令會報錯

SQL> SET AUTOTRACE ON;

Cannot SET AUTOTRACE

4:SQL_TRACE可以作為參數(shù)在全局啟用,也可以通過命令形式在具體SESSION啟用

4.1 在全局啟用,在參數(shù)文件(pfile/spfile)中指定SQL_TRACE =true,在全局啟用SQL_TRACE時會導(dǎo)致所有進(jìn)程活動被跟蹤,包括后臺進(jìn)程以及用戶進(jìn)程,通常會導(dǎo)致比較嚴(yán)重的性能問題,所以在生產(chǎn)環(huán)境要謹(jǐn)慎使用。

提示:通過在全局啟用SQL_TRACE, 我們可以跟蹤到所有后臺進(jìn)程的活動,很多在文檔中的抽象說明,通過跟蹤文件的實時變化,我們可以清晰的看到各個進(jìn)程間的緊密協(xié)調(diào)。

4.2在當(dāng)前SESSION級別設(shè)置,通過跟蹤當(dāng)前進(jìn)程可以發(fā)現(xiàn)當(dāng)前操作的后臺數(shù)據(jù)庫遞歸活動(這在研究數(shù)據(jù)庫新特性時尤其有效),研究SQL執(zhí)行時,發(fā)現(xiàn)后臺

錯誤等。

?

SQL> ALTER SESSION SET SQL_TRACE=TRUE;SQL> SELECT * FROM SCOTT.EMP;SQL> ALTER SESSION SET SQL_TRACE =FALSE;

?

那么此時如何查看相關(guān)信息?不管你在SQL*PLUS抑或PL/SQL DEVELOPER工具里面執(zhí)行上面腳本過后都看不到什么信息,你可以通過下面腳本查詢到trace日志信息

?

SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' ||P.SPID || '.trc' TRACE_FILE_NAMEFROM( SELECT P.SPIDFROM V$MYSTAT M, V$SESSION S, V$PROCESS PWHERE M.STATISTIC# =1AND S.SID = M.SIDAND P.ADDR = S.PADDR) P,( SELECT T.INSTANCEFROM V$THREAD T, V$PARAMETER VWHERE V.NAME ='thread'AND (V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE))) I,(SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T

?

?

?

TKPROF的幫助信息如下

?

TKPROF 選項 選項 說明 TRACEFILE 跟蹤輸出文件的名稱 OUTPUTFILE 已設(shè)置格式的文件的名稱 SORT=option 語句的排序順序 PRINT=n 打印前 n 個語句 EXPLAIN=user/password 以指定的用戶名運(yùn)行 EXPLAIN PLAN INSERT=filename 生成 INSERT 語句 SYS=NO 忽略作為用戶 sys 運(yùn)行的遞歸 SQL 語句 AGGREGATE=[Y|N] 如果指定 AGGREGATE = NO TKPROF 不聚集相同 SQL 文本的多個用戶 RECORD=filename 記錄在跟蹤文件中發(fā)現(xiàn)的語句 TABLE=schema.tablename 將執(zhí)行計劃放入指定的表而不是缺省的PLAN_TABLE 可以在操作系統(tǒng)中鍵入 tkprof 以獲得所有可用選項和輸出的列表 注 排序選項有 排序 選項說明 prscnt execnt fchcnt 調(diào)用分析執(zhí)行提取的次數(shù) prscpu execpu fchcpu 分析執(zhí)行提取所占用的 CPU 時間 prsela exela fchela 分析執(zhí)行提取所占用的時間 prsdsk exedsk fchdsk 分析執(zhí)行提取期間的磁盤讀取次數(shù) prsqry exeqry fchqry 分析執(zhí)行提取期間用于持續(xù)讀取的緩沖區(qū)數(shù) prscu execu fchcu 分析執(zhí)行提取期間用于當(dāng)前讀取的緩沖區(qū)數(shù) prsmis exemis 分析執(zhí)行期間庫高速緩存未命中的次數(shù) exerow fchrow 分析執(zhí)行期間處理的行數(shù) userid 分析游標(biāo)的用戶的用戶 ID TKPROF 統(tǒng)計數(shù)據(jù) Count: 執(zhí)行調(diào)用數(shù) CPU: CPU 的使用秒數(shù) Elapsed: 總共用去的時間 Disk: 物理讀取次數(shù) Query: 持續(xù)讀取的邏輯讀取數(shù) Current: 當(dāng)前模式下的邏輯讀取數(shù) Rows: 已處理行數(shù) TKPROF 統(tǒng)計信息 統(tǒng)計 含義 Count 分析或執(zhí)行語句的次數(shù)以及為語句發(fā)出的提取調(diào)用數(shù) CPU 每個階段的處理時間以秒為單位如果在共享池中找到該語句對于分析階段為 0 Elapsed 占用時間以秒為單位通常不是非常有用因為其它進(jìn)程影響占用時間 Disk 從數(shù)據(jù)庫文件讀取的物理數(shù)據(jù)塊如果該數(shù)據(jù)被緩沖則該統(tǒng)計可能很低 Query 為持續(xù)讀取檢索的邏輯緩沖區(qū)通常用于 SELECT 語句 Current 在當(dāng)前模式下檢索的邏輯緩沖區(qū)通常用于 DML 語句 Rows 外部語句所處理的行對于 SELECT 語句在提取階段顯示它對于 DML 語句在執(zhí)行階段顯示它 Query 和Current 的總和為所訪問的邏輯緩沖區(qū)的總數(shù)

?

執(zhí)行下面命令:tkprof D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.trc h:\out.txtoutputfile explain=etl/etl

執(zhí)行上面命令后,可以查看生成的文本文件

View Code

?

4.3跟蹤其它用戶的進(jìn)程,在很多時候我們需要跟蹤其它用戶的進(jìn)程,而不是當(dāng)前用戶,可以通過ORACLE提供的系統(tǒng)包

DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION來完成。

例如:

?

SELECT SID, SERIAL#, USERNAME FROM V$SESSION WHERE USERNAME = 'ETL'EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(61,76,TRUE);EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(61,76,FALSE);

?

?

?

5 利用10046事件

ALTER SESSION SET TRACEFILE_IDENTIFIER = 10046;ALTER SESSION SET EVENTS='10046 trace name context forever, level 8';SELECT * FROM SCOTT.EMP;ALTER SESSION SET EVENTS ='10046 trace name context off';然后你可以用腳本查看追蹤文件的位置SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' ||P.SPID || '.trc' TRACE_FILE_NAMEFROM( SELECT P.SPIDFROM V$MYSTAT M, V$SESSION S, V$PROCESS PWHERE M.STATISTIC# =1AND S.SID = M.SIDAND P.ADDR = S.PADDR) P,( SELECT T.INSTANCEFROM V$THREAD T, V$PARAMETER VWHERE V.NAME ='thread'AND (V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE))) I,(SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T查詢結(jié)果為wgods_ora_28279.trc文件, 但是去相應(yīng)目錄卻沒有找到對應(yīng)的追蹤文件,而是如下trace文件:wgods_ora_28279_10046.trc

?

?

6 利用10053事件

? 有點類似10046,在此略過、

7 系統(tǒng)視圖

通過下面一些系統(tǒng)視圖,你可以看到一些零散的執(zhí)行計劃的相關(guān)信息,有興趣的話可以多去研究一下。

?

SELECT * FROM V$SQL_PLANSELECT * FROM V$RSRC_PLAN_CPU_MTHSELECT * FROM V$SQL_PLAN_STATISTICSSELECT * FROM V$SQL_PLAN_STATISTICS_ALLSELECT * FROM V$SQLAREA_PLAN_HASHSELECT * FROM V$RSRC_PLAN_HISTORY

?

?

三、看懂執(zhí)行計劃

1.執(zhí)行順序

執(zhí)行順序的原則是:由上至下,從右向左

由上至下:在執(zhí)行計劃中一般含有多個節(jié)點,相同級別(或并列)的節(jié)點,靠上的優(yōu)先執(zhí)行,靠下的后執(zhí)行

從右向左:在某個節(jié)點下還存在多個子節(jié)點,先從最靠右的子節(jié)點開始執(zhí)行。

當(dāng)然,你在PL/SQL工具中也可以通過它提供的功能來查看執(zhí)行順序。如下圖所示:

2.執(zhí)行計劃中字段解釋

SQL>

名詞解釋:

recursive calls           遞歸調(diào)用

db block gets           從buffer cache中讀取的block的數(shù)量當(dāng)前請求的塊數(shù)目,當(dāng)前模式塊意思就是在操作中正好提取的塊數(shù)目,而不是在一致性讀的情況下而產(chǎn)生的正常情況下,一個查詢提取的塊是在查詢查詢開始的那個時間點上存在的數(shù)據(jù)庫,當(dāng)前塊是在這個時候存在數(shù)據(jù)塊,而不是這個時間點之前或者之后的的數(shù)據(jù)塊數(shù)目。

consistent gets          從buffer cache中讀取的undo數(shù)據(jù)的block的數(shù)量數(shù)據(jù)請求總數(shù)在回滾段Buffer中的數(shù)據(jù)一致性讀所需要的數(shù)據(jù)塊,,這里的概念是在你處理你這個操作的時侯需要在一致性讀狀態(tài)上處理多個塊,這些塊產(chǎn)生的主要原因是因為你在查詢過程中,由于其它會話對數(shù)據(jù) 塊進(jìn)行操作,而對所要查詢的塊有了修改,但是由于我們的查詢是在這些修改之前調(diào)用的,所要需要對回滾 段中的數(shù)據(jù)塊的前映像進(jìn)行查詢,以保證數(shù)據(jù)的一致性。這樣就產(chǎn)生了一致性讀。

?

physical reads           物理讀 就是從磁盤上讀取數(shù)據(jù)塊的數(shù)量。其產(chǎn)生的主要原因是:

                  1:在數(shù)據(jù)庫高速緩存中不存在這些塊。

                  2:全表掃描

                  3:磁盤排序

redo size         ?    DML生成的redo的大小

sorts (memory)           在內(nèi)存執(zhí)行的排序量

sorts (disk)            ?在磁盤執(zhí)行的排序量

2091 bytes sent via SQL*Net to client     從SQL*Net向客戶端發(fā)送了2091字節(jié)的數(shù)據(jù)

416 bytes received via SQL*Net from client  客戶端向SQL*Net發(fā)送了416字節(jié)的數(shù)據(jù)。

參考文檔:SQLPlus User’s Guide and Reference Release 11.1

db block gets 、 consistent gets 、 physical reads這三者的關(guān)系可以概括為:邏輯讀指的是ORACLE從內(nèi)存讀到的數(shù)據(jù)塊塊數(shù)量,一般來說是:

consistent gets + db block gets. 當(dāng)在內(nèi)存中找不到所需要的數(shù)據(jù)塊的話,就需要從磁盤中獲取,于是就產(chǎn)生了物理讀。

3.具體內(nèi)容查看

1> Plan hash Value

這一行是這一條語句的的hash值,我們知道ORACLE對每一條ORACLE語句產(chǎn)生的執(zhí)行計劃放在SHARE POOL里面,第一次要經(jīng)過硬解析,產(chǎn)生hash值。下次再執(zhí)行時比較hash值,如果相同就不會執(zhí)行硬解析。

2> COST

?

COST沒有單位,是一個相對值,是SQL以CBO方式解析執(zhí)行計劃時,供ORACLE來評估CBO成本,選擇執(zhí)行計劃用的。沒有明確的含義,但是在對比是就非常有用。

公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim

?

3> 對上面執(zhí)行計劃列字段的解釋:

Id: 執(zhí)行序列,但不是執(zhí)行的先后順序。執(zhí)行的先后根據(jù)Operation縮進(jìn)來判斷(采用最右最上最先執(zhí)行的原則看層次關(guān)系,在同一級如果某個動作沒有子ID就最先執(zhí)行。一般按縮進(jìn)長度來判斷,縮進(jìn)最大的最先執(zhí)行,如果有2行縮進(jìn)一樣,那么就先執(zhí)行上面的。)

    Operation:當(dāng)前操作的內(nèi)容。

    Name:操作對象

    Rows:也就是10g版本以前的Cardinality(基數(shù)),Oracle估計當(dāng)前操作的返回結(jié)果集行數(shù)。

    Bytes:表示執(zhí)行該步驟后返回的字節(jié)數(shù)。

    Cost(CPU):表示執(zhí)行到該步驟的一個執(zhí)行成本,用于說明SQL執(zhí)行的代價。

    Time:Oracle 估計當(dāng)前操作的時間。

4.謂詞說明:

Predicate Information (identified by operation id):

---------------------------------------------------

2 - filter("B"."MGR" IS NOT NULL)

4 - access("A"."EMPNO" = "B"."MGR")

    Access: 表示這個謂詞條件的值將會影響數(shù)據(jù)的訪問路勁(全表掃描還是索引)。

    Filter:表示謂詞條件的值不會影響數(shù)據(jù)的訪問路勁,只起過濾的作用。

    在謂詞中主要注意access,要考慮謂詞的條件,使用的訪問路徑是否正確。

5、 動態(tài)分析

如果在執(zhí)行計劃中有如下提示:

Note

------------

-dynamic sampling used for the statement

這提示用戶CBO當(dāng)前使用的技術(shù),需要用戶在分析計劃時考慮到這些因素。 當(dāng)出現(xiàn)這個提示,說明當(dāng)前表使用了動態(tài)采樣。我們從而推斷這個表可能沒有做過分析。

這里會出現(xiàn)兩種情況:

(1) 如果表沒有做過分析,那么CBO可以通過動態(tài)采樣的方式來獲取分析數(shù)據(jù),也可以或者正確的執(zhí)行計劃。

(2) 如果表分析過,但是分析信息過舊,這時CBO就不會在使用動態(tài)采樣,而是使用這些舊的分析數(shù)據(jù),從而可能導(dǎo)致錯誤的執(zhí)行計劃。

四、表訪問方式

1.Full Table Scan (FTS) 全表掃描

?

2.Index Lookup 索引掃描

There are 5 methods of index lookup:

index unique scan --索引唯一掃描

通過唯一索引查找一個數(shù)值經(jīng)常返回單個ROWID,如果存在UNIQUE或PRIMARY KEY約束(它保證了語句只存取單行的話),ORACLE

經(jīng)常實現(xiàn)唯一性掃描

Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index.

index range scan --索引局部掃描

Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. > < <> >= <= between) .

使用一個索引存取多行數(shù)據(jù),在唯一索引上使用索引范圍掃描的典型情況是在謂詞(WHERE 限制條件)中使用了范圍操作符號(如>, < <>, >=, <=,BWTEEN)

index full scan --索引全局掃描

Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order.

index fast full scan --索引快速全局掃描,不帶order by情況下常發(fā)生

Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index.

index skip scan --索引跳躍掃描,where條件列是非索引的前提情況下常發(fā)生

Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search.

3.Rowid 物理ID掃描

This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid掃描是最快的訪問數(shù)據(jù)方式

轉(zhuǎn)載于:https://www.cnblogs.com/zhangyingai/p/7082460.html

總結(jié)

以上是生活随笔為你收集整理的ORACLE数据库查看执行计划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一级录像 | 国产精品国产三级国产aⅴ9色 | 色综合色婷婷 | 日韩综合另类 | 久草视频免费在线播放 | 成人深夜小视频 | 日本一区免费看 | 怡红院一区二区 | 北条麻妃一区二区三区 | 亚洲成av人片在www色猫咪 | 两个女人互添下身爱爱 | 黄色片网站在线 | 国产三级漂亮女教师 | 青草精品视频 | 国产影视一区二区三区 | 国产乱free国语对白 | 日韩成人一区二区三区 | 正在播放国产一区 | 婷婷亚洲五月色综合 | 日韩操 | 激情综合激情 | 老子影院午夜伦不卡大全 | 日本aaa视频 | 中文字幕亚洲一区二区三区五十路 | 这里只有精品在线观看 | 欧美中文网 | 国产夫妻久久 | 日韩黄色大全 | 亚洲25p | 成人手机在线免费视频 | 欧美特级视频 | av在线专区 | 亚洲精品国产精品乱码不99热 | 人人看av| 欧洲av一区二区三区 | 欧美精品免费播放 | 久久婷色 | 亚洲精品久久久蜜桃 | 青青青在线观看视频 | 欧美综合图片 | 五月天激情婷婷 | 在线免费观看黄视频 | 亚洲最大的黄色网 | 性农村xxxxx小树林 | 久久免费视频1 | 91精品免费观看 | 国产尤物视频在线观看 | 永久免费精品 | 亚洲女人天堂色在线7777 | 啄木乌欧美一区二区三区 | 欧美精品二区三区四区免费看视频 | 日韩永久免费 | 欧美极品videos精品 | 欧美亚洲| 久久久久亚洲av成人片 | 日韩经典第一页 | av毛片精品 | 毛片免费全部无码播放 | 91在线在线 | 在线看你懂得 | 哺乳援交吃奶在线播放 | 亚洲七区 | 欧美 日韩 国产 一区二区三区 | 麻豆精品久久久久久久99蜜桃 | 好紧好爽再浪一点视频 | 亚洲自拍av在线 | 人妻一区二区视频 | 欧美一区二区三区爽爽爽 | 欧美美女性生活视频 | 在线观看成人一区 | 捆绑无遮挡打光屁股调教女仆 | 91麻豆精品国产理伦片在线观看 | 色超碰 | 黄色av电影在线观看 | 黄色一级一片 | 日韩av不卡在线 | 亚洲美女性生活视频 | 公侵犯人妻一区二区 | 黄色欧美大片 | 嫩草在线播放 | 久久精品一区二区免费播放 | 欧美精品国产一区二区 | 一级片免费观看视频 | 欧美麻豆 | 中文字幕在线观看日本 | 91九色国产 | 亚洲欧美自拍偷拍 | 成年网站| 欧美天堂在线观看 | 鲁鲁久久 | 国产免费91 | 黄色福利网站 | 亚洲国产精品成人无码区 | 自拍偷拍导航 | 水蜜桃影库 | 亚洲欧美一区二区三区孕妇 | 丁香婷婷久久久综合精品国产 | 欧洲影院 | 国产欧美一区二区三区在线看 |