java中分页查询oracle数据速度慢,怎么解决好

amonxu 发布于 2013/03/25 11:11
阅读 3K+
收藏 1

现在有一个系统,数据是上千万的,然后只需要查询(不需要增改删),分为分表和分区两种方式。

目前分页查询的速度实在是太慢,每次都要几分钟甚至更久。

老大说要用缓存,缓存读取几页数据,然后翻页的时候能相对快一点。

大家有什么好的办法,求解啊!

还有索引,索引用哪些值呢,查询条件中的字段吗?

SQL如下(union了3个表):

select msgid, networkType,spNumber,errorCode,SrcNumber,DestNumber,QueryType,beginTime,serviceCode,latitude,longitude,lacId,cellId,sendTime,srcGlc,destGlc,vmsc  from glc_location_msg_130313 m where m.begintime >= to_date('2013-03-13 00:00:00','yyyy-mm-dd hh24:mi:ss') and m.begintime <= to_date('2013-03-20 23:59:59','yyyy-mm-dd hh24:mi:ss') and (srcNumber = '13800000002') and (1=1) and 1=1 and 1=1 and 1=1 and 1=1  union all select msgid, networkType,spNumber,errorCode,SrcNumber,DestNumber,QueryType,beginTime,serviceCode,latitude,longitude,lacId,cellId,sendTime,srcGlc,destGlc,vmsc  from glc_location_msg_130319 m where m.begintime >= to_date('2013-03-13 00:00:00','yyyy-mm-dd hh24:mi:ss') and m.begintime <= to_date('2013-03-20 23:59:59','yyyy-mm-dd hh24:mi:ss') and (srcNumber = '13800000002') and (1=1) and 1=1 and 1=1 and 1=1 and 1=1  union all select msgid, networkType,spNumber,errorCode,SrcNumber,DestNumber,QueryType,beginTime,serviceCode,latitude,longitude,lacId,cellId,sendTime,srcGlc,destGlc,vmsc  from glc_location_msg_130320 m where m.begintime >= to_date('2013-03-13 00:00:00','yyyy-mm-dd hh24:mi:ss') and m.begintime <= to_date('2013-03-20 23:59:59','yyyy-mm-dd hh24:mi:ss') and (srcNumber = '13800000002') and (1=1) and 1=1 and 1=1 and 1=1 and 1=1


加载中
0
xdev
xdev
你的sql为避免 and造成的sql错误使用 1=1 太难看啦, ;我觉得没必要分表呀。你不是分区啦吗,多分几个区,查询的时候还是一张表的,性能也会翻几翻的。如果觉得还是有性能问题可以考虑使用基于数据库的全文检索,这样就算是上亿级的数据,性能也会很好;这样的问题就是可能实时性不会很好,因为要创建索引,但是你说不要 经常的改查删,所以不会成为你的问题;你们的老大提供的方法确实也是比较好的一种实现,你的srcNumber和begintime要加索引,索引生效和字段以及顺序有关的,查看数据库手册
amonxu
amonxu
客户需要分为每天一张表。现在已经在一些关键字段上做索引了,查询的速度快了很多,比如A表B表分别有几十万数据,可以在几秒内查出,但是他们两个表一起查的话就慢了很多,还要几分钟。目前用的是union all
0
panmingguang
panmingguang

type, stat 类型 加索引是有效果的,  用like的地方怎么也没办法, 先 缩短 筛选范围 

amonxu
amonxu
什么意思?没有用like的
0
panmingguang
panmingguang
缓存没用, 条件不固定的, 没法缓存
0
LucEsape
LucEsape

缓存就不说了。索引用来方便查询的,可以增加查询速度。建索引没啥特别的,只要记住 对最常用字段建索引就OK了。比如有:a,b,c,d,e,f; 这么多字段,而 d,f,a是最常用的查询字段,那你就对它们建索引。

amonxu
amonxu
回复 @Minuzy : sql太长了贴不了,目前可以看为select * from table。 用了索引速度控制在5s了,不过如果是两张表一起查询的话还是很慢,两个表的结构是完全一样的,用的是union all.
LucEsape
LucEsape
回复 @gosu : SQL 贴上来
amonxu
amonxu
回复 @Minuzy : 页面上查询的条件的字段都建立索引了。它们算不算常用的呢?
LucEsape
LucEsape
回复 @gosu : 说明索引没有建在关键字段上。
amonxu
amonxu
建了索引,好像查询的速度没有改进。
0
大喵哥
大喵哥
你一页加载多少? 既然涉及到分页了  这个一页应该数据量应该不大了吧 常用查询字段上肯定要设置索引 难道用了很多like  我怀疑你们sql有问题 才导致这么慢的查询
amonxu
amonxu
sql没有问题的,只是一个简单的查询,分表方式的话就是表的联合查询
0
iimax
iimax
贴表结构 贴SQL where条件 执行计划
amonxu
amonxu
sql补充到问题上了,烦请看看,谢谢!
amonxu
amonxu
太长了,贴不了,就是union all两个表查几个字段,条件目前都是1=1. 加了索引速度查询单个表快了,只是两个表的时候就还和原来差不多。
0
jack_l
jack_l
数据上千万,分页查询还慢,要么表结构有问题要么sql有问题
amonxu
amonxu
sql没有问题的,只是一个简单的查询,分表方式的话就是表的联合查询
0
panmingguang
panmingguang

union all  

先条件 再union all

类似 

select * from aa where aa.name='panmg'

union all

select * from bb where bb.name='panmg'


amonxu
amonxu
目前就是这种方式的。加了索引速度查询单个表速度快,但是查询多个表速度还是慢。
0
panmingguang
panmingguang
否则索引失效了
0
panmingguang
panmingguang
不贴sql 难以看出问题
返回顶部
顶部