快捷搜索:

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

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

select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX

t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1

order by ID

结果如下:

RNIDYYBXMMC

---------- ----------------- ----------------------

349某证券总部治理员 测试

496某证券总部治理员 持有上港10000股以上

5102 某证券总部治理员 十年筹划

14105 某证券总部治理员 开拓渠道为上海

11106 某证券总部治理员 万科A

12107 某证券总部治理员 11

13108 某证券总部治理员 本日过生日的客户

2109 某证券总部治理员 客户状态正常

6110 某证券总部治理员 无买卖营业

7111 某证券总部治理员 OA

8112 某证券总部治理员 幸运客户

9113 某证券总部治理员 风险型

10114 某证券总部治理员 tst

22115 白沙网上买卖营业安昌彪 安客户正常

1118 某证券总部治理员 213

18119 某证券总部治理员 客户号包孕1008

17120 某证券总部治理员 aaa

19123 某证券总部治理员 ssssssss

20124 某证券总部治理员 www

21126 某证券总部治理员 123123

15127 某证券总部治理员 1212

16128 某证券总部治理员 aaaaaa

22 rows selected

最初我应用如下Sql代码查询:

select * from (select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC

from tZDYSX t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and

t.gx = 1 order by t.ID )Where rn>10 and rn

这种措施能成功分页,结果如下:

RNIDYYBXMMC

---------- ----------------- -------------------

14105 某证券总部治理员 开拓渠道为上海

11106 某证券总部治理员 万科A

12107 某证券总部治理员 11

13108 某证券总部治理员 本日过生日的客户

18119 某证券总部治理员 客户号包孕1008

17120 某证券总部治理员 aaa

19123 某证券总部治理员 ssssssss

20124 某证券总部治理员 www

15127 某证券总部治理员 1212

16128 某证券总部治理员 aaaaaa

10 rows selected

从结果看来,有个问题:此语句Sql代码

order by CJSJ DESC被履行,然则是在分后的第11到20笔记录的结果集中再进行排序,而不是先排序后分页。(原先盼望显示ID为112到126,结果变为105到128)

后来变为以下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,lborganization o

where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID

)TA WHERE ROWNUM10

SELECT *

FROM(

SELECT ROWNUM RN,TA.*

FROM(

select t.id ID, o.name YYB,u.name XM, t.MC

from tZDYSX t,tuser u,lborganization o

where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID

)TA WHERE ROWNUM10

结果如下:

RNIDYYBXMMC

---------- ----------------- -------------------

11112 某证券总部治理员 幸运客户

12113 某证券总部治理员 风险型

13114 某证券总部治理员 tst

14115 白沙网上买卖营业安昌彪 安客户正常

15118 某证券总部治理员 213

16119 某证券总部治理员 客户号包孕1008

17120 某证券总部治理员 aaa

18123 某证券总部治理员 ssssssss

19124 某证券总部治理员 www

20126 某证券总部治理员 123123

10 rows selected

看来结果是精确的。

总结:第二种措施此中最内层的查询Sql代码

select t.id ID, o.name YYB,u.name XM, t.MC

from tZDYSX t,tuser u,lborganization o

where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID

表示不进行翻页的原始查询语句。ROWNUM10节制分页查询的每页的范围。

第二种措施在大年夜多半环境拥有较高的效率。分页的目的便是节制输出结果集大年夜小,在上面的分页查询语句中,这种斟酌主要体现在WHERE ROWNUM

选择第11到20笔记录存在两种措施,第二种措施恰是在查询的第二层经由过程ROWNUM 10 and rn<=20是存在于查询的第三层,而Oracle无法将第三层的查询前提推到最内层(纵然推到最内层也没故意义,由于最内层查询不知道RN代表什么)。是以,对付第一个查询语句,Oracle最内层返回给中心层的是所有满意前提的数据,而中心层返回给最外层的也是所稀有据。数据的过滤在最外层完成,显然这个效率要比第二个查询低得多。

这种分页对付单表查询、多表查询一样有效。

您可能还会对下面的文章感兴趣: