【sql調優之執行計劃】sort operations
版本:9.2.0.8
當需要排序操作時,通常會有一系列sort的操作,下面是一些cbo執行sort的操作:
Sort unique
Sort aggregate
Sort group by
Sort join
Sort order by
分別來看這些操作的產生和執行情況:
Sort unique
Sort unique 在distinct操作或者某個下一步需要unique值的操作:
SQL> select distinct a.state from t_policy_state a;
36 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=18 Card=36 Bytes=828
)
1 0 SORT (UNIQUE) (Cost=18 Card=36 Bytes=828)
2 1 TABLE ACCESS (FULL) OF 'T_POLICY_STATE' (Cost=2 Card=36
Bytes=828)
另外在某些in子查詢中也有可能產生。
Sort group by
Sort group by 用來在計算不同分組的排序時使用
SQL> select a.state,sum(a.p_state_id) from t_policy_state a group by a.state;
36 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=18 Card=36 Bytes=936
)
1 0 SORT (GROUP BY) (Cost=18 Card=36 Bytes=936)
2 1 TABLE ACCESS (FULL) OF 'T_POLICY_STATE' (Cost=2 Card=36
Bytes=936)
Sort aggregate
這個操作並沒有實際的進行sort,只是在計算所有行的總計時使用
SQL> select sum(a.p_state_id) from t_policy_state a ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=4)
1 0 SORT (AGGREGATE)
2 1 INDEX (FULL SCAN) OF 'PK_T_POLICY_STATE' (UNIQUE) (Cost=
1 Card=36 Bytes=144)
Sort join
通常在sort merge join中出現,如果用來join的行集需要對join key排序的話使用
SQL> select /*+ use_merge(a,b) */
2 a.organ_id
3 from t_company_organ a, t_company b
4 where a.organ_id = b.parent_id;
no rows selected
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=19 Card=1 Bytes=16)
1 0 MERGE JOIN (Cost=19 Card=1 Bytes=16)
2 1 INDEX (FULL SCAN) OF 'PK_T_COMPANY_ORGAN' (UNIQUE) (Cost
=1 Card=250 Bytes=1500)
3 1 SORT (JOIN) (Cost=18 Card=1 Bytes=10)
4 3 TABLE ACCESS (FULL) OF 'T_COMPANY' (Cost=2 Card=1 Byte
s=10)
Sort order by
當使用了order by,並且沒有在order by的列上有適合的索引,則會使用這個操作:
SQL> select a.organ_id
2 from t_company_organ a, t_company b
3 where a.organ_id = b.parent_id
4 order by a.organ_id;
no rows selected
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=19 Card=1 Bytes=16)
1 0 SORT (ORDER BY) (Cost=19 Card=1 Bytes=16)
2 1 NESTED LOOPS (Cost=3 Card=1 Bytes=16)
3 2 TABLE ACCESS (FULL) OF 'T_COMPANY' (Cost=2 Card=1 Byte
s=10)
4 2 INDEX (UNIQUE SCAN) OF 'PK_T_COMPANY_ORGAN' (UNIQUE)
如果使用sort merge join,使用a.organ_id上的索引,那麼由於索引已經排序,則不會有sort操作,例如:
SQL> select /*+ use_merge(a,b)*/a.organ_id
2 from t_company_organ a, t_company b
3 where a.organ_id = b.parent_id
4 order by a.organ_id;
no rows selected
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=19 Card=1 Bytes=16)
1 0 MERGE JOIN (Cost=19 Card=1 Bytes=16)
2 1 INDEX (FULL SCAN) OF 'PK_T_COMPANY_ORGAN' (UNIQUE) (Cost
=1 Card=250 Bytes=1500)
3 1 SORT (JOIN) (Cost=18 Card=1 Bytes=10)
4 3 TABLE ACCESS (FULL) OF 'T_COMPANY' (Cost=2 Card=1 Byte
s=10)
上述這些sql在另外一個版本:10.2.0.4中使用的則是hash unique,hash group by 等操作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-671623/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql調優之——執行計劃explainMySqlAI
- Oracle調優之看懂Oracle執行計劃Oracle
- Oracle sql執行計劃OracleSQL
- SQL優化案例-從執行計劃定位SQL問題(三)SQL優化
- MySQL調優篇 | EXPLAIN執行計劃解讀(4)MySqlAI
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- .Oracle固定執行計劃之SQL PROFILE概要檔案OracleSQL
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL
- 如何檢視SQL的執行計劃SQL
- TiDB 查詢優化及調優系列(四)查詢執行計劃的調整及優化原理TiDB優化
- SQL執行內幕:從執行原理看調優的本質SQL
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- 十六、Mysql之Explain執行計劃MySqlAI
- 獲取執行計劃之Autotrace
- 執行計劃-1:獲取執行計劃
- Mysql SQL最佳化系列之——執行計劃連線方式淺釋MySql
- MySQL——通過EXPLAIN分析SQL的執行計劃MySqlAI
- Oracle SQL調優系列之SQL Monitor ReportOracleSQL
- MongoDb學習之Explain執行計劃MongoDBAI
- Oracle優化案例-view merge與coe_load_sql_profile固定執行計劃(十五)Oracle優化ViewSQL
- SQL優化案例-改變那些CBO無能為力的執行計劃(一)SQL優化
- 不會看 Explain執行計劃,勸你簡歷別寫熟悉 SQL優化AISQL優化
- 不會看 Explain 執行計劃,勸你簡歷別寫熟悉 SQL 優化AISQL優化
- SQL最佳化案例-從執行計劃定位SQL問題(三)SQL
- SQL執行計劃異常引起的效能問題SQL
- SQL執行計劃異常 引起的效能問題SQL
- SQLServer統計監控SQL執行計劃突變的方法SQLServer
- MySQL查詢優化之優化器工作流程以及優化的執行計劃生成MySql優化
- 【MySQL】MySQL的執行計劃及索引優化MySql索引優化
- MySQL 5.7 優化不能只看執行計劃MySql優化
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- spark sql語句效能最佳化及執行計劃SparkSQL
- 檢視SQL執行計劃的幾種常用方法YQSQL
- 達夢資料庫SQL執行計劃檢視方法資料庫SQL
- 【TUNE_ORACLE】定製化執行計劃SQL參考OracleSQL
- 在MySQL中使用explain查詢SQL的執行計劃MySqlAI
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- MySQL執行計劃MySql