跳到主要内容
版本:1.0.14

分页规范

【强制】在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。

【推荐】分页优化,建议通过游标返回分页结果,避免越后面的页返回越慢的情况。

例如:

declare cur1 cursor for select name from sbtest1 where id between 100 and 1000000 order by id;

获取数据:

fetch 100 from cur1;

主键表的分页批处理(仅供参考)

常规的分页更新 SQL 一般使用主键或者唯一索引进行排序,再配合limit … offset语法按固定行数拆分页面,然后把页面包装进独立的事务中,从而实现灵活的分页更新。但是,劣势也很明显:由于需要对主键或者唯一索引进行排序,越靠后的页面参与排序的行数就会越多,尤其当批量处理涉及的数据体量较大时,可能会占用过多计算资源。

首先将数据按照主键排序,然后调用窗口函数 row_number() 为每一行数据生成行号并按照分页大小取余,获得每个分组的下边界,最终计算出每页的最大值。

获取每页下边界:

  1. select

  2. x.value,

  3. x.id,

  4. row_number()

  5. over(order by x.value, x.id) + 1 page_number

  6. from (

  7. select

  8. t.id,

  9. t.value,

  10. case row_number()

  11. over(order by t.value, t.id) % 500

  12. when 0 then 1

  13. else 0

  14. end page_boundary

  15. from t

  16. order by t.value, t.id

  17. ) x

  18. where x.page_boundary = 1

基于上述分页结果,后续处理只需要使用下边界的主键值查询每个分片的数据即可。如果修改数据时,也可以借助上面计算好的分片信息,实现高效数据更新。

获取第六页数据:

  1. select*

  2. from t

  3. where (value, id) > (2, 533) -- 第五页下边界的主键值

  4. order by value, id

  5. limit 500

优点:规避了频繁的数据排序操作造成的性能损耗,可显著改善了批量处理的效率。