【SQL 學習】排序問題之order by與索引排序
SQL> conn yang/yang as sysdba
已連線。
SQL> create table t as select object_id id ,object_name name
2 from dba_objects ;
表已建立。
SQL> set autot traceonly
一次普通的全表掃描,沒有排序的!
SQL> select id ,name from t;
已選擇68372行。
執行計劃
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 64794 | 4998K| 91 (2)| 00:00:02 |
| 1 | TABLE ACCESS FULL| T | 64794 | 4998K| 91 (2)| 00:00:02 |
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
統計資訊
----------------------------------------------------------
68 recursive calls
0 db block gets
4943 consistent gets
325 physical reads
0 redo size
2936793 bytes sent via SQL*Net to client
50554 bytes received via SQL*Net from client
4560 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
68372 rows processed
--根據id 排序!注意執行計劃裡面的TempSpc 是臨時空間,大小11M
SQL> select id ,name from t order by id;
已選擇68372行。
執行計劃
----------------------------------------------------------
Plan hash value: 961378228
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 64794 | 4998K| | 1283 (1)| 00:00:16 |
| 1 | SORT ORDER BY | | 64794 | 4998K| 11M| 1283 (1)| 00:00:16 |
| 2 | TABLE ACCESS FULL| T | 64794 | 4998K| | 91 (2)| 00:00:02 |
-----------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
統計資訊
----------------------------------------------------------
4 recursive calls
0 db block gets
394 consistent gets
0 physical reads
0 redo size
2663362 bytes sent via SQL*Net to client
50554 bytes received via SQL*Net from client
4560 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
68372 rows processed
--在表的 id 欄位建立索引,並進行資訊統計。
SQL> create index idx_id on t(id) ;
索引已建立。
SQL> exec dbms_stats.gather_table_stats(user ,'T',cascade => true);
PL/SQL 過程已成功完成。
SQL> select id ,name from t order by id;
已選擇68372行。
執行計劃
----------------------------------------------------------
Plan hash value: 961378228
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 68372 | 1936K| | 638 (1)| 00:00:08 |
| 1 | SORT ORDER BY | | 68372 | 1936K| 5384K| 638 (1)| 00:00:08 |
| 2 | TABLE ACCESS FULL| T | 68372 | 1936K| | 91 (2)| 00:00:02 |
-----------------------------------------------------------------------------------
統計資訊
----------------------------------------------------------
151 recursive calls
0 db block gets
348 consistent gets
0 physical reads
0 redo size
2663362 bytes sent via SQL*Net to client
50554 bytes received via SQL*Net from client
4560 SQL*Net roundtrips to/from client
5 sorts (memory) --沒有使用索引比全表掃描多了四此排序。
0 sorts (disk)
68372 rows processed
--使用索引。執行計劃中沒有tempspac
SQL> select id ,name from t where id <1200 order by id;--加上了order by
已選擇1133行。
執行計劃
----------------------------------------------------------
Plan hash value: 827754323
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1167 | 33843 | 10 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1167 | 33843 | 10 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_ID | 1167 | | 4 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ID"<1200)
統計資訊
----------------------------------------------------------
1 recursive calls
0 db block gets
160 consistent gets
0 physical reads
0 redo size
37872 bytes sent via SQL*Net to client
1241 bytes received via SQL*Net from client
77 SQL*Net roundtrips to/from client
0 sorts (memory) --這裡可以看出沒有排序!
0 sorts (disk)
1133 rows processed
小結:
如果資料直接從索引獲取,也是有序的,此時加order by,cbo不會執行sort 排序動作的。即,加上order by對效能也不會有什麼影響!
其實這裡還是有疑問的
1 根據id 排序 走全表掃描和建立了索引後資訊統計上有差別,前者比後者少了3個sort 操作!而後者的TempSpc比全表掃描少了將近一半!
2 關於TempSpc 的理解如果是臨時表空間 ,就用到了磁碟排序了 ,而執行上面沒有顯示disk sort!
對這兩個問題問個為什麼?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-677669/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MYSQL order by排序與索引關係總結MySql排序索引
- MySQL利用索引優化ORDER BY排序語句MySql索引優化排序
- 索引無法消除排序的問題索引排序
- 學習筆記--- 比較排序之堆排序筆記排序
- 【SQL 學習】UNION 的排序方式!SQL排序
- SQL SERVER和ORACLE的排序問題SQLServerOracle排序
- Elasticsearch聚合學習之五:排序結果不準的問題分析Elasticsearch排序
- SQL優化之利用索引排序SQL優化索引排序
- 【R語言學習筆記】若干排序問題R語言筆記排序
- MySQL Order BY 排序過程MySql排序
- order by改分組排序排序
- Oracle學習系列—關於字元數字混合排序和中文排序的問題Oracle字元排序
- 演算法學習之選擇排序和堆排序:演算法排序
- 演算法與排序--索引演算法排序索引
- 【SQL 學習】minus 和intsect 的排序方式!SQL排序
- R排序sort、order、rank、arrange排序
- 3 SQL 聚合與排序SQL排序
- 字串排序問題字串排序
- group by 排序問題排序
- Collections排序問題!!排序
- 中文排序 問題排序
- Python 排序---sort與sorted學習Python排序
- 【索引】反向索引引起排序索引排序
- 【學習】SQL基礎-003-過濾排序SQL排序
- sql調優一例---索引排序hintSQL索引排序
- Elasticsearch聚合學習之四:結果排序Elasticsearch排序
- 演算法學習之簡單排序演算法排序
- Python之排序演算法:快速排序與氣泡排序Python排序演算法
- MySQL order by 排序結果不正確MySql排序
- MySQL 5.7 ORDER BY排序的優化MySql排序優化
- 章節排序問題排序
- oracle中排序問題Oracle排序
- 排序之快速排序排序
- Spark學習——排序ShuffleSpark排序
- 排序學習實踐排序
- 看動畫學演算法之:排序-count排序動畫演算法排序
- 看動畫學演算法之:排序-快速排序動畫演算法排序
- 演算法導論學習之三:排序之C語言實現:選擇排序,插入排序,歸併排序演算法排序C語言