Oracle分頁查詢語句(七)
Oracle的分頁查詢語句基本上可以按照本文給出的格式來進行套用。
Oracle分頁查詢語句(一):http://yangtingkun.itpub.net/post/468/100278
Oracle分頁查詢語句(二):http://yangtingkun.itpub.net/post/468/101703
Oracle分頁查詢語句(三):http://yangtingkun.itpub.net/post/468/104595
Oracle分頁查詢語句(四):http://yangtingkun.itpub.net/post/468/104867
Oracle分頁查詢語句(五):http://yangtingkun.itpub.net/post/468/107934
Oracle分頁查詢語句(六):http://yangtingkun.itpub.net/post/468/108677
在文章的最後看一下ORDER BY STOPKEY和ORDER BY在翻頁查詢的最後幾頁的效能差異:
SQL> CREATE TABLE T AS SELECT A.* FROM DBA_OBJECTS A, DBA_USERS B, TAB;
表已建立。
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
458064
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')
PL/SQL 過程已成功完成。
SQL> SET AUTOT TRACE
SQL> SET TIMING ON
SQL> SELECT OBJECT_ID, OBJECT_NAME
2 FROM
3 (
4 SELECT ROWNUM RN, OBJECT_ID, OBJECT_NAME
5 FROM
6 (
7 SELECT OBJECT_ID, OBJECT_NAME FROM T ORDER BY TIMESTAMP
8 )
9 WHERE ROWNUM <= 20
10 )
11 WHERE RN >= 11;
已選擇10行。
已用時間: 00: 00: 00.03
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13888 Card=20 Bytes=1840)
1 0 VIEW (Cost=13888 Card=20 Bytes=1840)
2 1 COUNT (STOPKEY)
3 2 VIEW (Cost=13888 Card=458064 Bytes=36187056)
4 3 SORT (ORDER BY STOPKEY) (Cost=13888 Card=458064 Bytes=18780624)
5 4 TABLE ACCESS (FULL) OF 'T' (Cost=537 Card=458064 Bytes=18780624)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5579 consistent gets
0 physical reads
0 redo size
694 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
10 rows processed
SQL> SELECT OBJECT_ID, OBJECT_NAME
2 FROM
3 (
4 SELECT ROWNUM RN, OBJECT_ID, OBJECT_NAME
5 FROM
6 (
7 SELECT OBJECT_ID, OBJECT_NAME FROM T ORDER BY TIMESTAMP
8 )
9 )
10 WHERE RN BETWEEN 11 AND 20;
已選擇10行。
已用時間: 00: 00: 09.05
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13888 Card=458064 Bytes=42141888)
1 0 VIEW (Cost=13888 Card=458064 Bytes=42141888)
2 1 COUNT
3 2 VIEW (Cost=13888 Card=458064 Bytes=36187056)
4 3 SORT (ORDER BY) (Cost=13888 Card=458064 Bytes=18780624)
5 4 TABLE ACCESS (FULL) OF 'T' (Cost=537 Card=458064 Bytes=18780624)
Statistics
----------------------------------------------------------
0 recursive calls
41 db block gets
5579 consistent gets
7935 physical reads
0 redo size
689 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
1 sorts (disk)
10 rows processed
對於翻頁查詢的前幾頁,採用ORDER BY STOPKEY的方式比ORDER BY效能上有很大的優勢,那麼對於分頁查詢的最後幾頁,ORDER BY STOPKEY是否和其他分頁查詢技術一樣,效能比普通方式還要低很多:
SQL> SELECT OBJECT_ID, OBJECT_NAME
2 FROM
3 (
4 SELECT ROWNUM RN, OBJECT_ID, OBJECT_NAME
5 FROM
6 (
7 SELECT OBJECT_ID, OBJECT_NAME FROM T ORDER BY TIMESTAMP
8 )
9 WHERE ROWNUM <= 458060
10 )
11 WHERE RN >= 458051;
已選擇10行。
已用時間: 00: 00: 09.07
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13888 Card=458060 Bytes=42141520)
1 0 VIEW (Cost=13888 Card=458060 Bytes=42141520)
2 1 COUNT (STOPKEY)
3 2 VIEW (Cost=13888 Card=458064 Bytes=36187056)
4 3 SORT (ORDER BY STOPKEY) (Cost=13888 Card=458064 Bytes=18780624)
5 4 TABLE ACCESS (FULL) OF 'T' (Cost=537 Card=458064 Bytes=18780624)
Statistics
----------------------------------------------------------
0 recursive calls
41 db block gets
5579 consistent gets
7933 physical reads
0 redo size
667 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
1 sorts (disk)
10 rows processed
SQL> SELECT OBJECT_ID, OBJECT_NAME
2 FROM
3 (
4 SELECT ROWNUM RN, OBJECT_ID, OBJECT_NAME
5 FROM
6 (
7 SELECT OBJECT_ID, OBJECT_NAME FROM T ORDER BY TIMESTAMP
8 )
9 )
10 WHERE RN BETWEEN 458051 AND 458060;
已選擇10行。
已用時間: 00: 00: 10.01
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13888 Card=458064 Bytes=42141888)
1 0 VIEW (Cost=13888 Card=458064 Bytes=42141888)
2 1 COUNT
3 2 VIEW (Cost=13888 Card=458064 Bytes=36187056)
4 3 SORT (ORDER BY) (Cost=13888 Card=458064 Bytes=18780624)
5 4 TABLE ACCESS (FULL) OF 'T' (Cost=537 Card=458064 Bytes=18780624)
Statistics
----------------------------------------------------------
0 recursive calls
41 db block gets
5579 consistent gets
7935 physical reads
0 redo size
649 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
1 sorts (disk)
10 rows processed
出乎意料的是,雖然ORDER BY STOPKEY的方式在分頁查詢的最後幾頁效能也有明顯的下降,但是在和普通的ORDER BY相比,無論從邏輯讀、物理讀還是從執行時間上看,二者都屬於一個數量級上的。
看來ORDER BY STOPKEY排序方式,在STOPKEY接近排序總量的時候也不會有明顯的效能下降。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2141077/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL查詢語句 (Oracle)SQLOracle
- golang透過mysql語句實現分頁查詢GolangMySql
- golang通過mysql語句實現分頁查詢GolangMySql
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- ORACLE結構化查詢語句Oracle
- oracle查詢語句查詢增加一列內容Oracle
- Oracle常用的系統查詢語句整理Oracle
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- mysql查詢語句MySql
- Oracle資料庫中的分頁查詢Oracle資料庫
- Mysql之查詢語句MySql
- sql查詢語句流程SQL
- SQL mother查詢語句SQL
- mysql查詢語句集MySql
- mysql查詢語句5:連線查詢MySql
- Elasticsearch 分頁查詢Elasticsearch
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- 資料庫查詢語句資料庫
- mysql高階查詢語句MySql
- 多表查詢建表語句
- Laravel 子查詢語句用法Laravel
- 找到Oracle資料庫中效能最差的查詢語句BSOracle資料庫
- Oracle優化案例-單表分頁語句的優化(八)Oracle優化
- NET 集合分頁查詢
- AntDesignBlazor示例——分頁查詢Blazor
- MySQL的分頁查詢MySql
- ThinkPhp框架:分頁查詢PHP框架
- 分頁查詢優化優化
- 寫一個“特殊”的查詢構造器 – (七、DML 語句、事務)
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- Oracle中如何查詢未使用繫結變數的SQL語句?Oracle變數SQL
- 在oracle中,select語句查詢欄位中非純數字值Oracle
- MySQL的簡單查詢語句MySql
- mysql dba常用的查詢語句MySql
- postgresql dba常用sql查詢語句SQL
- MySQL內連線查詢語句MySql
- hisql ORM 查詢語句使用教程SQLORM
- elasticsearch查詢之大資料集分頁查詢Elasticsearch大資料
- oracle語法相容--如何透過with recursive語法來實現oracle的分層查詢Oracle