SQL 没有偏移量和索引列的分页
SQL pagination without offset and index column
我的数据库有数百万条记录,正在门户上用于向用户显示,分页是使用偏移完成的,数据也按某些列排序,是否有任何替代解决方案来偏移和使用任何索引列,例如自动递增字段或唯一字段,如果我必须对某些不同的列进行排序,它就不起作用,即使删除该行也不会 return 预期结果。
我在我的 java 应用程序中 运行 sql 查询,我尝试了一种方法,只对我的查询添加限制。所以它的工作原理就像偏移量将始终为零,并且根据分页逻辑限制将是(限制+偏移量)的数量
例如:用户请求每页 10 条记录并导航到 51 页
替代逻辑:限制 10 偏移量 500 -> 限制 = 510
查询看起来像
select * from history limit 510 order by log_date;
所以在 ResultSet
的 absolute
方法的帮助下,我根据指定的偏移量导航到行号,并在该行之后获取结果
-- No of rows returned 510
rs.absolute(500);
while(rs.next()){
//store data in the object
}
但即使通过这种方式,我也会告诉数据库 return 510 条记录,如果用户导航到最后一页,它将获取所有行,这将是非常低效的。
因此,您在每次新页面请求时都会访问数据库 - 这样做是为了避免混淆:
在您提供的示例中,您正在将所有结果集提取到 java 应用程序中,然后进行过滤。让数据库进行过滤并为您提供结果。将您想要的 PAGE_NUMBER 发送到数据库查询本身。
select * from history limit 510 order by log_date
OFFSET PAGE_NUMBER*MAX_ROWS_TO_SELECT ROWS FETCH NEXT MAX_ROWS_TO_SELCET ROWS ONLY;
如上例所述,您只需获取 10 条记录。这是您以优化的数据库结果集大小获取所需页面内容的有效方式。
我的解决方案只适用于phoenix 4.7 (hdp 2.5),我找到的方法是用主键升序排列数据,如果有组合键,数据按第一列排序键然后偏移和限制正常工作。
我的数据库有数百万条记录,正在门户上用于向用户显示,分页是使用偏移完成的,数据也按某些列排序,是否有任何替代解决方案来偏移和使用任何索引列,例如自动递增字段或唯一字段,如果我必须对某些不同的列进行排序,它就不起作用,即使删除该行也不会 return 预期结果。
我在我的 java 应用程序中 运行 sql 查询,我尝试了一种方法,只对我的查询添加限制。所以它的工作原理就像偏移量将始终为零,并且根据分页逻辑限制将是(限制+偏移量)的数量
例如:用户请求每页 10 条记录并导航到 51 页
替代逻辑:限制 10 偏移量 500 -> 限制 = 510
查询看起来像
select * from history limit 510 order by log_date;
所以在 ResultSet
的 absolute
方法的帮助下,我根据指定的偏移量导航到行号,并在该行之后获取结果
-- No of rows returned 510
rs.absolute(500);
while(rs.next()){
//store data in the object
}
但即使通过这种方式,我也会告诉数据库 return 510 条记录,如果用户导航到最后一页,它将获取所有行,这将是非常低效的。
因此,您在每次新页面请求时都会访问数据库 - 这样做是为了避免混淆:
在您提供的示例中,您正在将所有结果集提取到 java 应用程序中,然后进行过滤。让数据库进行过滤并为您提供结果。将您想要的 PAGE_NUMBER 发送到数据库查询本身。
select * from history limit 510 order by log_date
OFFSET PAGE_NUMBER*MAX_ROWS_TO_SELECT ROWS FETCH NEXT MAX_ROWS_TO_SELCET ROWS ONLY;
如上例所述,您只需获取 10 条记录。这是您以优化的数据库结果集大小获取所需页面内容的有效方式。
我的解决方案只适用于phoenix 4.7 (hdp 2.5),我找到的方法是用主键升序排列数据,如果有组合键,数据按第一列排序键然后偏移和限制正常工作。