最近有业务场景需要用多个字段做分区表,数据量比较大,保存时间也较长,经过学习与实践,算是基本完成,以下内容为实践样例:
---建表语句
create table t_table
(
appdate date,
text varchar(10)
)
partition by range(appdate)--根据字段 appdate 创建主分区
interval(numtoyminterval(1,'MONTH')) --主分区按 月 自动创建分区
subpartition by list(areacode) --再按 地区 创建子分区
subpartition template( --指定明确的子分区信息
subpartition sub1 values('101'),
---模拟写入测试数据
--查询数据
select * from t_table;
--查询主分区数据
select *from t_table partition (mainpartition1);
--查询子分区数据
select *from t_table subpartition (mainpartition1_sub1);
--查看自动创建的主分区
select * from user_tab_partitions where table_name='T_TABLE'
oracle组合分区
range-list方法:
partition by range (updatetime)
interval (numtodsinterval(1,'day'))
subpartition by list(PSNCODE)
SUBPARTITION TEMPLATE(
Interval分区目前测试,只支持range先分区的方式
range-hash方法:每个分区10个子hash分区(可以指定每个子分区到单独的表空间)
interval(numtodsinterval(1,'day'))
subpartition by hash(PSNCODE)
SUBPARTITION template
( SUBPARTITION p1 TABLESPACE ts1
注意:这种方式可以实现完全自动的分区,非常适合自增长特性的10位数以上的大表
range-range方法:子分区需要手动添加,这种分区需要一般比较少见
PARTITION BY RANGE (time_id)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
SUBPARTITION BY RANGE(amount_sold)
SUBPARTITION TEMPLATE
( SUBPARTITION p_low VALUES LESS THAN (1000)
, SUBPARTITION p_ultimate VALUES LESS THAN (maxvalue)
①.、一般分区表都会很大,所以可以先创建表空间,为了让分区表存放到单独的表空间,否则默认会存放到USERS表空间
ID NUMBER(10) NOT NULL,
CREATE_TIME DATE,
TABLESPACE TS1
PARTITION BY LIST (ID)
(PARTITION PT_1001 VALUES (1001) TABLESPACE TS1);
select TABLE_NAME,PARTITION_COUNT,DEF_TABLESPACE_NAME from USER_PART_TABLES order by DEF_TABLESPACE_NAME;
一般语法:
create?table?t_test?(
add_date_time?DATE,
constraintPK_T_TEST?primary?key?(pk_id)
PARTITION?BY?RANGE?(add_date_time)
);
list分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个.
在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,所以呢通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区.
在根据某字段,如城市代码分区时,可以指定default,把非分区规则的数据,全部放到这个default分区.
如:
create
table
custaddr
id
byte)
not
null,
areacode
partition
by
list
(areacode)
values
,
p_other
(default)
一.表分区策略
①识别大表
采用ANALYZE TABLE语句进行分析,然后查询数据字典获得相应的数据量.
可根据月份,季度以及年份等进行分区;
要对每个表空间的大小进行估计
二.创建表分区
a.创建范围分区的关键字是'RANGE'
①范围分区
create table ware_retail_part --创建一个描述商品零售的数据表
id integer primary key,--销售编号
retail_date date,--销售日期
partition by range(retail_date)
三.创建索引分区
索引分区分为本地索引分区和全局索引分区,全局索引不反应基础表的结构,要分区只能进行范围分区.
创建索引分区要参照表分区
四.分区技术简介
优点:
①减少维护工作量
五,管理表分区
①添加表分区
ALTER TABLE...ALTER PARATITION
ALTER TABLE...DROP PARTITION
删除分区时,里面的数据也会被删除.
-创建表和分区
create table sales--创建一个销售记录表
id number primary key,--记录编号
saledate date--销售日期
partition by range(saledate)--按照日期分区
--第一季度数据
--第二季度数据
--第三季度数据
--第四季度数据
--创建局部索引
local(
partition part_seal tablespace tbsp_1,
--并入分区
--重建局部索引
六.管理索引分区
删除索引:DROP PARTITION
重建分区:REBUILT PARTITION
更名索引分区:RENAME PARTITION
分割索引分区:SPLIT PARTITION