小議分析函式中排序對結果的影響(一)
分析函式中經常會包括ORDER BY語句,而這個語句會對Oracle的執行結果產生影響。
看一個簡單的例子:
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已建立。
SQL> INSERT INTO T VALUES (1, 'A');
已建立 1 行。
SQL> INSERT INTO T VALUES (3, 'C');
已建立 1 行。
SQL> INSERT INTO T VALUES (2, 'B');
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM T;
ID NAME
---------- ------------------------------
1 A
3 C
2 B
如果不加任何的排序,直接查詢T表,Oracle根據記錄讀取的順序返回記錄,得到的結果是1、3、2。
下面加上帶ORDER BY語句的分析函式:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 1
2 B 3
3 C 6
可以看到,加上分析函式之後,由於分析函式中ORDER BY的存在,改變了最終結果中的排列順序。
下面將ORDER BY排序的欄位改為倒排序:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
3 C 3
2 B 5
1 A 6
得到的最終結果也是倒序的,那麼如果新增的分析函式,沒有排序語句呢:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER() SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 6
3 C 6
2 B 6
這次得到結果的順序就和沒有新增分析函式時一樣,Oracle根據記錄的讀取順序返回了最終的結果。
如果分析函式中包括了ORDER BY語句,則分析函式在計算結果的過程中就會對ORDER BY指定列進行排序,否則就無法得到相應的結果,不過這個排序是基於視窗的。
當不指定視窗語句,也沒有分割槽語句,那麼參加排序就是所有的記錄,因此Oracle根據ORDER BY語句中的順序返回結果也就不奇怪了。
事實上,這種情況下,如果分析函式中的ORDER BY語句和SQL語句中的ORDER BY語句一致的話,Oracle可以節省一次排序操作。
SQL> SET AUTOT ON STAT
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1
4 FROM T
5 ORDER BY ID;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 1
2 B 3
3 C 6
統計資訊
----------------------------------------------------------
4 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
572 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1
4 FROM T
5 ORDER BY ID;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 6
2 B 5
3 C 3
統計資訊
----------------------------------------------------------
4 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
572 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
3 rows processed
從這裡就可以清晰的看到,第一個SQL中分析函式與SQL的排序一致,整個SQL只執行了1次記憶體中的排序。
而第二個SQL中由於分析函式與SQL的排序不一致,所以統計資訊中可以看到2次記憶體中的排序。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-536320/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小議分析函式中排序對結果的影響(二)函式排序
- ASP中函式呼叫對引數的影響 (轉)函式
- DDL,DML操作對結果快取的影響快取
- 探索webpack熱更新對程式碼打包結果的影響(一)Web
- 嚴格模式對parseInt()函式的影響模式函式
- SQL查詢結果集對注入的影響及利用SQL
- 【SQL*Plus】直接X掉視窗對SQL*Plus中的操作結果的影響SQL
- 探索webpack熱更新對程式碼打包結果的影響(二)Web
- Oracle中實現查詢結果按照in中條件排序 InStr函式Oracle排序函式
- mysql事務對效率的影響分析總結JILEMySql
- DUMP函式結果的意思函式
- 源資料檔案(.csv)中的空格串和空串對pandas讀取結果的影響
- Oracle中過程/函式返回結果集Oracle函式
- 磁碟排序對Oracle資料庫效能的影響排序Oracle資料庫
- 索引及排序對執行計劃的影響索引排序
- oracle分析函式_小貼(一)Oracle函式
- NOT IN子查詢中出現NULL值對結果的影響你注意到了嗎Null
- Laravel 根據 relation sum 結果排序的小技巧Laravel排序
- python中函式如何返回多個結果?Python函式
- 磁碟排序對Oracle資料庫效能的影響PT排序Oracle資料庫
- 聊聊Oracle排序分析函式Oracle排序函式
- 排序(對於 sort 函式的使用)排序函式
- ORDER對查詢結果進行排序排序
- 突然斷電,是否會影響Mysql的執行結果MySql
- 函式小結函式
- 對前端開發中常使用的函式方法的一個小總結前端函式
- delete語句對索引的影響之分析delete索引
- 【分析方法論】屬性對行為的影響分析
- jQuery操作iframe中js函式的方法小結jQueryJS函式
- 【實驗】【外來鍵】小議外來鍵約束對應用程式的影響
- 軟體測試工具LoadRunner結果分析中的響應時間
- mongodb常用的兩種group方法,以及對結果排序MongoDB排序
- 修改主機時區對Oracle的影響分析Oracle
- 函式ZwQuerySystemInformation小結函式ORM
- Oracle 函式小結Oracle函式
- RANK函式小結函式
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- 中金公司:疫情對市場及盈利的影響分析(附下載)