Oracle表分区

来源:互联网 发布:淘宝的一元秒杀在哪里 编辑:程序博客网 时间:2024/06/06 18:59

Oracle表分区:

1.你首先得有一个大数据量的表,数据了越大效果就越明显;

2.创建一个分区表,结构与源数据表一样,按时间范围分区,最后每个月系统自动分一次区;

sql如下:

CREATE TABLE SUN_CORE_EVENT_LOG_TMP
(
     EID          varchar(32),
     OPENID          varchar(50),
     CREATETIME         date,
     MSGTYPE          varchar(30),
     EVENT          varchar(30),
     EVENTKEY         varchar(500),
     TICKET          varchar(200),
     LATITUDE          varchar(32),
     LONGITUDE          varchar(32),
     PRECISION          varchar(32),
     WEIXINID          varchar(10)
)
PARTITION BY RANGE (createtime)
 INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION P1 VALUES LESS THAN (TO_DATE('2015-1-18', 'YYYY-MM-DD')));

3.将源表数据导入到分区表.

INSERT INTO SUN_CORE_EVENT_LOG_TMP SELECT *  FROM SUN_CORE_EVENT_LOG ;

4.在分区表中建立一个本地索引.

create index eid_ix on SUN_CORE_EVENT_LOG_TMP(eid) local ;-- 为范围分区创建本地索引

本地分区索引是使用与分区表相同的分区列,相同的分区方法进行分区的索引,本地分区索引的一个分区对应表的一个分区,因此,一个分区表有几个分区或子分区,其本地分区索引就有多少个分区.

5.为方式损坏原表数据,我再创建一个相同的表(但没有分区)

create table Sun_Core_Event_Log_bak as select * from Sun_Core_Event_Log_Tmp;

6.在两张表上执行相同的sql查看执行计划;

sql:

有分区:
select * from Sun_Core_Event_Log_Tmp t where t.createtime >TO_DATE('2015-10-10', 'YYYY-MM-DD') and t.createtime>TO_DATE('2015-12-10','YYYY-MM-DD');
没有分区:
select * from Sun_Core_Event_Log_bak t where t.createtime >TO_DATE('2015-10-10', 'YYYY-MM-DD') and t.createtime>TO_DATE('2015-12-10','YYYY-MM-DD');
执行计划截图:


很显然建立了分区的表速度杠杠的;

此截图是分区表的分区信息

指定分区名查询:

select count(*) from SUN_LOG_ACCESS partition(sys_p22);

0 0
原创粉丝点击