-
同样提议改成分区表,保持逻辑不变的话,使用函数分区。
PARTITION BY TO_CHAR(CreateTime, 'YYYYMM')
效果和你现在手工分区一样。
然后在检索条件的列上建个global index。这个数据量,不可能会有问题。
再说使用分区表,程序里会更简单。
话说你们都买了Oracle,还手工分区?!!2013年4月21日 17:11
-
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
-
50万条记录,一页10条,他不翻的吐血了。
如果不需要总页数的话,不需要count可以提高性能。
比如可以先搜索一天的数据作分页,当翻到最后的时候,自动搜索下一天的数据,继续翻页.[最好把一天的数据cache到缓存,可以减少与数据库的交互].2013年4月11日 16:35
-
建议用缓存+多线程,第一次查询的时候多起几个线程分别查询这几张表,将查询的几个大记录合并发送至缓存服务器,翻页的时候直接从缓存中取对应的开始序号到结束序号,我公司的系统(用户表有30张)就是这么搞的。
2013年4月11日 16:13
-
1、分页查数据 每次记录最后的PKID
2、下次查询时 加上 pkid > 上次最大的id
这样可缩小数据范围 而且每次取第一页
40w不是很多 你执行下explain看下有没有走索引2013年4月11日 15:52
-
你可以尝试使用存储过程,在里面根据条件查询出几张表共有多少条符合条件,
每次去查询的时候不一定要查询几张表,而是根据条件去查询一张单独的表,要是有涉及到两张表以上的情况,则说明分页的数据可能跨越2张表或者是三张表,总之尽量查询一张表,只有查询的数据介于两张表之间,才去关联,这里面的存储过程应该比较复杂。2013年4月11日 15:47
-
避免用union all/union这样的语句join后再套一层select和rownum之类的做分页
如果除了时间外没有其他查询条件了,你可以建一些统计表,比如2月份多少条,3月份多少条,这样,然后看你要查第几页,直接定位到那张表
如果有其他查询条件就很麻烦了,要统计各种查询条件下每张表有几条记录这样,当然如果条件可能性太多了,可能这个方法就不太方便了2013年4月11日 15:43