工做中偶爾會遇到性能很差的複雜sql語句,在定位不了問題的狀況下就須要執行計劃出馬了。mysql
執行計劃顧名思義,就是oracle內部執行Sql語句的詳細計劃步驟。固然,其餘數據庫好比mysql、sqlsever等也有這個概念。本文以我經常使用的oracle爲例。sql
如可查看執行計劃?其實有不少種方法。數據庫
最簡單的,用IDE自帶組件,好比sql developer上的查看執行計劃按鍵(快捷鍵F10)oracle
稍微複雜點的,用代碼查看:oop
EXPLAIN PLAN FOR (SELECT * FROM TEMP);--方法1 SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));--方法2 SQL> select * from table(dbms_xplan.display);--方法3
解讀執行計劃
join的時候,有三種方式:hash join、 merge join、nested loop性能
- A、B兩表誰在前誰在後並不影響執行計劃,計劃會自動算出最優的執行方法
- 當nested loop,最優執行計劃通常是小表做爲驅動表只遍歷一遍。
- Nested loop通常用在鏈接的表中有索引,而且索引選擇性較好的時候;Hash join在兩個表的數據量差異很大的時候.Sort Merge join 用在沒有索引,而且數據已經排序的狀況.
- 一般來說,可以使用merge join的地方,hash join均可以發揮更好的性能。