【丁原】分頁sql中普通寫法和rowid寫法的效能比較
地址:http://rdc.taobao.com/blog/dba/html/134_oracle_page_compare.html
我們都知道,不管你翻多少頁,rowid寫法消耗的效能基本是恆定的,邏輯讀不會有很大的增加,普通寫法隨著你翻頁的頁數增加,邏輯讀成指數倍的增大。一般來說,大部分人關注只是的前面幾頁,甚至只是第一頁的查詢結果。那麼,對於只關注第一頁的應用來說,rowid寫法除了要回表之外,比普通寫法多做了一次關聯查詢,效能上肯定要差一點的,那麼,到底差多少呢?
1.普通寫法
SQL>select *
from (select row_.*, rownum rownum_
from (select *
from order_detail
where item_id = 182945
and deleted = 0
order by gmt_create desc) row_
where rownum <= 50)
where rownum_ >= 1;
----------------------------------------------------------------------------Operation |Name |Rows|Bytes |Cost(%CPU)| Time|
----------------------------------------------------------------------------
SELECT STATEMENT | |12|42216 |6(0)|00:00:01 | VIEW | |12|42216 |6(0)|00:00:01 |
COUNT STOPKEY | | | | | |
VIEW | |12|42060 |6(0)|00:00:01 |
TABLE ACCESS BY INDEX ROWID |ORDER_DETAIL |12| 5724 |6(0)|00:00:01 |
INDEX RANGE SCAN DESCENDING|IDX_ORDER_DET_ITE|12| |1(0)|00:00:01 |
----------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
51 consistent gets
0 physical reads
0 redo size
5412 bytes sent via SQL*Net to client
525 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
50 rows processed
結果:普通寫法第一頁消耗了51個邏輯讀。
2.rowid寫法
2 from (select rid
3 from (select r.rid, rownum linenum
4 from (select rowid rid
5 from order_detail
6 where item_id = 182945
7 and deleted = 0
8 order by gmt_create desc) r
9 WHERE rownum <= 50)
10 WHERE linenum >= 1) t1,
11 order_detail t2
12 where t1.rid = t2.rowid;
------------------------------------------------------------------------------
| Operation | Name |Rows|Bytes|Cost(%CPU)|Time |
------------------------------------------------------------------------------
SELECT STATEMENT | |12|6168 |13 (0)|00:00:01 |
NESTED LOOPS | |12|6168 |13 (0)|00:00:01 |
VIEW | |12| 300 | 1 (0)|00:00:01 |
COUNT STOPKEY | | | | | |
VIEW | |12| 144 | 1 (0)|00:00:01 |
INDEX RANGE SCAN DESCENDING| IDX_ORDER_DET_IT|12| 288 | 1 (0)|00:00:01 |
TABLE ACCESS BY USER ROWID | ORDER_DETAIL | 1| 489 | 1 (0)|00:00:01 |
------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
57 consistent gets
0 physical reads
0 redo size
6108 bytes sent via SQL*Net to client
525 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
50 rows processed
結果:rowid寫法第一頁消耗了57個邏輯讀。
從上面的實驗結果來看,rowid要比普通寫法多消耗6個邏輯讀,影響還是挺大的。對於有些sql語句,動不動每小時執行300萬次之上,使用rowid寫法就是多消耗1800萬以上的邏輯讀,這個還是值得我們去衡量的。
注:
1.這個實驗僅僅是分頁中第一頁的效能比較,隨著分頁的增加,rowid的優勢會逐漸體現出來
2.6個邏輯讀僅僅是這個sql的差距,不同的sql可能是不一樣的
3.rowid寫法的邏輯讀隨著分頁次數增加也會逐漸增大,因為掃描索引是省不了的,不過增加的邏輯讀塊很少
--EOF--
作者:丁原 | 【轉載時請務必以超連結形式標明文章原始出處和作者資訊及本宣告】
地址:http://rdc.taobao.com/blog/dba/html/134_oracle_page_compare.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-247884/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 神奇的 SQL 之別樣的寫法 → 行行比較SQL
- oracle 分頁寫法Oracle
- Mysql 分組排序的sql寫法MySql排序
- Oracle SQL寫法OracleSQL
- 資料分佈決定SQL寫法SQL
- SQL常用的特殊寫法SQL
- sql寫法小記SQL
- SQL語句規範的寫法SQL
- OCI插入SQL語句的寫法SQL
- Oracle環境下SQL語句的不同寫法效率對比OracleSQL
- 031、Vue3+TypeScript基礎,路由中to的字串寫法和物件寫法2種寫法VueTypeScript路由字串物件
- php中if的4種寫法PHP
- HTML中重定向的寫法HTML
- struts分頁如何解決?誰能提供比較好的解決辦法
- 許可權控制下的SQL寫法SQL
- 字串大小寫轉換和字串的比較字串
- latex 中矩陣寫法矩陣
- 程式的寫法
- gcc-avr中中斷的寫法GCVR
- 普通法和大陸法的區別
- fastadmin分類表單寫法AST
- iOS中單例的通用寫法iOS單例
- React中的HTML轉義寫法ReactHTML
- SQL Server中巧用另類寫法代替Like語句SQLServer
- mysql上排名sql的寫法,類似oracle的rank和denseMySqlOracle
- data (){..} 返回一個物件或者不返回物件,兩種寫法的差異比較物件
- 一種我認為比較好的MVP寫法封裝,你值得擁有MVP封裝
- MySQL 中的 distinct 和 group by 的效能比較MySql
- 關於號段選取的sql寫法SQL
- Update 多個關聯表SQL的寫法SQL
- 陣列分組chunk的一種寫法陣列
- css寫法CSS
- shell if 寫法
- MySQL與SQL的觸發器的不同寫法MySql觸發器
- RN中佈局樣式的寫法
- android中MK檔案的寫法Android
- 請求引數為物件,mybatis的sql寫法物件MyBatisSQL
- 標準SQL寫法的重複列問題SQL