我有10张表每张表每天的数据量都在千万条以上,第一次接触这样大的数据量没有任何经验,请问都要做哪方面的优化才能提高查询效率?
每张表的日期、部门编号、人员编号这三个字段使用最频繁(都建了索引)
如果使用分区管理的话怎样分区最好?我每个月和季度都要出一次10张表数据的总量统计count()

解决方案 »

  1.   

    其中一个简单的需求是给定任意日期范围内按部门编号分组统计每个部门共有多少条记录
    select 部门编号,count(*) from t1 where 日期 between '20080115' and '20090212' group by 部门编号大概的表结构是部门编号 人员编号 日期           后面还有100多其他字段
    1        a       2008-1-15
    1        b       2008-1-15
    1        c       2008-1-15
    2        d       2008-1-11
    2        d       2009-1-11
    3        g       2009-1-11
    2        d       2009-1-11
    1        a       2009-1-11
      

  2.   

    每天的数据都有千万条,而且这个表有100多个字段......
    表太大了,是不是可以考虑分为多个表存储数据,这样查询会快一些简单统计是这样的:
    select 部门编号,count(*) 
    from t1 
    where to_char(日期,'yyyymmdd') between '20080115' and '20090212' 
    group by 部门编号 
      

  3.   

    我每个月和季度都要出一次10张表数据的总量统计count()如果不是明细的话,可以定时汇总每个月的数据,放到一个汇总表里备查.
      

  4.   

    大表分区肯定能改善查询性能。
    要建立局部分区索引,并在select时明确指定分区名。
      

  5.   

    如果数据量很大的话,要作统计,可以使用覆盖所有统计相关列的复合索引。
    以你提出的简单报表为例:统计不定时间段内各部门的相关记录数量,相关SQL:select dept,count(1) from table where tim between :1 and :2 group by dept这时可以在 tim,dept 创建复合索引,这时,在执行sql时,将会只扫描索引而避免扫描表(即避免SQL PLAN中的 TABLE ACCESSED BY INDEX ROWID)。因为索引占用的空间远小于表占用的空间,只扫描索引可以减少统计时间。当然,如果统计相关列太多,那么用复合索引也不见得好。如果时间段不定,那么根据时间列创建局部索引没有益处。
      

  6.   

    分区并不是说一定就是提高性能的利器,但对于你管理数据还是比较方便的.如果是经常需要按日期,那么可以考虑range partition,或者按季度来分区,  在统计时直接扫描分区. 当然我只是举一个例子,具体你还得根据你的应用的需求来定.
      

  7.   

    目前我们采用的方法是,将不同月份的数据放到不同的表即(一年有12个月,就有12张表),然后对每一张表又进行了分区,以时间的月份和天作范围分区即(to_char(,‘mmdd’))。
    然后对常用的字段分别建索引(一般都会在时间字段上建上索引),而count时尽量不用count(*),而用count(索引字段)我们系统的数据一天最多也就上百万吧!