oracle动态表数据分页查询

 
0 0

先做个物化试图。不行在分区。

2013年8月05日 16:00
 
0 0

同样提议改成分区表,保持逻辑不变的话,使用函数分区。 

PARTITION BY TO_CHAR(CreateTime, 'YYYYMM') 

效果和你现在手工分区一样。 

然后在检索条件的列上建个global index。这个数据量,不可能会有问题。 

再说使用分区表,程序里会更简单。 

话说你们都买了Oracle,还手工分区?!! 

2013年4月21日 17:11
 
0 0

改用分区表吧

2013年4月12日 11:58
 
0 0

1:从你的表字段来看,单张表50万数据应该10m左右,也就是说一年的数据应该在在120m左右,所以做120m的缓存还是可行的(当然你的数据可能不仅是来源一张表,或是查询跨度很大,数据量很大,缓存需要就很大,这样可能会需要一些额外的投入了) 
2:从你的查询条件来看,跨越了3张表,数据量应该在100万的样子,或许你用了一条sql去查,但是我觉得1分多钟,实在让人难以忍受。 
  a:如果查询条件是时间段,考虑在时间字段上建索引(我看你查询条件是精确到日的,可以考虑对,对日期进行函数处理后,做该字段的 函数索引) 
  b:是否存在非必要的order by, 
  c:如果是union ,要在每个union 加上时间过滤 
  d:可以根据业务将数据进行合并,例如只允许查询最近5个月的数据,可以将最近五个月数据insert select 到一个表空间中。下次查询判断时间是否在临时表内,如果在,就直接查询,如果不在,就将不在范围的数据insert select 到临时表中。 
3:看看表空间利用情况吧,如果该数据库实例数据很大,表空间利用率很高(分表的数据文件可以放到不同的磁盘)

2013年4月12日 11:12
 
0 0

50万条记录,一页10条,他不翻的吐血了。 
如果不需要总页数的话,不需要count可以提高性能。 
比如可以先搜索一天的数据作分页,当翻到最后的时候,自动搜索下一天的数据,继续翻页.[最好把一天的数据cache到缓存,可以减少与数据库的交互].

2013年4月11日 16:35
 
0 0

建议用缓存+多线程,第一次查询的时候多起几个线程分别查询这几张表,将查询的几个大记录合并发送至缓存服务器,翻页的时候直接从缓存中取对应的开始序号到结束序号,我公司的系统(用户表有30张)就是这么搞的。

2013年4月11日 16:13
 
0 0

1、分页查数据 每次记录最后的PKID  
2、下次查询时 加上 pkid > 上次最大的id 
这样可缩小数据范围 而且每次取第一页 


40w不是很多  你执行下explain看下有没有走索引

2013年4月11日 15:52
 
0 0

你可以尝试使用存储过程,在里面根据条件查询出几张表共有多少条符合条件, 
每次去查询的时候不一定要查询几张表,而是根据条件去查询一张单独的表,要是有涉及到两张表以上的情况,则说明分页的数据可能跨越2张表或者是三张表,总之尽量查询一张表,只有查询的数据介于两张表之间,才去关联,这里面的存储过程应该比较复杂。

2013年4月11日 15:47
 
0 0

避免用union all/union这样的语句join后再套一层select和rownum之类的做分页 
如果除了时间外没有其他查询条件了,你可以建一些统计表,比如2月份多少条,3月份多少条,这样,然后看你要查第几页,直接定位到那张表 
如果有其他查询条件就很麻烦了,要统计各种查询条件下每张表有几条记录这样,当然如果条件可能性太多了,可能这个方法就不太方便了

2013年4月11日 15:43
 
 

猜你喜欢

转载自jadeluo.iteye.com/blog/1920764