问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

解决Oracle分页查询中排序与效率问题

发布网友 发布时间:2023-01-15 17:17

我来回答

1个回答

热心网友 时间:2023-07-01 12:30

  原始未分页查询Sql代码如下  

  select ROWNUM rn t id ID o name YYB u name XM t MC from tZDYSX   t tuser u lbanization o where t cjr=u id and id=code and t gx =    order by ID 

  结果如下 RN    ID      YYB       XM     MC        某证券总部     管理员 测试      某证券总部     管理员 持有上港 股以上     某证券总部     管理员 十年规划    某证券总部     管理员 开发渠道为上海    某证券总部     管理员 万科A    某证券总部     管理员    某证券总部     管理员 今天过生日的客户      某证券总部     管理员 客户状态正常     某证券总部     管理员 无交易    某证券总部     管理员 OA     某证券总部     管理员 幸运客户    某证券总部     管理员 风险型    某证券总部     管理员 tst    白沙网上交易   安昌彪 安客户正常     某证券总部     管理员    某证券总部     管理员 客户号包含    某证券总部     管理员 aaa    某证券总部     管理员 ssssssss    某证券总部     管理员    某证券总部     管理员    某证券总部     管理员    某证券总部     管理员 aaaaaa

   rows selected

  最初我使用如下Sql代码查询  

  select * from (select ROWNUM rn t id ID o name YYB u name XM t MC    from tZDYSX t tuser u lbanization o where t cjr=u id and id=code and    t gx = order by t ID )Where rn> and rn<= ; 

  这种方法能成功分页 结果如下 RN    ID        YYB       XM      MC    某证券总部     管理员 开发渠道为上海    某证券总部     管理员 万科A    某证券总部     管理员    某证券总部     管理员 今天过生日的客户    某证券总部     管理员 客户号包含    某证券总部     管理员 aaa    某证券总部     管理员 ssssssss    某证券总部     管理员    某证券总部     管理员    某证券总部     管理员 aaaaaa

   rows selected

  从结果看来 有个问题 此语句Sql代码 order by CJSJ DESC  被执行 但是是在分后的第 到 条记录的结果集中再进行排序 而不是先排序后分页 (本来希望显示ID为 到 结果变为 到 )

  后来变为以下Sql代码查询  

  SELECT *    FROM(    SELECT ROWNUM RN TA *    FROM(   select t id ID o name YYB u name XM t MC   from tZDYSX t tuser u lbanization o    where t cjr=u id and id=code and t gx = order by t ID   )TA WHERE ROWNUM <=    )WHERE RN >   SELECT * FROM( SELECT ROWNUM RN TA * FROM(select t id ID o name YYB u name XM t MCfrom tZDYSX t tuser u lbanization o where t cjr=u id and id=code and t gx = order by t ID)TA WHERE ROWNUM <= )WHERE RN >

  结果如下 RN    ID     YYB           XM     MC    某证券总部     管理员 幸运客户    某证券总部     管理员 风险型    某证券总部     管理员 tst    白沙网上交易   安昌彪 安客户正常    某证券总部     管理员    某证券总部     管理员 客户号包含    某证券总部     管理员 aaa    某证券总部     管理员 ssssssss    某证券总部     管理员    某证券总部     管理员

   rows selected

  看来结果是正确的

  总结 第二种方法其中最内层的查询Sql代码

  

  select t id ID o name YYB u name XM t MC   from tZDYSX t tuser u lbanization o    where t cjr=u id and id=code and t gx = order by t ID 

  表示不进行翻页的原始查询语句 ROWNUM <= 和RN > 控制分页查询的每页的范围 第二种方法在大多数情况拥有较高的效率 分页的目的就是控制输出结果集大小 在上面的分页查询语句中 这种考虑主要体现在WHERE ROWNUM <= 这句上

  选择第 到 条记录存在两种方法 第二种方法正是在查询的第二层通过ROWNUM <= 来控制最大值 在查询的最外层控制最小值 而第一种方法是去掉查询第二层的WHERE ROWNUM <= 语句 在查询的最外层控制分页的最小值和最大值

  一般来说 第二个查询的效率比第一个高得多 这是由于CBO 优化模式下 Oracle可以将外层的查询条件推到内层查询中 以提高内层查询的执行效率 对于第二个查询语句 第 层的查询条件WHERE ROWNUM <= 就可以被Oracle推入到内层查询中 这Oracle查询的结果一旦超过了ROWNUM*条件 就终止查询将结果返回了

  而第一个查询语句 由于查询条件Where rn> and rn<= 是存在于查询的第三层 而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义 因为最内层查询不知道RN代表什么) 因此 对于第一个查询语句 Oracle最内层返回给中间层的是所有满足条件的数据 而中间层返回给最外层的也是所有数据 数据的过滤在最外层完成 显然这个效率要比第二个查询低得多

