客户端大数据量显示问题

时间:2022-12-18 19:05:14
业务上经常需要无条件的查询明细数据并显示到客户端。 显示在界面上数据量在几十万条偶尔上百万条吧。
这种情况怎么处理呢?
分页是个办法,但是大家具体怎么实现呢。分页显示的数据会不会有问题?

请大家指点,最好说明具体的数据处理原理。

20 个解决方案

#1


传入2个参数,开始行数和结束行数,如要查询1-10行
select *
  from (select t.*, rownum rn from tb order by 时间 desc)
 where rn between 1 and 10

#2


select *
  from (select t.*, rownum rn from tab t )
 where rn between ( 2-1)* 10+1 and  2* 10
刚刚的回复有点问题
红色的为页数,兰色的为每页显示条数

#3


  PL\SQL 你用什么查询看的?
报表还是什么出的数据啊 ···

#4


虽然每次都是显示一页,但是两次搜索理论上没什么关系。因为数据的排序并不一样。
pl/sql develop里的效果还不错,但是不知道怎么实现的。 
第一次显示一页,点击继续不断的显示更多数据,点击停止就停止。然后再继续就继续。

在出现第一页以后更新的数据不会在你重新查询之前显示出来。给我感觉它显示的数据就是你第一次显示一页那个时间点的数据。 我猜测是通过临时表什么的来实现,但不确定。

#5


就是,用ROWNUM不准确

#6


是要在客户端显示,c#开发客户端

#7


引用 4 楼 zhongqingqiu 的回复:
虽然每次都是显示一页,但是两次搜索理论上没什么关系。因为数据的排序并不一样。
pl/sql develop里的效果还不错,但是不知道怎么实现的。 
第一次显示一页,点击继续不断的显示更多数据,点击停止就停止。然后再继续就继续。

在出现第一页以后更新的数据不会在你重新查询之前显示出来。给我感觉它显示的数据就是你第一次显示一页那个时间点的数据。 我猜测是通过临时表什么的来实现,但不确定。
……

要想分页,最好能按主键分页。

#8


按主键分页还是会遇到问题, 当有数据插入时, 顺序就会受到影响。除非这个主键是序列。

#9


select * from (select rownum as rn,tt.* from tablename  tt) b where b.rn>=(pageSize*(pageIndex-1)+1) and b.rn<=(pageSize*pageIndex)

#10


分页可以解决一定的问题,但是也需要一个SELECT COUNT(*)来计算总页数.
另外,2楼3楼的分页代码有问题.

这样分页应该才对.(每页显示10条数据,取第一页的情况)
select *
  from (select t.*, rownum rn from tb order by 时间 desc rownum <= 10)
 where rn >= 1

#11


期待更好的答案,最好能解析一下pl/sqldevelop的机制

#12


随便网上搜下分页很多啊
和pl/sqldevelop啥关系
定好每页的显示行数   然后统计要显示的总行数  动态计算出总共页数
参考9楼
当点击页面跳转时  传2值给数据库  即起,始行数
楼上有例子  如果要按某列排序   可能会需要包3层select

#13


看楼主4楼的
好像有即时读取数据的需求么  那个系统开销很大 多考虑 看是考虑推还是拉的方式
前台发出一次查询  吧结果集加载到页面  你想取数据库里的更新的数据 那就必须刷新页面
再次查询数据库读书数据集

#14


其实我要的效果不是即时读取,而是所有读取的数据状态都是第一次读取的那一刻。如果不是这样那么后面变化的数据会打乱前面的顺序。 我要的效果类似于一次全部读到客户端,然后按顺序一页一页显示,但是这样性能很差。

#15


用视图呗,临时表

#16


临时表倒是可以尝试,视图不知道怎么使用?

#17


学习一下!

#18


一次连接生产个txt到本地去
然后分页查询查询txt
 再次连接时 才更新txt

#19


感谢大家的回复, 从效率上看,临时表会好于txt。 

#20


谢谢大家,虽然不够满意但还是关闭吧!

#1


传入2个参数,开始行数和结束行数,如要查询1-10行
select *
  from (select t.*, rownum rn from tb order by 时间 desc)
 where rn between 1 and 10

#2


select *
  from (select t.*, rownum rn from tab t )
 where rn between ( 2-1)* 10+1 and  2* 10
刚刚的回复有点问题
红色的为页数,兰色的为每页显示条数

#3


  PL\SQL 你用什么查询看的?
报表还是什么出的数据啊 ···

#4


虽然每次都是显示一页,但是两次搜索理论上没什么关系。因为数据的排序并不一样。
pl/sql develop里的效果还不错,但是不知道怎么实现的。 
第一次显示一页,点击继续不断的显示更多数据,点击停止就停止。然后再继续就继续。

在出现第一页以后更新的数据不会在你重新查询之前显示出来。给我感觉它显示的数据就是你第一次显示一页那个时间点的数据。 我猜测是通过临时表什么的来实现,但不确定。

#5


就是,用ROWNUM不准确

#6


是要在客户端显示,c#开发客户端

#7


引用 4 楼 zhongqingqiu 的回复:
虽然每次都是显示一页,但是两次搜索理论上没什么关系。因为数据的排序并不一样。
pl/sql develop里的效果还不错,但是不知道怎么实现的。 
第一次显示一页,点击继续不断的显示更多数据,点击停止就停止。然后再继续就继续。

在出现第一页以后更新的数据不会在你重新查询之前显示出来。给我感觉它显示的数据就是你第一次显示一页那个时间点的数据。 我猜测是通过临时表什么的来实现,但不确定。
……

要想分页,最好能按主键分页。

#8


按主键分页还是会遇到问题, 当有数据插入时, 顺序就会受到影响。除非这个主键是序列。

#9


select * from (select rownum as rn,tt.* from tablename  tt) b where b.rn>=(pageSize*(pageIndex-1)+1) and b.rn<=(pageSize*pageIndex)

#10


分页可以解决一定的问题,但是也需要一个SELECT COUNT(*)来计算总页数.
另外,2楼3楼的分页代码有问题.

这样分页应该才对.(每页显示10条数据,取第一页的情况)
select *
  from (select t.*, rownum rn from tb order by 时间 desc rownum <= 10)
 where rn >= 1

#11


期待更好的答案,最好能解析一下pl/sqldevelop的机制

#12


随便网上搜下分页很多啊
和pl/sqldevelop啥关系
定好每页的显示行数   然后统计要显示的总行数  动态计算出总共页数
参考9楼
当点击页面跳转时  传2值给数据库  即起,始行数
楼上有例子  如果要按某列排序   可能会需要包3层select

#13


看楼主4楼的
好像有即时读取数据的需求么  那个系统开销很大 多考虑 看是考虑推还是拉的方式
前台发出一次查询  吧结果集加载到页面  你想取数据库里的更新的数据 那就必须刷新页面
再次查询数据库读书数据集

#14


其实我要的效果不是即时读取,而是所有读取的数据状态都是第一次读取的那一刻。如果不是这样那么后面变化的数据会打乱前面的顺序。 我要的效果类似于一次全部读到客户端,然后按顺序一页一页显示,但是这样性能很差。

#15


用视图呗,临时表

#16


临时表倒是可以尝试,视图不知道怎么使用?

#17


学习一下!

#18


一次连接生产个txt到本地去
然后分页查询查询txt
 再次连接时 才更新txt

#19


感谢大家的回复, 从效率上看,临时表会好于txt。 

#20


谢谢大家,虽然不够满意但还是关闭吧!