创建子分区模板及使用subpartitions 方法快速添加子分区

一、使用模板创建子分区
/*drop table T_LOCRECORD_HJ purge ;*/

create table T_LOCRECORD_HJ
(
  id            VARCHAR2(36) not null,
  device_id     VARCHAR2(256),
  latitude      FLOAT,
  longitude     FLOAT,
  jmx           VARCHAR2(20),
  jmy           VARCHAR2(20),
  speed         FLOAT,
  direction     FLOAT,
  height        FLOAT,
  distance      FLOAT,
  statllite_num NUMBER,
  gpstime       DATE,
  inputdate     DATE default SYSDATE not null,
  locate_type   VARCHAR2(1),
  coord_type    NUMBER,
  state         VARCHAR2(10),
  pos_desc      VARCHAR2(1000),
  obj_id        VARCHAR2(256),
  obj_type      VARCHAR2(20)
)
partition by range (INPUTDATE)
SUBPARTITION BY hash (device_id )
SUBPARTITION TEMPLATE

(
  subpartition p001  , 
  subpartition p002  , 
  subpartition p003  , 
  subpartition p004  , 
  subpartition p005  , 
  subpartition p006  , 
  subpartition p007  , 
  subpartition p008  , 
  subpartition p009  , 
  subpartition p010 
)

(
  partition PAR_2013_06_1 values less than (TO_DATE(' 2013-06-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_06_1 ,
  partition PAR_2013_06_2 values less than (TO_DATE(' 2013-06-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_06_2,
  partition PAR_2013_06_3 values less than (TO_DATE(' 2013-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_06_3,
  partition PAR_2013_07_1 values less than (TO_DATE(' 2013-07-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_07_1,
  partition PAR_2013_07_2 values less than (TO_DATE(' 2013-07-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_07_2,
  partition PAR_2013_07_3 values less than (TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_07_3
);

这种方法创建的分区,在下次添加分区的时候会自动按照模版创建子分区,只需要按照如下方法添加即可:
alter table T_LOCRECORD_HJ add partition par_2013_08_01  values less than (TO_DATE(' 2013-08-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))  tablespace HIS_GPS_08_1 ; 

二、使用subpartition 的方法来创建子分区
/*drop table T_LOCRECORD_HJ purge ;*/

create table T_LOCRECORD_HJ
(
  id            VARCHAR2(36) not null,
  device_id     VARCHAR2(256),
  latitude      FLOAT,
  longitude     FLOAT,
  jmx           VARCHAR2(20),
  jmy           VARCHAR2(20),
  speed         FLOAT,
  direction     FLOAT,
  height        FLOAT,
  distance      FLOAT,
  statllite_num NUMBER,
  gpstime       DATE,
  inputdate     DATE default SYSDATE not null,
  locate_type   VARCHAR2(1),
  coord_type    NUMBER,
  state         VARCHAR2(10),
  pos_desc      VARCHAR2(1000),
  obj_id        VARCHAR2(256),
  obj_type      VARCHAR2(20)
)
partition by range (INPUTDATE)
SUBPARTITION BY hash (device_id )  subpartitions 100
(
  partition PAR_2013_06_1 values less than (TO_DATE(' 2013-06-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_06_1 ,
  partition PAR_2013_06_2 values less than (TO_DATE(' 2013-06-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_06_2,
  partition PAR_2013_06_3 values less than (TO_DATE(' 2013-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_06_3,
  partition PAR_2013_07_1 values less than (TO_DATE(' 2013-07-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_07_1,
  partition PAR_2013_07_2 values less than (TO_DATE(' 2013-07-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_07_2,
  partition PAR_2013_07_3 values less than (TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) tablespace HIS_GPS_07_3
);

这种方法创建子分区的好处就是在初次创建分区的时候不用手动的去指点复杂的子分区规则,dbms 会根据subpartitions 后面的值创建出相应
个数的子分区。
这种方法的弊端就是在每次添加分区的时候,需要在每一个语句后面都要带上 subpatitions number  这样的参数。如:

alter table T_LOCRECORD_HJ130818 add partition  PAR_2013_09_1 values  less than (TO_DATE(' 2013-09-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))    tablespace HIS_GPS_09_1 subpartitions 100 ; 
需要实现按 device_id 做64HASH 分区,再按positionTime时间做每7天一个分区,首次创建表时先建 10 个 7 天级分区,后续由事件自动维护每 7 天检查一次,若未来不足 10 个分区,则一次性补齐 10 个,分析以下代码是否有语法错误,并修改: CREATE TABLE device_trajectory ( tid VARCHAR(50) NOT NULL, device_id VARCHAR(50) NOT NULL, latitude DECIMAL(10,6) NOT NULL, -- 约 16 cm 精度[^1^] longitude DECIMAL(10,6) NOT NULL, deviceAlarm VARCHAR(50), deviceAltitude DECIMAL(10,2), deviceSpeed DECIMAL(10,2), deviceDirection DECIMAL(10,2), deviceStatus TINYINT, positionTime DATETIME NOT NULL, createTime DATETIME NOT NULL, deviceDistance DECIMAL(12,2), recorderSpeed DECIMAL(10,2), remainingFuel DECIMAL(8,2), alarmConfirm TINYINT, overSpeed TINYINT, inOutArea TINYINT, travelTime INT, singleStatus VARCHAR(10), ioStatus VARCHAR(20), analogQuantity DECIMAL(10,2), networkSignalStrength TINYINT, gnssSatelliteNumber TINYINT, mainPowerVoltage DECIMAL(5,2), simIccid VARCHAR(25), -- 联合主键,便于分区裁剪 PRIMARY KEY (device_id, positionTime), -- 常用检索列索引 INDEX idx_tid (tid), INDEX idx_alarm (deviceAlarm), INDEX idx_createTime (createTime) ) PARTITION BY HASH (device_id) SUBPARTITION BY RANGE (TO_DAYS(positionTime)) ( -- 先建 10 个 7 天级分区,后续由事件自动维护 SUBPARTITION p20240802 VALUES LESS THAN (TO_DAYS('2025-08-09')), SUBPARTITION p20240809 VALUES LESS THAN (TO_DAYS('2025-08-16')), SUBPARTITION p20240816 VALUES LESS THAN (TO_DAYS('2025-08-23')), SUBPARTITION p20240823 VALUES LESS THAN (TO_DAYS('2025-08-30')), SUBPARTITION p20240830 VALUES LESS THAN (TO_DAYS('2025-09-06')), SUBPARTITION p20240906 VALUES LESS THAN (TO_DAYS('2025-09-13')), SUBPARTITION p20240913 VALUES LESS THAN (TO_DAYS('2025-09-20')), SUBPARTITION p20240920 VALUES LESS THAN (TO_DAYS('2025-09-27')), SUBPARTITION p20240927 VALUES LESS THAN (TO_DAYS('2025-10-04')), SUBPARTITION p20241004 VALUES LESS THAN (TO_DAYS('2025-10-11')) );
最新发布
08-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值