0 0

oracle动态表数据分页查询10

假设我的数据表的结构是
Create table OrderyyyyMM
(
PKID nvarchar(36),
ProductId nvarchar(20),
Price number,
CreateTime char(19)
)

一个月一张表,每个表一个月大概有50万条记录。
现在我要分页查询(每页显示十条记录),查找2013年2月25日到2013年4月10日的数据。

请问如何编写这条语句性能才是最高?数据量实在太大了,现在建了索引查找也特别慢。
 
2013年4月11日 15:30

11个答案 按时间排序 按投票排序

0 0
0 0

使用表分区,查询的时候,根据时间段来选择对应的分区表查询,并合理的建立相应的索引。

2013年8月07日 14:11
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

相关推荐

Global site tag (gtag.js) - Google Analytics