從10g開始CBO下group by之後不能保證資料是按照分組欄位排序的!
大致步驟:
SQL> select id , avg(age) from tt1 group by id;
ID AVG(AGE)
---------- ----------
6 0
4 0
3 0
0 0
10 1
執行計劃
----------------------------------------------------------
Plan hash value: 112617873
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 30 | 5 (20)| 00:00:01 |
| 1 | HASH GROUP BY | | 5 | 30 | 5 (20)| 00:00:01 |
| 2 | TABLE ACCESS FULL| TT1 | 5 | 30 | 4 (0)| 00:00:01 |
---------------------------------------------------------------------------
統計資訊
----------------------------------------------------------
1 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
538 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
從上面執行計劃我們能看的出來10g裡面CBO下group by子句對應的執行計劃是HASH GROUP BY,而不是以前的SORT GROUP BY,因此group by之後oracle對資料並沒有排序。
SQL> select id , avg(age) from tt1 group by id order by id;
ID AVG(AGE)
---------- ----------
0 0
3 0
4 0
6 0
10 1
執行計劃
----------------------------------------------------------
Plan hash value: 3830178054
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 30 | 5 (20)| 00:00:01 |
| 1 | SORT GROUP BY | | 5 | 30 | 5 (20)| 00:00:01 |
| 2 | TABLE ACCESS FULL| TT1 | 5 | 30 | 4 (0)| 00:00:01 |
---------------------------------------------------------------------------
統計資訊
----------------------------------------------------------
1 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
538 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
5 rows processed
SQL>
當在分組之後加上order by子句(group by id order by id)時執行計劃由HASH GROUP BY變成了SORT GROUP BY,而SORT GROUP BY可以保證結果是進行過排序處理的。
SQL> select /*+ rule */ id , avg(age) from tt1 group by id ;
ID AVG(AGE)
---------- ----------
0 0
3 0
4 0
6 0
10 1
執行計劃
----------------------------------------------------------
Plan hash value: 3830178054
-----------------------------------
| Id | Operation | Name |
-----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT GROUP BY | |
| 2 | TABLE ACCESS FULL| TT1 |
-----------------------------------
Note
-----
- rule based optimizer used (consider using cbo)
統計資訊
----------------------------------------------------------
1 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
538 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
5 rows processed
SQL>
上面是在rbo下產生的執行計劃,依然使用的是SORT GROUP BY,也就是說rbo下group by之後資料還是進行了排序操作!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1002775/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 按照指定的欄位排序MySql排序
- MySQL GROUP BY分組取欄位最大值MySql
- SQL 分組排序group bySQL排序
- json 按照欄位分類JSON
- mysql資料表按照某個欄位分類輸出MySql
- SqlServer根據特定欄位分組後,對需要欄位進行分組拼接SQLServer
- 保證資料庫質量安全:從0開始的資料庫測試資料庫
- 欄位按照指定 ID 順序進行排序排序
- MySQL - 分組連線欄位函式GROUP_CONCAT的使用MySql函式
- 資料庫之DQL排序&分組&函式資料庫排序函式
- MySQL中表資料清除後,使欄位重新從1開始自增MySql
- 戴爾易安信:保護業務 從保護資料開始
- java8的stream將一個List轉為按照某個欄位分組的map,再按照另一個欄位取max最終得到一個mapJava
- mysql group_concat 實現把分組欄位寫成一行的方法MySql
- MySQL的Group By分組MySql
- 欄位排序排序
- pandas 分組合並欄位(qbit)
- mysql 字串型別的數值欄位按照數值的大小進行排序MySql字串型別排序
- 關於分組後欄位拼接的問題[行列轉換]『By duanzilin』
- Sql group by 分組取時間最新的一條資料SQL
- list集合根據某欄位分組
- PHP陣列多個欄位分別排序PHP陣列排序
- 動態為10g資料庫的表新增欄位,到256個欄位,hung住了?資料庫
- javascript: 帶分組資料的Table表頭排序JavaScript排序
- sql中的left切割 與 group by後的兩次分組SQL
- group by分組查詢
- group by分組函式之rollup與cube用法函式
- 從零開始資料分析01--什麼是資料分析
- 資料處理之欄位合併
- 從零開始學Python:第十二課-常用資料結構之元組Python資料結構
- Js實現Object按照值的某個欄位(數值型別)的大小進行排序JSObject型別排序
- mysql中文欄位排序MySql排序
- Oracle Goldengate是如何保證資料有序和確保資料不丟失的?OracleGo
- 從零開始學資料結構和演算法 (五) 分治法 (二分查詢、快速排序、歸併排序)資料結構演算法排序
- 從標準到技術,保證IT組織的安全
- Django筆記十七之group by 分組用法總結Django筆記
- 開始為Oracle 10g的OCA認證做準備,先從1z0-007開始~Oracle 10g
- 資料庫分離後不能附加了(轉)資料庫