91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle分頁查詢性能優化代碼詳解

發布時間:2020-09-02 21:28:25 來源:腳本之家 閱讀:183 作者:sunansheng 欄目:數據庫

對于數據庫中表的數據的 Web 顯示,如果沒有展示順序的需要,而且因為滿足條件的記錄如此之多,就不得不對數據進行分頁處理。常常用戶并不是對所有數據都感興趣的,或者大部分情況下,他們只看前幾頁。

通常有以下兩種分頁技術可供選擇。

Select * from (
Select rownum rn,t.* from table t)
Where rn>&minnum and rn<=&maxnum
或者
Select * from (
Select rownum rn,t.* from table t rownum<=&maxnum)
Where rn>&minnum

看似相似的分頁語句,在響應速度上其實有很大的差別。來看一個測試過程,首先創建一個測試表。

SQL>create table test as select * from dba_objects;

并反復地插入相同數據。

SQL>insert into test select * from test;

最后,查詢該表,可以看到該表的記錄數約為 80 萬條。

SQL> select count(*) from test
 COUNT(*)
----------
  831104

現在分別采用兩種分頁方式,在第一種分頁方式中:

SQL> select * from (
 2 select rownum rn,t.* from test t)
 3 where rn>0 and rn <=50;
  
已選擇50行。
已用時間: 00: 00: 01.03
  
Execution Plan
----------------------------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=65 Bytes=12350)
  1  0  VIEW (Cost=10 Card=65 Bytes=12350)
  2  1   COUNT
  3  2    TABLE ACCESS (FULL) OF 'TEST' (Cost=10 Card=65 Bytes=5590)
  
Statistics
----------------------------------------------------------
     0 recursive calls
     0 db block gets
   10246 consistent gets
     0 physical reads
     0 redo size
     ……

可以看到,這種方式查詢第一頁的一致性讀有 10246 個,結果滿足了,但是效率是很差的,如果采用第二種方式:

SQL> select * from (
 2 select rownum rn,t.* from test t
 3 where rownum <=50)
 4 where rn>0;
 
已選擇50行。
已用時間: 00: 00: 01.00
 
Execution Plan
----------------------------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=50 Bytes=9500)
  1  0  VIEW (Cost=10 Card=50 Bytes=9500)
  2  1   COUNT (STOPKEY)
  3  2    TABLE ACCESS (FULL) OF 'TEST' (Cost=10 Card=65 Bytes=5590)
 
Statistics
----------------------------------------------------------
     0 recursive calls
     0 db block gets
     82 consistent gets
     0 physical reads
     0 redo size
     ……

得到了同樣的結果,一致性讀只有 82 個,從以上的例子可以看到,通過把 rownum 引入到第二層,卻得到了一個完全不一樣的執行計劃,注意在執行計劃中的 stopkey,它是 8i 引入的新操 作,這種操作專門為提取 Top n 的需求做了優化。

從上面的例子可以再想到,因為 stopkey 的功能影響到了分頁的一致性讀的多少,會不會越往后翻頁速度就越慢呢?事實也的確如此,例如:

SQL> select * from (
 2 select rownum rn,t.* from test t
 3 where rownum <=10000)
 4 where rn>9950;
 
已選擇50行。
已用時間: 00: 00: 01.01
 
Statistics
----------------------------------------------------------
     0 recursive calls
     0 db block gets
    2616 consistent gets
     0 physical reads
     0 redo size
     ……

選擇靠后一點的數據時,邏輯讀開始變大,當選擇到最后幾頁時,一致性讀已經與上面的相似了。

SQL> select * from (
 2 select rownum rn,t.* from test t
 3 where rownum <=800000)
 4 where rn>799950;
 
已選擇50行。
已用時間: 00: 00: 01.03
 
Statistics
----------------------------------------------------------
     0 recursive calls
     0 db block gets
   10242 consistent gets
     0 physical reads
     0 redo size
     ……

不過,所幸的是,大部分的用戶只看開始 5%的數據,而沒有興趣看最后面的數據,通過第二種改良的分頁技術,可以方便快速地顯示前面的數據,而且不會讓用戶感覺到慢。

總結

以上就是本文關于Oracle分頁查詢性能優化代碼詳解的全部內容,希望對大家有所幫助。歡迎大家參閱本站其他有關專題,有什么問題可以隨時留言,小編會及時回復大家的。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

满洲里市| 公主岭市| 盘山县| 顺昌县| 双峰县| 徐闻县| 句容市| 天祝| 云龙县| 通化市| 灵川县| 崇信县| 锡林浩特市| 石屏县| 三河市| 沙洋县| 泌阳县| 信宜市| 镇巴县| 江油市| 麦盖提县| 延川县| 武威市| 巴南区| 贵港市| 姜堰市| 云林县| 旬邑县| 沾益县| 南丰县| 宁城县| 墨脱县| 枣阳市| 玛沁县| 龙海市| 鄯善县| 义乌市| 万盛区| 米林县| 滦平县| 株洲县|