plan explorer mysql_plan explorer支持oracle吗
展開(kāi)全部
1.SQL語(yǔ)句的執(zhí)行62616964757a686964616fe58685e5aeb931333361326365計(jì)劃
使用EXPLAIN PLAN語(yǔ)句來(lái)確定Oracle數(shù)據(jù)庫(kù)下指定SQL語(yǔ)句的執(zhí)行計(jì)劃,這個(gè)語(yǔ)句插入每一步執(zhí)行計(jì)劃的行描述到指定表中。你也可使用EXPLAIN PLAN語(yǔ)句作為SQL跟蹤工具的一部分。
EXPLAIN PLAN命令的語(yǔ)法如下:
EXPLAIN PLAN
[ SET STATEMENT_ID = string ]
[ INTO [ schema. ] table_name [ @ dblink ] ]
FOR sql_statement ;
EXPLAIN PLAN的相關(guān)選下如下:
STATEMENT_ID
SQL語(yǔ)句的唯一標(biāo)識(shí)符。通過(guò)使用SQL語(yǔ)句的標(biāo)識(shí)符,可以向一個(gè)計(jì)劃表中存入多條SQL語(yǔ)句。
TABLE_NAME
存儲(chǔ)執(zhí)行計(jì)劃的計(jì)劃表的名稱。此表必須已經(jīng)存在并且與標(biāo)準(zhǔn)表結(jié)構(gòu)一致。如果沒(méi)有指定計(jì)劃表名稱,EXPLAIN PLAN會(huì)嘗試使用表名PLAN_TABLE.
SQL_STATEMENT
你想要知道其執(zhí)行計(jì)劃的那條SQL語(yǔ)句。這條SQL語(yǔ)句必須是有效的。并且你也必須有足夠的權(quán)限來(lái)執(zhí)行它。這條SQL語(yǔ)句可以含有綁定變量。
2.計(jì)劃表
默認(rèn)情況下,Oracle會(huì)將執(zhí)行計(jì)劃插入如到一張名為PLAN_TABLE的表中。可以使用腳本utlexplain.sql來(lái)創(chuàng)建自己的計(jì)劃表。這個(gè)腳本位于Oracle軟件安裝目錄的子目錄$ORACLE_HMOE/rmdbs/admin/中。然而,從Oracle 10g開(kāi)始,Oracle會(huì)創(chuàng)建一個(gè)全局臨時(shí)表PLAN_TABLE供所有用戶使用,所以通常情況下不需要?jiǎng)?chuàng)建自己的計(jì)劃表。由于此默認(rèn)的計(jì)劃表是一個(gè)全局臨時(shí)表,所以你無(wú)法看到其他會(huì)話插入的執(zhí)行計(jì)劃,你的執(zhí)行計(jì)劃也會(huì)隨著自己會(huì)話的結(jié)束而自動(dòng)消失。
(計(jì)劃表)
列名
類(lèi)型
描述
STATEMENT_ID
VARCHAR2(30)
在EXPLAIN PLAN的SET STATEMENT_ID子句提供的SQL語(yǔ)句的唯一標(biāo)志符。
PLAN_ID
NUMBER
執(zhí)行計(jì)劃的在全局表plan_table中的唯一標(biāo)識(shí)符
TIMESTAMP
DATE
EXPLAN PLAN語(yǔ)句執(zhí)行的日期和時(shí)間
REMARKS
VARCHAR2(80)
注釋
OPERATION
VARCHAR2(30)
執(zhí)行的操作類(lèi)型。如TABLE ACCESS,SORT或HASH JOIN
OPTIONS
VARCHAR2(225)
操作的附加信息,例如,以TABLE SCAN為例,選項(xiàng)可能是FULL或BY ROWID
OBJECT_NODE
VARCHAR2(128)
如果是分布式查詢,這一列表示用于引用對(duì)象的數(shù)據(jù)庫(kù)鏈接名稱。如果并行查詢,它的值可能對(duì)應(yīng)一個(gè)臨時(shí)的結(jié)果集。
OBJECT_OWNER
VARCHAR2(30)
對(duì)象的名字
OBJECT_NAME
VARCHAR2(30)
對(duì)象名稱
OBJECT_ALIAS
VARCHAR2(65)
對(duì)象的別名
OBJECT_INSTANCE
NUMERIC
對(duì)象在SQL語(yǔ)句中的位置
OBJECT_TYPE
VARCHAR2(30)
對(duì)象的類(lèi)型(表,索引等)
OPTIMIZER
VARCHAR2(255)
解釋SQL語(yǔ)句時(shí)生效的優(yōu)化器
SEARCH_COLUMNS
NUMBERIC
未使用
ID
NUMERIC
執(zhí)行計(jì)劃的ID號(hào)
PARENT_ID
NUMERIC
上一個(gè)步驟的ID號(hào)
DEPTH
NUMERIC
操作的深度
POSITION
NUMERIC
如果兩個(gè)步驟有相同的父步驟,有更低POSITION值的步驟將被先執(zhí)行
COST
NUMERIC
優(yōu)化器估算出來(lái)的此操作的相對(duì)成本
CARDINALITY
NUMERIC
優(yōu)化器預(yù)期這一步將飯后的記錄數(shù)
BYTES
NUMERIC
預(yù)計(jì)這一步將返回的字節(jié)數(shù)
OTHER_TAG
VARCHAR2(255)
標(biāo)識(shí)OTHER列中的值的類(lèi)型。
PARTITION_START
VARCHAR2(255)
訪問(wèn)的分區(qū)范圍的起始分區(qū)
PARTITION_STOP
VARCHAR2(255)
訪問(wèn)的分區(qū)范圍的結(jié)束分區(qū)
PARTITION_ID
NUMERIC
計(jì)算PARTITION_START和PARTITION_STOP列的值對(duì)的ID
OTHER
LONG
對(duì)于分布式查詢,這列可能是包含發(fā)往遠(yuǎn)程數(shù)據(jù)庫(kù)的SQL語(yǔ)句的文本。對(duì)于并行查詢,它比啊是并行從屬進(jìn)程執(zhí)行的SQL語(yǔ)句。
DISTRIBUTION
VARCHAR2(30)
描述記錄是如何從一組并行查詢從屬進(jìn)程分配到后續(xù)的“消費(fèi)者”從屬進(jìn)程的。
CPU_COST
NUMERIC
估算出來(lái)的操作的CPU成本
IO_COST
NUMERIC
估算出來(lái)的的操作的IO成本
TEMP_SPACE
NUMERIC
估算出來(lái)的這一步操作所使用的臨時(shí)存儲(chǔ)的空間大小
ACCESS_PREDICATES
VARCHAR2(4000)
SQL語(yǔ)句中,確定如何在當(dāng)前步驟中提取記錄的子句。
FILTER_PREDICATES
VARCHAR2(4000)
SQL語(yǔ)句中確定對(duì)見(jiàn)記錄進(jìn)行過(guò)濾的子句路,如WHERE子句在非索引列上的條件。
PROJECTION
VARCHAR2(4000)
決定將返回的記錄的子句,通常是SELECT后面的字段列表
TIME
NUMBER(20,2)
優(yōu)化器為這一步執(zhí)行估算的時(shí)間消耗
QBLOCK_NAME
VARCHAR2(30)
查詢塊的唯一標(biāo)識(shí)符。
(常見(jiàn)的執(zhí)行計(jì)劃操作)
操 作
選 項(xiàng)
描 述
表的訪問(wèn)路徑
TABLE ACCESS
FULL
全表掃描,他會(huì)讀取表中的每一條記錄(嚴(yán)格地說(shuō),它讀取表的高水位以內(nèi)的每個(gè)數(shù)據(jù)塊)
CLUSTER
通過(guò)索引簇的鍵來(lái)訪問(wèn)數(shù)據(jù)
HASH
通過(guò)散鍵列來(lái)訪問(wèn)表中匹配特定的散列值的一條或多條記錄
BY INDEX ROWID
通過(guò)指定ROWID來(lái)訪問(wèn)表中的單條記錄。ROWID是訪問(wèn)單條記錄的最快捷的方式。通常,ROWID的信息都是有一個(gè)相關(guān)的索引檢索而來(lái)
BY USER ROWID
通過(guò)提供一個(gè)綁定變量、字面變量或WHERE CURRENT OF CURSOR子句來(lái)通過(guò)ROWID進(jìn)行訪問(wèn)
BY GLOBAL INDEX ROWID
通過(guò)由全局分區(qū)索引獲得的ROWID進(jìn)行訪問(wèn)
BY LOCAL INDEX ROWID
通過(guò)本地分區(qū)索獲得的ROWID進(jìn)行訪問(wèn)
SAMPLE
使用SAMPLE子句得到結(jié)果集的一個(gè)經(jīng)過(guò)采樣的子集
EXTERNAL TABLE ACCESS
訪問(wèn)一張外部表
RESULT CACHE
這個(gè)SQL結(jié)果集可能來(lái)自結(jié)果集緩存
MAT_VIEW REWIRTE ACCESS
SQL語(yǔ)句被重寫(xiě)以利用物化視圖
索引操作
ADN_EQUAL
合并來(lái)自一個(gè)或多個(gè)索引掃描的結(jié)果集
INDEX
UNIQUE SCAN
只返回一條記錄的地址(ROWID)的索引檢索
RANGE SCAN
返回多條記錄的ROWID的索引檢索。之所以可以這樣返回,是因?yàn)槭欠俏ㄒ凰饕蚴鞘褂昧藚^(qū)間操作符(例如,>)
FULL SCAN
按照索引的順序掃描整個(gè)索引
KIP SCAN
搜索碎索引鍵中哦非前導(dǎo)列的索引掃描
FULL SCAN(MAX/MIN)
檢索最高或最低的索引條目
FAST FULL SCAN
按照塊順序掃描索引的每個(gè)條目,可能會(huì)使用多塊讀取
DOMAIN INDEX
域索引(用戶定義的索引類(lèi)型)檢索
位圖操作
BITMAP
CONVERSION
將ROWID轉(zhuǎn)換成位圖或?qū)⑽粓D轉(zhuǎn)換成ROWID
INDEX
從位圖中提取一個(gè)值或一個(gè)范圍的值
MERGE
合并多個(gè)位圖
MINUS
從一個(gè)位圖中減去另一個(gè)位圖
OR
按位(bit-wise)對(duì)兩個(gè)位圖做OR操作
表連接
CONNECT BY
對(duì)前一個(gè)步驟的輸出結(jié)果執(zhí)行一個(gè)層次化的自聯(lián)接操作
MERGE JOIN
對(duì)前一個(gè)步驟的輸出結(jié)果執(zhí)行一次合并聯(lián)接
NESTED LOOPS
對(duì)前一個(gè)步驟執(zhí)行嵌套循環(huán)聯(lián)接。對(duì)于上層的結(jié)果集中的每一行,都會(huì)掃描下層的結(jié)果集以找到匹配的記錄
HASH JOIN
對(duì)兩個(gè)記錄源(row source)進(jìn)行散列聯(lián)接
任何連接操作
OUTER
此連接為外聯(lián)接
任何連接操作
ANTI
此連接為反聯(lián)接
任何連接操作
SEMI
此連接為半聯(lián)接
任何連接操作
CARTESIAN
一個(gè)結(jié)果集中的每一條記錄與另一個(gè)結(jié)果中的每一條記錄進(jìn)行聯(lián)接
集合操作
CONCATENATION
與顯示指定一個(gè)UNION語(yǔ)句一樣,多個(gè)結(jié)果集被按照同樣的方式做合并。它通常會(huì)發(fā)生在對(duì)索引列使用OR語(yǔ)句時(shí)
INTERSECTION
對(duì)兩個(gè)結(jié)果集進(jìn)行比較,只返回在兩個(gè)結(jié)果集中都存在的記錄。通常只有顯式地使用INTERSECT子句,這個(gè)操作才會(huì)發(fā)生
MINUS
除在第二個(gè)結(jié)果中出現(xiàn)過(guò)的記錄外,返回一個(gè)結(jié)果中的所有記錄。它是使用MINUS集合操作符的結(jié)果
UNION-ALL
對(duì)兩個(gè)結(jié)果集進(jìn)行合并,并返回兩個(gè)結(jié)果集中的所有記錄
UNION
對(duì)兩個(gè)結(jié)果集進(jìn)行合并,并返回兩個(gè)結(jié)果集中的所有記錄,但是不返回重復(fù)記錄
VIEW
要么訪問(wèn)一個(gè)視圖定義,要么創(chuàng)建一個(gè)臨時(shí)表來(lái)存儲(chǔ)結(jié)果集
其他雜項(xiàng)
FOR UPDATE
由于FOR UPDATE子句的原因,返回的記錄都會(huì)被鎖住
COLLECTION ITERATOR
各種
從一個(gè)表函數(shù)提取記錄的操作(也就是 FROM TABLE())
FAST DUAL
訪問(wèn)DUAL表,以避免從緩沖區(qū)高數(shù)緩存中讀取
FILTER
從結(jié)果集中排除掉不匹配給定選取條件的記錄
REMOTE
通過(guò)數(shù)據(jù)庫(kù)鏈接訪問(wèn)一個(gè)外部的數(shù)據(jù)庫(kù)
FIRST ROW
獲取查詢的第一條記錄
SEQUENCE
使用Oracle序列號(hào)生成器來(lái)獲得一個(gè)唯一的序列號(hào)
INLIST ITERATOR
對(duì)于IN列表中的每個(gè)值都執(zhí)行一次下一個(gè)操作
LOAD AS SELECT
表示這是一個(gè)基于SELECT語(yǔ)句的直接路徑INSERT操作
FIXED TABLE
訪問(wèn)固定的(X$或V$)表
FIXED INDEX
訪問(wèn)固定表X$上的索引
WINDOW
BUFFER
支持分析函數(shù)(如OVER())的內(nèi)部操作
WINDOW
SORT [PUSHED]RANK
分析函數(shù)需要為實(shí)現(xiàn)RANK()函數(shù)執(zhí)行一次排序操作
分區(qū)操作
PARTITION
SINGLE
訪問(wèn)單個(gè)分區(qū)
ITERATOR
訪問(wèn)多個(gè)分區(qū)
ALL
訪問(wèn)所有分區(qū)
INLIST
基于IN列表中的值來(lái)訪問(wèn)多個(gè)分區(qū)
匯總操作
COUNT
為了滿足COUNT()函數(shù)而計(jì)算結(jié)果集中的記錄數(shù)
COUNT
STOPKEY
計(jì)算結(jié)果集中的記錄數(shù),當(dāng)達(dá)到一定數(shù)量后就停止處理。這通常發(fā)生在使用了WHERE子句,并指定了一個(gè)最大值ROWNUM(例如,WHERE ROWNUM<=10)的情況下
BUFFER
SORT
對(duì)臨時(shí)結(jié)果集做的一次內(nèi)存排序
HASH
GROUP BY
使用散列操作而不是排序操作實(shí)現(xiàn)GROUP BY
INLIST
ITERATOR
對(duì)于IN列表中的每個(gè)值都實(shí)現(xiàn)一次子操作
SORT
ORDER BY
為了滿足ORDER BY子句而對(duì)結(jié)果集進(jìn)行排序
AGGREGATE
當(dāng)在已經(jīng)分好組的數(shù)據(jù)上使用分組函數(shù)是會(huì)出現(xiàn)此操作
JOIN
為了準(zhǔn)備合并連接而對(duì)記錄進(jìn)行排序
UNIQUE
排除重復(fù)記錄的排序操作,通常是使用DISTINCT子句的結(jié)果
GROUP BY
為GROUP BY子句對(duì)結(jié)果集進(jìn)行排序分組
GROUP BY NOSORT
不需要進(jìn)行排序操作的GROUP BY操作
GROUP BY ROLLUP
含有ROLLUP選項(xiàng)的GROUP BY操作
GROUP BY CUBE
含有CUBE選項(xiàng)的GROUP BY操作
3.查看執(zhí)行計(jì)劃
當(dāng)SQL語(yǔ)句的執(zhí)行計(jì)劃生成以后,我們就可以去查看SQL語(yǔ)句的執(zhí)行計(jì)劃了。有兩種方法可以查看執(zhí)行計(jì)劃:直接查看計(jì)劃表和DBMS_XPLAN.DISPALY表函數(shù)。
第一種方法:
為了更好地理解計(jì)劃表中的數(shù)據(jù),需要針對(duì)計(jì)劃表做層次查詢。通過(guò)SELECT語(yǔ)句的 CONNECT BY子句對(duì)PARENT_ID和ID兩列進(jìn)行自連接。這種查詢語(yǔ)句通常的寫(xiě)法如下:
select rtrim(lpad(' ', 2 * level) || rtrim(operation) || ' ' || rtrim(options)) description,
object_owner,
object_name,
cost,
cardinality,
bytes,
io_cost,
cpu_cost
from plan_table
connect by prior id = parent_id
start with id = 0
第二種方法:
與手工查詢計(jì)劃表相比,使用DBMS_XPLAN通常可以更好的結(jié)果,它的語(yǔ)法更加簡(jiǎn)單,還提供了多種有用的輸出格式,并且可以利用緩存的執(zhí)行計(jì)劃統(tǒng)計(jì)信息。
調(diào)用DBMS_XPLAN函數(shù)最簡(jiǎn)單的方法就是使用 select * from table()語(yǔ)句,如下面的語(yǔ)句:
select * from table(dbms_xplan.function(options));
最常用的兩個(gè)DBMS_XPLAN函數(shù):
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);
DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
child_number IN NUMBER DEFAULT NULL,
format IN VARCHAR2 DEFAULT 'TYPICAL');
4.Examples
創(chuàng)建emp_test表
create table emp_test as select *from emp;
create unique index EMP_TEST_U1 on EMP_TEST (empno);
create index emp_test_n1 on EMP_TEST (ename);
通過(guò)EXPLAIN PLAN語(yǔ)句,插入指定SQL語(yǔ)句的執(zhí)行計(jì)劃。
SQL> explain plan set statement_id ='plan_sql_id' for select * from emp_test t where t.ename='SCOTT';
Explained
手動(dòng)查詢計(jì)劃表查看計(jì)劃:
SQL> select rtrim(lpad(' ', 2 * level) || rtrim(operation) || ' ' || rtrim(options)) description,
2 object_owner,
3 object_name,
4 cost,
5 cardinality,
6 bytes,
7 io_cost,
8 cpu_cost
9 from plan_table
10 connect by prior id = parent_id
11 start with id = 0;
DESCRIPTION OBJECT_OWNER OBJECT_NAME COST CARDINALITY BYTES IO_COST CPU_COST
-------------------------------- ------------- ------------- ------ ----------- ----- ------- ---------
SELECT STATEMENT 2 1 38 2 14733
TABLE ACCESS BY INDEX ROWID SCOTT EMP_TEST 2 1 38 2 14733
INDEX RANGE SCAN SCOTT EMP_TEST_N1 1 1 1 7321
調(diào)用DBMS_XPLAN函數(shù)查看:
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
Plan hash value: 1758671844
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
| 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)|
| 1 | TABLE ACCESS BY INDEX ROWID| EMP_TEST | 1 | 38 | 2 (0)|
|* 2 | INDEX RANGE SCAN | EMP_TEST_N1 | 1 | | 1 (0)|
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T"."ENAME"='SCOTT')
已贊過(guò)
已踩過(guò)<
你對(duì)這個(gè)回答的評(píng)價(jià)是?
評(píng)論
收起
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的plan explorer mysql_plan explorer支持oracle吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理财是只赚不亏吗?有什么理财产品风险小的
- 下一篇: MySQL中使用CASE出错,如何在My