lishixin/Article/program/Oracle/201311/17706
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有人在宿舍安路由器吗 PF89式80毫米单兵火箭筒研制历史 我们的学校宿舍有电话插口。我们想装路由器几个人一起上网。要怎么弄... 昙花一现的解放军自研两截式火箭筒:70式62毫米反坦克火箭筒 近炸引信分类 安装SQL时,我进入了x86/setup文件夹后,执行setupsql.exe,提示却是:_百... 我爸左胸自发性气胸都引流八天了,怎么还没见好转,还有那么多泡泡,今 ... 73岁糖尿病患者 突然左脑出血 引流手术 和器官切除后17天了能 挣眼手 ... 索爱st18i2.3.3 之前用一键root过,现在好像把camera哪个自带的程序误删... st18i能用什么软件刷机 猪骨红萝卜和土豆番茄汤可以放豆吗 番茄胡萝卜土豆汤的做法步骤图,怎么做好吃 想问一下黄金戒指的牌子上写宝石500是什么意思 银欣 SST-PS06B-W 机箱下置电源安装问题,电源是全汉AU500金牌,如果风扇朝下,就没法螺丝孔固定了 全汉 AU-500 GTX460 显卡 500G硬盘 在此基础上加了一块1T硬盘后开机硬盘就吱吱响 是电源供电不足吗? 全汉FSP AURUM AU-500不供电啊 中晖珠宝A u916是黄金吗?含量多少 戴尔笔记本连不上wifi怎么办 戴尔笔记本连不上wifi的方法 怎么在电脑上修复com.tencent ppt彩色字体怎么弄的?ppt字体怎么变彩色? 宾得18-55套头50段成像好还是凤凰标头50mm&#47;1.7成像好,还有宾得50-200,135段好还是凤凰135MM&#47;2.8好? 上海浦东张江农商银行是不是总行 王者荣耀新春佳节炎黄子孙指定英雄有哪些 王者荣耀新春碎片匹配到猪年限定皮肤会不会增加 王者荣耀新春活动英雄有了给多少英雄碎片 新 海洋馆里的海草是什么颜色的 数字接龙3d游戏怎么玩 电动车买什么牌子的好呢?各位建议一下 新洪城大市场抓电动车吗 怎么画寒假计划表 高考推迟月经的方法 高考怎样推迟月经到来,着凉月经会推迟几天 梦见自己挑水 染唇液有人体有害吗 长期涂染唇液会怎么样 叱咤读音是什么? 浙江工业大学之江学院新生宿舍条件图片环境怎么样,有独立卫生间吗 大金空调故障代码表一览表 安卓手机的,系统版本和核心版本是指什么? 计算圆柱侧面积的公式是___(用文字表示出来). ab同号用c语言形式表达 用c语言写出求出ab值得程序 倒三角用C语言怎么编程,例如:abcdefg abcdef abcde abcd abc ab a 单片机如何用中断切换程序,就是我现在用单片机实现功能A和B,用中断作为AB程序的切换,用C语言要怎 世事无常,大肠包小肠是指意外怀孕吗 燃气热水器滴滴报警不出热水什么原因?怎么解决? 在京东上买的cpu太卡能不能换 京东购买的电脑第二次故障怎么换新 从超市买回手抓饼怎样做 如何知道对方是否注销(怎么能知道注销成功?) 怎样辨别企业是否注销