Oracle的极大数据量的分页查询问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle的极大数据量的分页查询问题相关的知识,希望对你有一定的参考价值。

Oracle的分页查询在表中数据量极大时(上亿条、有索引),在第一次查询会出结果(3、5秒),而相同条件在第一次查询出结果立即再次进行查询时,会出现长时间等待也没有结果的情况(好像锁住了)。
请问如何解决,谢谢!

语句示例如下(数据行数cnt大约从几千、几万、十几万不等,都是同样的问题):
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (select count(*) over() CNT,
ta.ca,ta.cb,ta.cc,... from ta where fname like 'test%' ORDER BY ta.ca
) A WHERE ROWNUM <= 15 ) WHERE RN >= 1

参考技术A 1.把星都换成需要的字段名试一下。
2.索引顺序排列正确(这个你查一下,索引不是建 了就可以。查询时有顺序的,四年前的项目,改变顺序后,时间由35s 提升到6-8s,具体的记不清了,只记得有这么回事。)

回去以后试一下你的SQL,只有数据多才出现这个问题吗?字段长度大约都多少?本回答被提问者采纳
参考技术B 相同条件在第一次查询出结果立即再次进行查询时
你第二次查询你查出来的结果集是去全表遍历查的 结果集是没有就是一推数据 上面没有索引没有任何东西,建议能先处理逻辑关系减少数据量 orderby 这些能不用就不用 like也会让index失效 用between可以代替
参考技术C 没法优化。查询条件中用了like子句,索引会不起作用,造成遍历整张表。
如果没有like及order by子句的话,会快很多
参考技术D 你这样做分页是全部查询后分页吗?为何不做成分页后查询?因为你只写了语句示例具体情况不是很了解。我们曾经做过一次查询后分页会使得页面刷新很慢,但调整后就相对快很多了。 第5个回答  2012-01-31 第一次能快速的出来结果,就说明了语句本身没有太大的问题。现在不明白你的第二次查询是一直都不出来结果,还是说能出来结果,但是结果出来的非常慢。

Mysql与Oracle的分页查询比较

MySql分页查询语句

下列查询语句中m代表行数的索引默认从0开始类似于pl/sql中的游标0表示从第一条开始n表示向后查询多少条数据。

例如:

select * from emp limit 2,3表示查询第三条数据到第六条数据(包前不包后)也就是第三条数据包括第三条数据不包括第六条数据 也就是 3, 4,5条记录

select * from buss_stu_info limit m,n;


Oracle数据库分页查询

一层分页查询:

及时数据量足够大几乎也不会受到影响查询速率足够快,一般在写这类sql语句是个人将sql语句分为两层,内层,外层,在内层中小于最大的,在外层中大于最小的,(最大最小你来设定)

select * from (select rownum as rn,empno,ename from emp e where rownum<10) ta where ta.rn>5;

两层分页查询:

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最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多



本文出自 “随笔” 博客,请务必保留此出处http://lishouxiang.blog.51cto.com/8123559/1854621

以上是关于Oracle的极大数据量的分页查询问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle 的分页查询与mysql 的分页查询

oracle的分页查询

oracle分页查询语句怎么写每页查询10条

Mysql与Oracle的分页查询比较

在oracle数据库中的分页SQL语句怎么写?

Oracle, SQL Server, My SQL如何实现数据分页查询语句