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