db端与应用端的分页

时间:2016-06-04 15:30:24

标签: oracle groovy oracle11g

我有一个简单的应用程序,它在dp上执行查询,因为有很多行返回〜300-400k并且需要重新检索它并导致out of memory error我必须使用分页。在groovy.sql.SQL中我们有rows(String sql,int offset, int maxRows)无论如何它的工作非常慢,例如步骤20k行rows方法的执行时间从大约10秒开始并随着每次下一次调用而增加,第二种方式分页在机制中使用了一些buile,例如

    select *
 from (
select /*+ first_rows(25) */
  your_columns,
  row_number() 
  over (order by something unique)rn
 from your_tables )
where rn between :n and :m 
order by rn; 

对于我的查询,第二种方法用步骤20k花费了5秒。我的问题是,哪种方法对数据库更好?执行缓慢的原因是什么Sql.rows

1 个答案:

答案 0 :(得分:0)

自Oracle 11g以来,不再需要first_rows提示。对于Oracle来说,最好的方法是生产者 - 消费者设计模式。数据库“即时”生成数据。

如此简单的纯选择将是合适的:

select your_columns,
row_number() over (order by something unique)rn
from your_tables;

但遗憾的是,Java框架通常无法保持数据库连接打开。它们只是一次获取所有数据,然后将整个结果集移交给调用者。

您没有太多选择。之一:

  • 你将需要所有的RAM来获取所有内容。另外,您还可以在JPA级别上使用延迟加载。
  • 或者你必须找到一种方法来保持数据库连接在Web应用程序中打开。这实际上是不可能的。此类方法也不适用于拥有超过数千个并发用户的应用程序。
PS:在通常的情况下,实现分页的常用方法不会返回一致的数据,因为它们可以在执行之间进行更改。所以它不应该用于显示目的的任何其他东西。