<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 閱讀(1038) 評論(0)  編輯  收藏 所屬分類: database

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

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類(15)

    隨筆檔案(16)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成人黄动漫画免费网站视频 | 亚洲人成网站18禁止一区| 亚洲视频在线观看2018| 日本一卡精品视频免费 | 亚洲av无码专区在线观看亚| AA免费观看的1000部电影| 亚洲精品美女网站| 天堂在线免费观看中文版| 亚洲 欧洲 日韩 综合在线| 插B内射18免费视频| 国产亚洲美女精品久久久久| 国产免费久久精品久久久| 精品视频免费在线| 亚洲精品无码高潮喷水在线| 国产麻豆成人传媒免费观看| 91情国产l精品国产亚洲区| 亚洲免费视频播放| 色偷偷尼玛图亚洲综合| 亚洲欧洲日产国码一级毛片 | 曰批全过程免费视频网址| 亚洲中文字幕日本无线码| 国产国产成年年人免费看片| 一级女性全黄生活片免费看| 亚洲AV无码久久精品色欲| 国产成人无码免费看视频软件 | 国产永久免费高清在线| 亚洲白色白色在线播放| 四虎www免费人成| 国产日韩久久免费影院| 91亚洲精品视频| 日韩视频免费在线| 美女巨胸喷奶水视频www免费| 亚洲欧洲日韩国产| 波多野结衣中文一区二区免费| 国产午夜无码精品免费看| 国产成人精品日本亚洲18图| 亚洲AV无码不卡在线观看下载 | 成人黄动漫画免费网站视频| 大片免费观看92在线视频线视频 | 亚洲精品综合一二三区在线 | 亚洲爆乳无码专区|