Oracle表分区

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);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值