Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 处理大型表格-如何逐页选择记录?_Sql_Oracle_Pagination - Fatal编程技术网

Sql 处理大型表格-如何逐页选择记录?

Sql 处理大型表格-如何逐页选择记录?,sql,oracle,pagination,Sql,Oracle,Pagination,我需要对表中的所有记录进行处理。这个表可能非常大,所以我宁愿一页一页地处理记录。我需要记住已经处理过的记录,以便在第二次选择结果中不包含这些记录 像这样: 第一次, [从MyTable中选择100条记录] 第二轮, [从MyTable中再选择100条记录] 等等 我希望你明白了。我的问题是如何编写这样的select语句 顺便说一句,我正在使用oracle,但如果我也能在任何其他数据库上运行,那就太好了。 我也不想使用存储过程 多谢各位 您很可能希望利用Oracle的stopkey优化功能,因此当

我需要对表中的所有记录进行处理。这个表可能非常大,所以我宁愿一页一页地处理记录。我需要记住已经处理过的记录,以便在第二次选择结果中不包含这些记录

像这样:

第一次, [从MyTable中选择100条记录]

第二轮, [从MyTable中再选择100条记录]

等等

我希望你明白了。我的问题是如何编写这样的select语句

顺便说一句,我正在使用oracle,但如果我也能在任何其他数据库上运行,那就太好了。 我也不想使用存储过程


多谢各位

您很可能希望利用Oracle的stopkey优化功能,因此当您不需要时,不会得到一个完整的tablescan。有几种方法可以做到这一点。第一种方法的编写时间稍长,但让Oracle自动计算出所涉及的行数:

select *
from
(
  select rownum rn, v1.*
  from (
    select *
    from table t
    where filter_columns = 'where clause'
    order by columns_to_order_by
  ) v1
  where rownum <= 200
)
where rn >= 101;
我更喜欢rownum方法,因此您不必一直更改提示中的值(这需要表示结束值,而不是实际返回到页面的行数才能准确)。您可以通过这种方式将起始值和结束值设置为绑定变量,从而避免了硬解析


要了解更多详细信息,您可以查看

您提出的任何将表分解为更小的块的解决方案,结果将比一次性处理所有内容花费更多的时间。除非表已分区,并且一次只能处理一个分区

如果一次完整的表格扫描需要1分钟,那么您需要10分钟才能将表格分成10个部分。如果表行是按您可以使用的索引列的值进行物理排序的,那么这将由于集群因素而有所改变。但无论如何,这比一次性处理要花更长的时间


当然,这完全取决于处理表中的一行所需的时间。您可以选择通过处理数据块来减少服务器上的负载,但从性能的角度来看,您无法击败全表扫描。

您确定需要运行多个选择吗?为什么不打开一个游标,获取100条记录,处理它们,然后获取下一批记录呢。这样,您就不必跟踪您所处理的内容,而且查询将在开始时保持一致。OMG小马可能重复-为什么您不认为第一个查询示例可以工作?它对我很管用。。
  select /*+ FIRST_ROWS(200) */ *
  from (
    select rownum rn, t.*
    from table t
    where filter_columns = 'where clause'
    order by columns_to_order_by
  ) v1
  where rn between 101 and 200;