小弟,对数据库不熟,现在有一张表,要根据某一字段做统计功能,表的数据量非常大,同时这个表每天都有数据插入,所以用索引不是很现实,希望各位大侠给些建议,帮忙解决一下.
[quote]create table test (
empno number(3,0) primary key,
ename varchar2(15) not null,
sal number(5,0) not null
)
partition by range(sal)
(
partition testa values less than (1000) tablespace USERS,
partition testb values less than (2000) tablespace USERS,
partition testc values less than (3000) tablespace USERS,
partition testd values less than (10000) tablespace USERS
) [/quote]
这个分区表就是按照sal字段的取值范围来分区存放记录的.
而哈希分区是在列值上使用散列算法,以确定将行放入哪个分区中。
列表分区就是你列的取值比较固定,比如性别,月份,地区这样的可以枚举的来分区存放。
复合分区就比较复杂了。
这样存放的好处就是,比如你要统计性别为男的记录,那都在一个分区中统计了,提高效率。
楼主如果数据量比较大,并且数据有时效性的话,楼主可以考虑按时间将这一个表分成多个表,例如按月,分成多个月的数据。
因为楼主是针对某个字段进行统计,也可以考虑把该字段和相关的个别字段拿出来放到一张临时表中,然后对临时表进行统计。
建成分区表或者创建视图
分区表:按照分而治之的思想,将特大表的数据放在不同的分区上提高效率。
范围分区:按照某列的值的范围存放在不同的分区上
create table test (
empno number(3,0) primary key,
ename varchar2(15) not null,
sal number(5,0) not null
)
partition by range(sal)
(
partition testa values less than (1000) tablespace USERS,
partition testb values less than (2000) tablespace USERS,
partition testc values less than (3000) tablespace USERS,
partition testd values less than (10000) tablespace USERS
)
哈希分区:在列值上使用散列算法,以确定将行放入哪个分区中。
create table test
(
empno number(3,0) primary key,
ename varchar(20),
sal number(5,0)
)
partition by hash(sal)
(
partition testa tablespace USERS,
partition testb tablespace USERS,
partition testc tablespace USERS
);
列表分区:该分区的特点是某列的值只有几个。
Create TABLE PROBLEM_TICKETS
(
PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY,
DESCRIPTION VARCHAR2(2000),
CUSTOMER_ID NUMBER(7) NOT NULL,
DATE_ENTERED DATE NOT NULL,
STATUS VARCHAR2(20)
)
PARTITION BY LIST (STATUS)
(
PARTITION PROB_ACTIVE VALUES ('ACTIVE') TABLESPACE PROB_TS01,
PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
)
复合范围列表分区:先基于范围分区,后基于列表分区。分区中的分区被称为子分区。
Create TABLE SALES
(
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE,
SALES_COST NUMBER(10),
STATUS VARCHAR2(20)
)
PARTITION BY RANGE(SALES_DATE)
SUBPARTITION BY LIST (STATUS)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2003-01-01','YYYY-MM-DD')) TABLESPACE P1_TS
(
SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE SUBP1_TS1,
SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE SUBP1_TS2
),
PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE P2_TS
(
SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE SUBP2_TS1,
SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE SUBP2_TS2
)
)
328491899