oracle count 百萬級 分頁查詢記要總數、總條數優化


oracle count 百萬級 分頁查詢記錄總數、總條數優化

oracle count 百萬級 查詢記錄總數、總條數優化 

最近做一個項目時,做分頁時,發現分頁查詢速度很慢,分頁我做的是兩次查詢,一次是查詢總數,一次是查詢分頁結果

/** 查詢總記錄數 **/
    SELECT
        COUNT(id) 
    FROM
        USER 
    order by
        id

/** 查詢結果集 **/
select
        * 
    from
        ( select
            row_.*,
            rownum rownum_ 
        from
            ( select
                id , 
                user_number,
                user_name,
                user_password,     
                sex,
                Registered_time,
                last_login_time,
                post
                    from
                USER  u
            order by
                u.id) row_ 
        where
            rownum <= ?
        ) 
    where
        rownum_ > ?

 

user表中的記錄是128萬多條,這個是沒有查詢條件時的查詢,也就是用戶剛剛進入模塊時的查詢,發現查詢時間是2566ms~2152ms之間,單獨執行每條語句,發現第一條的執行時間在2000ms以上,在PL/SQL中執行的結果也證實了我的判斷。所以要對select count語句進行優化。

     在網上找了很多優化方案,大多不盡人意,(分表的方式聽上去不錯,不過由於單表是歷史原因,這里就不作考慮)。最后找到一個比較令人滿意的答。就是在語句中加入 /*+ROWID(USER)*/或者/*+ INDEX(USER ID) */ 來提高查詢效果。

    聽說這個就是強制使用索引統計結果?如果有哪位大蝦能把原理詳細告訴我,請來多多指點!

SELECT  /*+ROWID(USER)*/   count(*)  FROM USER t 
或者
SELECT  /*+ INDEX(USER ID) */ count(*) FROM USER  t

 使用后,單條統計總數的查詢在800ms左右,分頁查詢結果基本在900ms~950ms之間,基本在一秒之內,達到了當初設計需求。

    當然,這個是沒有加查詢條件的,當把查詢條件加入后,不管前面加不加強制索引,結果時間都在2000ms之間,所以,如果要進行有條件的查詢,就要在where條件中進行優化。特別注意條件字段查詢前后順序。

    具體優化請參考

1.淺析Oracle語句優化規則

http://www.cnblogs.com/Automation_software/archive/2011/01/21/1940883.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM