其中一个简单的需求是给定任意日期范围内按部门编号分组统计每个部门共有多少条记录 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
每天的数据都有千万条,而且这个表有100多个字段...... 表太大了,是不是可以考虑分为多个表存储数据,这样查询会快一些简单统计是这样的: select 部门编号,count(*) from t1 where to_char(日期,'yyyymmdd') between '20080115' and '20090212' group by 部门编号
如果数据量很大的话,要作统计,可以使用覆盖所有统计相关列的复合索引。 以你提出的简单报表为例:统计不定时间段内各部门的相关记录数量,相关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)。因为索引占用的空间远小于表占用的空间,只扫描索引可以减少统计时间。当然,如果统计相关列太多,那么用复合索引也不见得好。如果时间段不定,那么根据时间列创建局部索引没有益处。
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
表太大了,是不是可以考虑分为多个表存储数据,这样查询会快一些简单统计是这样的:
select 部门编号,count(*)
from t1
where to_char(日期,'yyyymmdd') between '20080115' and '20090212'
group by 部门编号
要建立局部分区索引,并在select时明确指定分区名。
以你提出的简单报表为例:统计不定时间段内各部门的相关记录数量,相关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)。因为索引占用的空间远小于表占用的空间,只扫描索引可以减少统计时间。当然,如果统计相关列太多,那么用复合索引也不见得好。如果时间段不定,那么根据时间列创建局部索引没有益处。
然后对常用的字段分别建索引(一般都会在时间字段上建上索引),而count时尽量不用count(*),而用count(索引字段)我们系统的数据一天最多也就上百万吧!