求大数据量表格的处理方式

herowach 2009-02-10 12:02:04
数据库里有一张表,表里数据量比较大,例如数量级在百万,如果有一个页面需要显示这些数据,应该怎么处理?一般是SQL层面的分页?具体如何实现?
...全文
329 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可以试试下面的两个 SQL 语句:

SELECT * FROM (
SELECT t.*, row_number() OVER(ORDER BY id) AS rn FROM t_mt_stat t
) x
WHERE x.rn BETWEEN 11 AND 20


SELECT * FROM (
SELECT t.*, rownum rn FROM (
SELECT * FROM t_mt_stat ORDER BY id
) t
WHERE rownum <= 20
) x
WHERE x.rn >= 11
herowach 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 liuyar 的回复:]
可以不用翻页.
几百万的数据量,人这个动物是不可能一眼看完的.
显示数据的时候,应该是一个带竖滚动条的表格,
默认只查询显示当前可见范围内的数据,
用户拉动滚动条时,你再用ajax去查和显示.
[/Quote]

肯定是看不完的,除非这人有毛病,但需求就是这样,必须有这个功能,至于这个功能用不用和用不用的全是用户的事...
herowach 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mirzlm 的回复:]
相信翻页什么你都没问题,只是在每次翻页查询大量数据而头痛吧,你可以第一次把数据都查出来,保存到集合里,翻页的时候,把这个集合传过去 这样就不用再去数据库查数据了,不知道这样可以不
[/Quote]

几百万的数据全放到集合里,估计内存有硬盘那么大的时候也许可以....
liuyar 2009-02-12
  • 打赏
  • 举报
回复
可以不用翻页.
几百万的数据量,人这个动物是不可能一眼看完的.
显示数据的时候,应该是一个带竖滚动条的表格,
默认只查询显示当前可见范围内的数据,
用户拉动滚动条时,你再用ajax去查和显示.
mirzlm 2009-02-12
  • 打赏
  • 举报
回复
相信翻页什么你都没问题,只是在每次翻页查询大量数据而头痛吧,你可以第一次把数据都查出来,保存到集合里,翻页的时候,把这个集合传过去 这样就不用再去数据库查数据了,不知道这样可以不
herowach 2009-02-12
  • 打赏
  • 举报
回复
这样在数据库层面分页我估计比普通查询慢很多,没办法的情况下估计只有数据分页取一大块然后再页面分成小页,可能这样会好一点,如果频繁的跑那个SQL,估计用户要等疯掉,除了这种分页方式,还有其他的解决办法吗?
「已注销」 2009-02-12
  • 打赏
  • 举报
回复
这种大数据量的显示,还是找现成的有动态列表显示功能的JS库吧
billwindows 2009-02-12
  • 打赏
  • 举报
回复
最佳答案: 采用 Oracle 的老化和分区策略,将百万当量的数据缩减成10万以内,这样查询就会很快了。
如果没猜错你应该在做报表,建议在加上个分页查询 ,查询的每个页面展现的数据控制在1000条以内。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 herowach 的回复:]
具体....
假设数据库是ORACLE10G,一个查询页面,可以带条件,但默认是无条件的,即查出全部(可能几百万数据,用户肯定看不完,但就是要这样),如果用翻页,那么是否每点一次下一页或上一页都要去数据库里查一把?

再具体点,表名为TableA,有字段field1,field2,SQL要怎么实现
[/Quote]

是的,翻页的话是去重新查询数据库,上百万数据量的表只能采用这种方式。

有兴趣的话可以去看看《POJOs in Action》一书的第 11 章,对分页有详尽的介绍。

另外,如果数据的更新并不是非常频繁,而且查询条件也不是很多的话,查询结果集可以使用一个 LRUMap 缓存几页的数据,
这样可以在用户来回翻页的时候更为快速地进行响应,而无需与数据库进行交互。当然了 LRUMap 的大小不能太大,否则会
大量地占用服务器的内存。Apache Commons Collections 中有现成的 LRUMap 可以直接拿来用的。
jackingod 2009-02-12
  • 打赏
  • 举报
回复
数据库类似这样。
[Quote=引用 7 楼 zliu789 的回复:]
如果用翻页,那么是否每点一次下一页或上一页都要去数据库里查一把?
是滴!!!
ORACLE中的
查出第10-20条记录
select * from ( select row_.*, rownum rownum_ from (你的查询条件 ) row_ where rownum <= 20) where rownum_ > 10
[/Quote]
逻辑可以定义一个Pager类,有如下属性。

private int itemTotalCount;
private int perPage;
private int currentPageIndex = 0;
private int nextPage;
private int previousPage;
private boolean existNextPage;
private boolean existPreviousPage;
private ArrayList pageList = null;

然后把你要显示的数据以及主键做一个bean,里面最好设置一个list的属性,
如果是用struts的话,直接用遍历控件对应其字段名就ok了。
herowach 2009-02-11
  • 打赏
  • 举报
回复
具体....
假设数据库是ORACLE10G,一个查询页面,可以带条件,但默认是无条件的,即查出全部(可能几百万数据,用户肯定看不完,但就是要这样),如果用翻页,那么是否每点一次下一页或上一页都要去数据库里查一把?

再具体点,表名为TableA,有字段field1,field2,SQL要怎么实现
realcbb 2009-02-11
  • 打赏
  • 举报
回复
各个数据库有各自的部分查询方法,都是从sql语句着手
Jacky_Zhu_1983 2009-02-11
  • 打赏
  • 举报
回复
select 不要用*号...要什么字段查什么字段 那样会快很多..>_<
Jacky_Zhu_1983 2009-02-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zliu789 的回复:]
如果用翻页,那么是否每点一次下一页或上一页都要去数据库里查一把?
是滴!!!
ORACLE中的
查出第10-20条记录
select * from ( select row_.*, rownum rownum_ from (你的查询条件 ) row_ where rownum <= 20) where rownum_ > 10
[/Quote]

对的。.. 除非你觉的一下子查出那么多条记录速度不慢
然后把它放在一个PagedListHolder 用PagedListHolder来分页
wsx324111 2009-02-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zliu789 的回复:]
如果用翻页,那么是否每点一次下一页或上一页都要去数据库里查一把?
是滴!!!
ORACLE中的
查出第10-20条记录
select * from ( select row_.*, rownum rownum_ from (你的查询条件 ) row_ where rownum <= 20) where rownum_ > 10
[/Quote]
对的
老黄瓜_ 2009-02-11
  • 打赏
  • 举报
回复
如果用翻页,那么是否每点一次下一页或上一页都要去数据库里查一把?
是滴!!!
ORACLE中的
查出第10-20条记录
select * from ( select row_.*, rownum rownum_ from (你的查询条件 ) row_ where rownum <= 20) where rownum_ > 10
無名VF 2009-02-10
  • 打赏
  • 举报
回复
使用基于查询分页
laorer 2009-02-10
  • 打赏
  • 举报
回复
还是在网上找下吧,现成的好多
jackdalsen 2009-02-10
  • 打赏
  • 举报
回复
请楼主说明一下 数据库
补充楼上一句,
mysql 用limit ,PostgreSQL 也用limit
chris9999 2009-02-10
  • 打赏
  • 举报
回复
用分页实现啊,具体的分页代码在网上有很多,主要是使用sql语句来进行,sqlserver使用top,oracle使用rownum
加载更多回复(1)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