<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Oracle分頁 導致數據總條數不變 而 出現重復記錄的問題的解決辦法

    今天在開發的時候用了oracle的分頁,語句如下(ibatis)
            SELECT *
            FROM (SELECT t1.*,rownum as linenum
            FROM (SELECT
            A.MEMBERID memberID,
            A.LOGNAME logName,
            A.STATUS status,
            A.UPDATETIME updateTime,
            A.OPERATORNAME operatorName
            FROM BD_BAOYANG_LIST A
            WHERE
            <![CDATA[
                    A.TYPE='BUY'
                  ]]>
            <dynamic>
                <isEqual property="status" compareValue="1" prepend="and">
                    A.STATUS=1
                </isEqual>
                <isEqual property="status" compareValue="-1" prepend="and">
                    <![CDATA[
                    A.STATUS<>1
                  ]]>
                </isEqual>
                <isNotEmpty property="memberID" prepend="and">
                    A.MEMBERID = #memberID#
                </isNotEmpty>
                <isNotEmpty property="logName" prepend="and">
                    A.LOGNAME = #logName#
                </isNotEmpty>
                <isNotEmpty property="startTime" prepend="and">
                    <![CDATA[
                       A.UPDATETIME >= cast(#startTime# as DATE)
                    ]]>
                </isNotEmpty>
                <isNotEmpty property="endTime" prepend="and">
                    <![CDATA[
                       A.UPDATETIME < cast(#endTime# as DATE)+1
                    ]]>
                </isNotEmpty>
            </dynamic>
            <![CDATA[
                              ORDER BY A.UPDATETIME DESC) t1
    WHERE ROWNUM <= #endRow#) t2
     WHERE linenum >= #startRow#
    ]]>
    在運行后發現查詢出來的結果總條數和數據庫里的記錄數量是一致的,但是出現了數據重復現象,也就是說有些數據被重復的記錄替換了。
    一開始以為是Java程序邏輯問題,經過認真的排查,排除了程序的問題。
    仔細看了一下數據庫里的數據,發現UPDATETIME這一列的數據格式是yyyy-MM-dd沒有小時-分-秒的。這樣該列的數據就出現了重復現象,這時我產生了疑問:難道oracle在對數據進行排序的時候對重復的排序條件是不能保證順序的不變性?
    帶著這個問題我查詢了oarcle的相關資料。
    經過查詢資料發現,oracle在對小量數據查詢的時候會將數據放到緩存內進行排序,當數據量達到一定程度時會將數據在磁盤排序,而磁盤排序時當遇到排序條件相同的情況下,會根據該條記錄的更新時間進行排序(我想可能是ROWID),但是如果放到內存排序的話如果不指定排序條件就不會走更新時間,因此我在上面的程序ORDER BY A.UPDATETIME DESC 修改成ORDER BY A.UPDATETIME DESC,A.ROWID DESC這樣就解決了問題,但是這樣解決的方式十分的不優雅,第一:這樣UPDATETIME上建立的索引就不再起作用,第二:當該表數據量很大的時候,就會導致查詢非常耗時,但是業務要求又必須按照UPDATETIME來進行排序,因此建議如果表的數據量很大就應該將該時間字段 提供 小時/分鐘/秒鐘
    OVER!!!!!!!!!!!!

    posted on 2011-01-18 19:04 himalayas 閱讀(1037) 評論(0)  編輯  收藏 所屬分類: database

    <2011年1月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類(15)

    隨筆檔案(16)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩亚洲人成在线综合| 亚洲精品第一综合99久久| 国产又粗又长又硬免费视频 | av无码免费一区二区三区| 亚洲AV日韩AV天堂一区二区三区| 好男人资源在线WWW免费| 亚洲中文字幕不卡无码| 中国精品一级毛片免费播放| 亚洲一区二区三区在线观看精品中文 | 中文字幕亚洲激情| 色拍自拍亚洲综合图区| 最近免费2019中文字幕大全| 亚洲最大黄色网站| 最近2019中文字幕免费看最新| 亚洲综合伊人制服丝袜美腿| 成熟女人特级毛片www免费| 亚洲AV无码成人精品区日韩| 午夜免费福利小电影| 亚洲春黄在线观看| 成人在线免费观看| 国产亚洲视频在线观看| 精品国产亚洲男女在线线电影| 人妻在线日韩免费视频| 亚洲精品韩国美女在线| 无码一区二区三区AV免费| 免费播放美女一级毛片| 亚洲高清国产AV拍精品青青草原| 99久在线国内在线播放免费观看| 中中文字幕亚洲无线码| 免费v片视频在线观看视频| 国产拍拍拍无码视频免费| 免费一级特黄特色大片在线观看| 国产精品美女久久久免费| 久久精品国产亚洲av麻豆色欲 | 免费无码毛片一区二区APP| 激情亚洲一区国产精品| 免费在线观看a级毛片| 免费精品一区二区三区第35| 亚洲性无码一区二区三区| 亚洲国产av无码精品| 永久看日本大片免费35分钟|