欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle分頁查詢性能優(yōu)化代碼詳解

 更新時間:2017年09月26日 14:31:14   作者:sunansheng  
這篇文章主要介紹了Oracle分頁查詢性能優(yōu)化代碼詳解,簡述了進行分頁查詢性能優(yōu)化的原因,具有一定參考價值,需要的朋友可以了解下。

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

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

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

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

SQL>create table test as select * from dba_objects;

并反復地插入相同數(shù)據(jù)。

SQL>insert into test select * from test;

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

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

現(xiàn)在分別采用兩種分頁方式,在第一種分頁方式中:

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 個,結(jié)果滿足了,但是效率是很差的,如果采用第二種方式:

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
     ……

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

從上面的例子可以再想到,因為 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
     ……

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

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%的數(shù)據(jù),而沒有興趣看最后面的數(shù)據(jù),通過第二種改良的分頁技術(shù),可以方便快速地顯示前面的數(shù)據(jù),而且不會讓用戶感覺到慢。

總結(jié)

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

相關(guān)文章

  • expdp  中ORA-39002、ORA-39070錯誤詳解及解決辦法

    expdp 中ORA-39002、ORA-39070錯誤詳解及解決辦法

    這篇文章主要介紹了expdp 中ORA-39002、ORA-39070錯誤詳解及解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • oracle創(chuàng)建dblink方法示例

    oracle創(chuàng)建dblink方法示例

    這篇文章主要介紹了oracle創(chuàng)建dblink方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • oracle正則表達式regexp_like的用法詳解

    oracle正則表達式regexp_like的用法詳解

    本篇文章是對oracle正則表達式regexp_like的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • oracle遠程連接服務器數(shù)據(jù)庫圖文教程

    oracle遠程連接服務器數(shù)據(jù)庫圖文教程

    這篇文章主要為大家詳細介紹了oracle遠程連接服務器數(shù)據(jù)庫的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • centos下Oracle11G圖文安裝教程

    centos下Oracle11G圖文安裝教程

    這篇文章主要為大家詳細介紹了centos下Oracle11G圖文安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Oracle 中Contains 函數(shù)的用法

    Oracle 中Contains 函數(shù)的用法

    這篇文章主要介紹了Oracle 中Contains 函數(shù)的用法,查詢地址在某個城市的學生,sql語句給大家介紹的非常詳細,需要的朋友可以參考下
    2017-11-11
  • Oracle解鎖的方式介紹

    Oracle解鎖的方式介紹

    通過SQL查詢可以查看到被鎖住的表AA以及Sid,Serial#;使用DBA身份,通過執(zhí)行 alter system kill session 'SID,SERIAL#';即可解鎖
    2013-06-06
  • 基于Oracle多庫查詢方法(分享)

    基于Oracle多庫查詢方法(分享)

    下面小編就為大家分享一篇Oracle多庫查詢方法,具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • ORACLE 報警日志如何查看?

    ORACLE 報警日志如何查看?

    目得:首先了解什么是外部表,與其它表的區(qū)別,建立一個簡單的外部表(主要看操作過程),最后我們用外部表查看ORACLE報警日志
    2009-06-06
  • Oracle使用like查詢時對下劃線的處理方法

    Oracle使用like查詢時對下劃線的處理方法

    這篇文章主要介紹了Oracle使用like查詢時對下劃線的處理方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論