Oracle 分页语句排序问题

四火 发布于 2013/08/20 13:15
阅读 269
收藏 0

 语句:

 SELECT *

    FROM (SELECT TEMP.*, ROWNUM RN
            FROM (SELECT CODE,
                         NAME,
                         ITEMCODE,
                         ITEMNAME,
                         ITEMPARENT,
                         SELECTED,
                         MULTI_SELECTED,
                         ONLY_SELECT_LEAF_NODE
                    FROM XSR_REP_JQ_JK_DICT T
                   WHERE T.SERVER_ID = 140717
                     AND T.SOLUTION_NAME = 'JQDTYB'
                   ORDER BY CODE ASC) TEMP
           WHERE ROWNUM <= 4830)
   WHERE RN > 4820;

语句:

  SELECT *
    FROM (SELECT TEMP.*, ROWNUM RN
            FROM (SELECT CODE,
                         NAME,
                         ITEMCODE,
                         ITEMNAME,
                         ITEMPARENT,
                         SELECTED,
                         MULTI_SELECTED,
                         ONLY_SELECT_LEAF_NODE
                    FROM XSR_REP_JQ_JK_DICT T
                   WHERE T.SERVER_ID = 140717
                     AND T.SOLUTION_NAME = 'JQDTYB'
                   ORDER BY CODE ASC) TEMP
           WHERE ROWNUM <= 4820)
   WHERE RN > 4810;



查询结果一样,请问大家什么原因?


加载中
1
winters
winters

我遇到过这种情况,不过我遇到的是不同的分页参数里三四条数据重复出现,你更极端,10条完全一样。

oracle在执行这条语句的时候,会把ROWNUM <= 4820/4830这个子句压到最里层的select里面去。据说是为了优化,因为这样可以只针对4820/4830条数据做排序,而不是整个数据集。

所以咯,这俩sql的逻辑实际是先按4820/4830条数据,然后在ORDER BY CODE ASC。赶上两页出现重复数据,是点儿背。

据我一个同事说,如果最里层order by 子句里有主键就ok。

四火
四火
我明白了,只要order by 里面有不重复的数据就行。
0
魔力猫
魔力猫
我想知道的是 CODE这个字段到底有多少可选择性。
0
戴威
戴威

引用来自“winters”的答案

我遇到过这种情况,不过我遇到的是不同的分页参数里三四条数据重复出现,你更极端,10条完全一样。

oracle在执行这条语句的时候,会把ROWNUM <= 4820/4830这个子句压到最里层的select里面去。据说是为了优化,因为这样可以只针对4820/4830条数据做排序,而不是整个数据集。

所以咯,这俩sql的逻辑实际是先按4820/4830条数据,然后在ORDER BY CODE ASC。赶上两页出现重复数据,是点儿背。

据我一个同事说,如果最里层order by 子句里有主键就ok。

我遇到的是翻页之后数据没变。
返回顶部
顶部