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

被折叠的 条评论
为什么被折叠?



