我有一个简单的应用程序,它在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
?
答案 0 :(得分:0)
自Oracle 11g以来,不再需要first_rows提示。对于Oracle来说,最好的方法是生产者 - 消费者设计模式。数据库“即时”生成数据。
如此简单的纯选择将是合适的:
select your_columns,
row_number() over (order by something unique)rn
from your_tables;
但遗憾的是,Java框架通常无法保持数据库连接打开。它们只是一次获取所有数据,然后将整个结果集移交给调用者。
您没有太多选择。之一: