步驟:javascript
- 1:explain plan for 你的SQL;
- 2:select * from table (dbms_xplan. display()) ;
sqlplus登陸:php
用戶名/密碼@主機名稱:1521/數據庫名
步驟:css
- 1:set sutoatrace on
- 2:在這次執行你的sql;
步驟:java
- 1:alter session set statistics_level=all;
- 2:在此處執行你的SQL;
- 3:select * from table(dbms_xplan.display_cursor(null , null,'allstats last'));
假如使用了Hint語法: /*+ gather_plan_statistics */,就能夠省略步驟1,直接執行步驟2和3,獲取執行計劃python
關鍵字解讀:sql
優勢:數據庫
步驟
從共享池獲取bash
//${SQL_ID}參數能夠從共享池拿 select * from table(dbms_xplan.display_cursor(${SQL_ID}));
還能夠從AWR性能視圖裏獲取session
select * from table(dbms_xplan.display_awr(${SQL_ID}));
多個執行計劃的狀況,能夠用相似方法查出函數
select * from table(dbms_xplan.display_cursor(${SQL_ID},0)); select * from table(dbms_xplan.display_cursor(${SQL_ID},1));
優勢:
缺點:
步驟:
1:alter session set events '10046 trace name context forever,level 12';//開啓跟蹤 2:執行你的語句 3:alter session set events '10046 trace name context off';//關閉跟蹤 4:找到跟蹤產生的文件 5:tkprof trc文件 目標文件 sys=no sort=prsela,exeela,fchela(格式化命令)
優勢:
步驟:
1:@?/rdbms/admin/awrsqrpt.sql 具體能夠參考我以前的博客:https://smilenicky.blog.csdn.net/article/details/89429989
能夠分爲兩種類型:單獨型和聯合型
聯合型分爲:關聯的聯合型和非關聯的聯合型
單獨型比較好理解,執行順序是按照id=1,id=2,id=3執行,由遠及近
先scott登陸,而後執行sql,例子來自《收穫,不止SQL優化》一書
select deptno, count(*)
from emp where job = 'CLERK' and sal < 3000 group by deptno
因此能夠給出單獨型的圖例:
這裏使用Hint的nl
select /*+ ordered use_nl(dept) index(dept) */ * from emp, dept where emp.deptno = dept.deptno and emp.comm is null and dept.dname != 'SALES'
這圖來自《收穫,不止SQL優化》,能夠看出id爲2的A-Rows實踐返回行數爲10,id爲3的Starts爲10,說明驅動表emp訪問的結果集返回多少條記錄,被驅動表就被訪問多少次,這是關聯型的顯著特徵
前面已經介紹了聯合型關聯型(nl)這種方法的,這種方法是驅動表返回多少條記錄,被驅動表就被訪問了多少次,不過這種狀況對於FILTER模式下並不適用
執行SQL,這裏使用Hint /*+ no_unnset */
select * from emp where not exists (select /*+ no_unnset */ 0 from dept where dept.dname='SALES' and dept.deptno = emp.deptno) and not exists(select /*+ no_unnset */ 0 from bonus where bonus.ename = emp.ename)
ps:圖來自《收穫,不止SQL優化》一書,這裏能夠看出id爲2的地方,A-Rows實際返回行數爲8,而id爲3的地方,Starts爲3,說明對應SQL執行3次,也即dept被驅動表被訪問了3次,這和剛纔介紹的nl方式不一樣,爲何不一樣?
查詢一下SQL,能夠看出實際返回3條,其它的都是重複多的,
select dname, count(*) from emp, dept where emp.deptno = dept.deptno group by dname;
因此,就很明顯了,被過濾了重複數據,也就是說FILTER模式的對數據進行過濾,驅動表執行結果集返回多少行不重複數據,被驅動表就被訪問多少次,FILTER模式能夠說是對nl模式的改善
update emp e1 set sal = (select avg(sal) from emp e2 where e2.deptno = e1.deptno),comm = (select avg(comm) from emp e3)
聯合型的關聯型(UPDATE)和FILTER模式相似,因此就不重複介紹
select /*+ connect_by_filtering */ level, ename ,prior ename as manager from emp start with mgr is null connect by prior empno = mgr
給出聯合型關聯型圖例:
能夠執行SQL
select ename from emp union all select dname from dept union all select '%' from dual
對於plsql可使用工具查看執行計劃,sqlplus客戶端的可使用statistics_level=all的方法獲取執行計劃,具體步驟
- 1:alter session set statistics_level=all;
- 2:在此處執行你的SQL;
- 3:select * from table(dbms_xplan.display_cursor(null , null,'allstats last'));
能夠給出聯合型非關聯型的圖例: