查看ORACLE执行计划的几种常用方法



SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向。



执行计划的定义:执行目标SQL的所有步骤的组合。



我们首先列出查看执行计划的一些常用方法:

1.explain plan命令

PL/SQL Developer中通过快捷键F5就可以查看目标SQL的执行计划了。但其实按下F5后,实际后台调用的就是explain plan命令,相当于封装了该命令。

explain plan使用方法:

(1) 执行explain plan for + SQL

(2) 执行select * from table(dbms_xplan.display);

实验表准备:

SQL> desc test1;Name NullType----------------------------------------- -------- ----------------------------T1IDNOT NULL NUMBER(38)T1VVARCHAR2(10)

SQL> desc test2;Name NullType----------------------------------------- -------- ----------------------------T2IDNOT NULL NUMBER(38)T2VVARCHAR2(10)

实验:

SQL> set linesize 100

SQL> explain plan for select t1id, t1v, t2id, t2v from test1, test2 where test1.t1id = test2.t2id;

Explained.



第一步使用explain plan对目标SQL进行了explain,第二步使用select * from table(dbms_xplan.display)语句展示出该SQL的执行计划。

这里test2作为驱动表,进行了全表扫描,test1作为被驱动表,由于其包含主键,所以用的是索引全扫描。左侧ID带*号的第四步操作,表示有谓词条件,这里可以看到既使用了主键索引(access),又使用了过滤条件(filter)。



2.DBMS_XPLAN包

(1) select * from table(dbms_xplan.display);--上面以说明。

(2)select * from table(dbms_xplan.display_cursor(null, null, ‘advanced‘));

(3)select * from table(dbms_xplan.display_cursor(‘sql_id/hash_value‘, child_cursor_number, ‘advanced‘));

(4)select * from table(dbms_xplan.display_awr(‘sql_id‘));



(2)select * from table(dbms_xplan.display_cursor(null, null, ‘advanced‘));

主要用于SQLPLUS中查看刚执行过SQL的执行计划。首先第三个参数可以选择‘advanced‘:









接下来,第三个参数使用‘all‘:







可以看出‘advanced‘记录的信息要比‘all’多,主要就是多一个Outline Data。Outline Data主要是执行SQL时用于固定执行计划的内部HINT组合,可以将这部分内容摘出来加到目标SQL中以固定其执行计划。



(3)select * from table(dbms_xplan.display_cursor(‘sql_id/hash_value‘, child_cursor_number, ‘advanced‘));

其中第一个参数可以输入SQL的sql_id或hash value,方法就是如果执行的SQL仍在库缓存中,则可以使用V$SQL查询:



其中,使用@dbsnake大牛的SQL可以知道SQL_ID和HASH_VALUE的一一对应关系:



隐藏问题1:

这里的截图可能有点问题,结果并不准确,问题就出在这个SQL中使用的算法中,在另一篇博文中会仔细说明这个问题。

使用:

SQL>select * from table(dbms_xplan.display_cursor(‘1p2fk2v00c865‘, 0, ‘advanced‘));



select * from table(dbms_xplan.display_cursor(‘3221627077‘, 0, ‘advanced‘));

就可以查出对应这条SQL的执行计划,内容同(2)中的‘advanced‘,这就不展示了。

注意这还有第二个参数child_cursor_number,指的是子游标编号,如果未生成新的子游标,则此处写的是0。

(2)和(3)的结论相近,区别就是(2)只是针对最近一次执行SQL查看执行计划,(3)可以针对仍在库缓存中的任意一次SQL查看执行计划。



(4)select * from table(dbms_xplan.display_awr(‘sql_id‘));

(1)是使用explain plan for +SQL作为前提,(2)和(3)的前提则是SQL的执行计划还在共享池中,具体讲是在库缓存中。如果已经被age out交换出共享池,则不能用这两种方法了。若该SQL的执行计划被采集到AWR库中,则可以用(4)来查询历史执行计划。

隐藏问题2:

实验这部分内容发现使用select * from table(dbms_xplan.display_awr(‘sql_id‘));并没有结果,@黄玮老师说有可能是AWR收集的是top的SQL,有可能测试用的SQL不是most intensive SQL,但我是用alter system flush shared_pool后执行的手工采集快照,还是未被AWR抓到,比较奇怪的问题,这个也会在另一篇博文中仔细说明。
查看ORACLE执行计划的几种常用方法
标签:



  • Oracle 鑾峰彇鎵ц璁″垝鐨勫嚑绉鏂规硶
    绛旓細姝ラ2锛氬湪姝ゅ鎵ц浣犵殑SQL鍗冲彲锛屽悗缁嚜鐒朵細鏈夌粨鏋滆緭鍑 鍙︼紝鏈夊涓鍑犵鏂瑰紡锛歴et autotrace on (寰楀埌鎵ц璁″垝锛岃緭鍑鸿繍琛岀粨鏋滐級set autotrace traceonly (寰楀埌鎵ц璁″垝锛屼笉杈撳嚭杩愯缁撴灉锛塻et autotrace traceonly explain (寰楀埌鎵ц璁″垝锛屼笉杈撳嚭杩愯缁撴灉鍜岀粺璁′俊鎭儴鍒嗭紝浠呭睍鐜版墽琛岃鍒掗儴鍒嗭級set autotrace trac...
  • Oracle涓鑾峰彇鎵ц璁″垝鐨勫嚑绉鏂规硶鍒嗘瀽
    绛旓細浠ヤ笅鏄Oracle涓幏鍙栨墽琛岃鍒掔殑鍑犵鏂规硶杩涜浜嗚缁嗙殑鍒嗘瀽浠嬬粛锛岄渶瑕佺殑鏈嬪弸鍙互鍙傝冧笅 1. 棰勪及鎵ц璁″垝 - Explain Plan Explain plan浠QL璇彞浣滀负杈撳叆锛屽緱鍒拌繖鏉QL璇彞鐨勬墽琛岃鍒掞紝骞跺皢鎵ц璁″垝杈撳嚭瀛樺偍鍒拌鍒掕〃涓 棣栧厛锛屽湪浣犺鎵ц鐨凷QL璇彞鍓嶅姞explain 浠ヤ笅鏄Oracle涓幏鍙栨墽琛岃鍒掔殑鍑犵鏂规硶杩涜...
  • 鏌ョ湅ORACLE鎵ц璁″垝鐨勫嚑绉甯哥敤鏂规硶
    绛旓細鎴戜滑棣栧厛鍒楀嚭鏌ョ湅鎵ц璁″垝鐨勪竴浜涘父鐢ㄦ柟娉曪細1.explain plan鍛戒护PL/SQL Developer涓氳繃蹇嵎閿瓼5灏卞彲浠ユ煡鐪嬬洰鏍嘢QL鐨勬墽琛岃鍒掍簡銆備絾鍏跺疄鎸変笅F5鍚庯紝瀹為檯鍚庡彴璋冪敤鐨勫氨鏄痚xplain plan鍛戒护锛岀浉褰撲簬灏佽浜嗚鍛戒护銆俥xplain plan浣跨敤鏂规硶锛(1) 鎵цexplain plan for + SQL(2) 鎵цselect * from table(dbms_xplan....
  • 鎬庢牱鎵撳紑oracle鐨勬墽琛岃鍒
    绛旓細鏌ョ湅Oracle鎵ц璁″垝鐨勫嚑绉嶆柟娉 涓銆侀氳繃PL/SQL Dev宸ュ叿 1銆佺洿鎺ile->New->Explain Plan Window锛屽湪绐楀彛涓墽琛宻ql鍙互鏌ョ湅璁″垝缁撴灉銆傚叾涓紝Cost琛ㄧずcpu鐨勬秷鑰楋紝鍗曚綅涓簄%锛孋ardinality琛ㄧず鎵ц鐨勮鏁帮紝绛変环Rows銆2銆佸厛鎵ц EXPLAIN PLAN FOR select * from tableA where paraA=1锛屽啀 select * from...
  • 濡備綍浜嗚ВOracle鐢熸垚鎵ц璁″垝
    绛旓細1銆乻how parameter job_queue_processes;2銆乻elect * from user_jobs;--鏌ョ湅褰撳墠鐢ㄦ埛鐨勮皟搴︿换鍔 3銆乻elect * from dba_jobs_running;--鏌ョ湅姝e湪鎵ц鐨璋冨害浠诲姟 4銆乻elect * from dba_jobs;--鏌ョ湅鎵ц瀹岀殑璋冨害浠诲姟 5銆乻elect * from all_jobs; -- 鏌ョ湅鏁版嵁搴撶郴缁熸墍鏈変换鍔 ...
  • Oracle濡備綍鏌ョ湅sql鐨勭湡瀹鎵ц璁″垝
    绛旓細骞冲父鎴戜滑鐢╡xplan plan for,set autotrace,utlxplan绛夋柟寮鏌ョ湅鎵ц璁″垝閮芥槸optimizer妯℃嫙鐢熸垚鐨勬墽琛岃鍒掞紝骞朵笉瀹屽叏绗﹀悎oracle鍐呴儴 鐭ヨ瘑鏅強锛1 骞冲父鎴戜滑鐢╡xplan plan for,set autotrace,utlxplan绛夋柟寮忔煡鐪嬫墽琛岃鍒掗兘鏄痮ptimizer妯℃嫙鐢熸垚鐨勬墽琛岃鍒掞紝骞朵笉瀹屽叏绗﹀悎Oracle鍐呴儴瀵箂ql璇彞鐨勬墽琛岃矾寰勩2 v$sqlarea涓...
  • 璁茶ВORACLE鐨勬墽琛岃鍒掔殑鍑犵鏂规硶
    绛旓細鏄竴涓敮涓鐨勫瓧绗︿覆锛屾妸褰撳墠鎵ц璁″垝涓庡瓨鍌ㄥ湪鍚屼竴PLAN涓殑鍏跺畠鎵ц璁″垝鍖哄埆寮鏉ャ俆ABLE_NAME锛氭槸plan琛ㄥ悕锛屽畠缁撴瀯濡傚墠鎵绀猴紝浣犲彲浠ヤ换鎰忚瀹氳繖涓悕绉般係QL_STATEMENT锛氭槸鐪熸鐨凷QL璇彞銆傛瘮濡傦細SQLexplainplansetstatement_id='T_TEST'forselect*fromt_test;SQLExplained 鎵ц涓嬮潰璇彞鍙互鏌ヨ鍒版墽琛岃鍒 ...
  • oracle 鎵ц璁″垝 鏈夊涓猵lan
    绛旓細Cardinality鍊艰〃绀篊BO棰勬湡浠庝竴涓婧(row source)杩斿洖鐨勮褰曟暟,杩欎釜琛屾簮鍙兘鏄竴涓〃,涓涓储寮,涔熷彲鑳芥槸涓涓瓙鏌ヨ銆 鍦Oracle 9i涓殑鎵ц璁″垝涓,Cardinality缂╁啓鎴怌ard銆 鍦10g涓,Card鍊艰rows鏇挎崲銆 杩欐槸9i鐨勪竴涓墽琛岃鍒,鎴戜滑鍙互鐪嬪埌鍏抽敭瀛桟ard: 鎵ц璁″垝 --- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2...
  • oracle pl/sql 鎵ц璁″垝鎬庝箞鐪
    绛旓細鍙互鐪嬪埌绐楀彛涓婃柟鏄痵ql璇彞锛屼笅鏂规樉绀鎵ц璁″垝琛ㄦ牸銆傝〃鏍肩殑鍒椾富瑕佸寘鍚弿杩般佺敤鎴枫佸璞°佹垚鏈姳璐广両O寮閿绛夛紝琛ㄦ牸锛屽綋鐒惰〃鏍煎垪杩樺彲浠ヨ嚜瀹氫箟銆傝〃鏍肩殑琛屽寘鍚簡鏌ヨ閫昏緫鐨勬墽琛岄『搴忓拰鍚勪釜姝ラ淇℃伅銆傛墽琛岃鍒掕〃鏍煎唴瀹圭殑鎵ц椤哄簭鏄細鎸夌収浠庡乏鑷冲彸锛屼粠涓婅嚦涓嬬殑姝ラ鎵ц锛屽叿浣撴槸鎸囨墽琛岃鍒掓寜鐓у眰娆¢愭缂╄繘锛屼粠宸﹁嚦鍙...
  • oracle sql鎵ц璁″垝鎬庝箞鍒嗘瀽
    绛旓細1.鍏堟煡鐪媠ql璇彞鐨勭粨鏋勶紝鐪嬭鍙ヤ腑杩炴帴鏄痷nion锛岃繕鏄瓑鍊艰繛鎺ヨ繕鏄乏銆佸彸杩炴帴,鍐嶇湅杩炴帴涓殑琛ㄦ暟閲忋2.鏌ョ湅鎵ц璁″垝涓嚭鐜板紓甯哥殑閮ㄥ垎銆3.鏌ョ湅鍚勮〃鐨勭储寮曟儏鍐靛強琛ㄦ槸鍚︽槸鍒嗗尯鐨勶紝鍦╳here鏉′欢涓婁娇鐢ㄧ殑绱㈠紩鍒楁槸鍚︽纭紝鐪嬬粺璁″垎鏋愯〃涓琛ㄧ殑鍒嗘瀽缁撴灉鏄惁姝g‘ 4.鍒嗘瀽琛ㄧ殑鐢ㄩ旓紝琛ㄧ殑鏁版嵁鏃ュ闀块噺銆5.鍒嗘瀽涓轰粈涔...
  • 扩展阅读:oracle查看执行计划方法 ... 查看执行计划的sql语句 ... oracle的执行计划怎么看 ... oracle如何查看执行计划 ... oracle查看正在执行的sql ... oracle执行计划filter ... oracle查看锁表sql语句 ... 查看执行计划的方法 ... oracle 查看历史执行记录 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网