日期:2011-01-25 22:55:00 来源:本站整理
<b>详解Oracle的几种分页查询语句-入门底子</b>[Oracle防范]
本文“<b>详解Oracle的几种分页查询语句-入门底子</b>[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
分页查询格局:
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)WHERE RN >= 21
此中最内层的查询SELECT * FROM TABLE_NAME表示不举行翻页的原始查询语句.ROWNUM <= 40和RN >= 21掌握分页查询的每页的范围.
上面给出的这个分页查询语句,在大大都情形拥有较高的效率.分页的目的就是掌握输出后果集大小,将后果尽快的返回.在上面的分页查询语句中,这种考虑主要表目前WHERE ROWNUM <= 40这句上.
挑选第21到40条记录存在两种办法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来掌握最大值,在查询的最外层掌握最小值.而另一种方法是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层掌握分页的最小值和最大值.这是,查询语句以下:
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A )WHERE RN BETWEEN 21 AND 40
比较这两种写法,绝大大都的情形下,第一个查询的效率比第二个高得多.
这是由于CBO优化情势下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的履行效率.关于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40便可以被Oracle推入到内层查询中,这样Oracle查询的后果一旦超越了ROWNUM限制条件,就终止查询将后果返回了.
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即便推到最内层也没有意义,因为最内层查询不知道RN代表什么).因此,关于第二个查询语句,Oracle最内层返回给中间层的是全部满意条件的数据,而中间层返回给最外层的也是全部数据.数据的过滤在最外层完成,明显这个效率要比第一个查询低得多.
上面解析的查询不但仅是针对单表的简单查询,关于最内层查询是复杂的多表结合查询或最内层查询包含排序的情形一样有效.
这里就不对包含排序的查询举行阐明了,下一篇文章会通过例子来具体阐明.下面简单谈论一下多表结合的情形.关于最常见的等值表衔接查询,CBO普通大概会采取两种衔接方法NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,普通CBO不会考虑).在这里,由于利用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超越最大值时可以即刻终止并将后果返回给中间层,而HASH JOIN必须处理完好部后果集(MERGE JOIN也是).那么在大部份的情形下,关于分页查询挑选NESTED LOOP作为查询的衔接办法具有较高的效率(分页查询的时刻绝大部份的情形是查询前几页的数据,越靠背面的页数拜候概率越小).
因此,假如不介意在系统中利用HINT的话,可以将分页的查询语句改写为:
SELECT /*+ FIRST_ROWS */ * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)WHERE RN >= 21
以上是“<b>详解Oracle的几种分页查询语句-入门底子</b>[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论