达梦创建复杂分区表

1. Creating Interval-Partitioned Tables

drop table PARTTAB1;
create table PARTTAB1
(
  ID INT PRIMARY KEY,
  CONTENT1 VARCHAR(20),
  CONTENT2 VARCHAR(20),
  INSERT_TIME DATE
)
PARTITION BY RANGE (INSERT_TIME) 
  INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
    ( PARTITION p0 VALUES LESS THAN ('2024-01-01') tablespace MAIN,
      PARTITION p1 VALUES LESS THAN ('2024-02-01') tablespace MAIN,
      PARTITION p2 VALUES LESS THAN ('2024-03-01') tablespace MAIN,
      PARTITION p3 VALUES LESS THAN ('2024-04-01') tablespace MAIN )
storage(NOBRANCH);

insert into PARTTAB1 values(1,'test','test',TO_DATE('2024-01-15','YYYY-MM-DD'));
insert into PARTTAB1 values(2,'test','test',TO_DATE('2024-02-15','YYYY-MM-DD'));
insert into PARTTAB1 values(3,'test','test',TO_DATE('2024-03-15','YYYY-MM-DD'));
insert into PARTTAB1 values(4,'test','test',TO_DATE('2024-04-15','YYYY-MM-DD'));
insert into PARTTAB1 values(5,'test','test',TO_DATE('2024-05-15','YYYY-MM-DD'));
commit;

插入数据时如果分区字段为null,数据会存放在最小的分区中

insert into PARTTAB1 values(6,'test','test',NULL);
SELECT * FROM SYS.DBA_TAB_PARTITIONS WHERE TABLE_NAME='PARTTAB1';
SELECT * FROM PARTTAB1 PARTITION (P0);


2. Creating Interval-Reference Partitioned Tables

drop table PARTTAB2;
create table PARTTAB2
(
  id            number not null ,
  log_id        VARCHAR2(64) not null,
  column_code   VARCHAR2(128) not null,
  old_value     VARCHAR2(4000),
  new_value     VARCHAR2(4000),
  is_rollback   CHAR(1) default 0,
  rollback_date DATE,
  rollback_by   VARCHAR2(256),
  need_syn      CHAR(1),
  is_log        CHAR(1) default 1,
  CONSTRAINT fk_sys_record_log_detail
      FOREIGN KEY(log_id) REFERENCES SYS_RECORD_LOG(id)
)
PARTITION BY REFERENCE(fk_sys_record_log_detail);

Oracle11g新特性-引用分区(reference partitioning):如果父表是分区表,子表可以按照父表的方式进行分区,父表中被引用的列不一定要是分区键。
达梦中暂不支持,但语法没有报错



3. Creating Composite List-Range Partitioned Tables

drop table XXL_JOB_QRTZ_TRIGGER_LOG;
create table XXL_JOB_QRTZ_TRIGGER_LOG
(
  id                        NUMBER(11) not null,
  job_group                 NUMBER(11) not null,
  job_id                    NUMBER(11) not null,
  executor_address          VARCHAR2(255),
  executor_handler          VARCHAR2(255),
  executor_param            VARCHAR2(512),
  executor_sharding_param   VARCHAR2(64),
  executor_fail_retry_count NUMBER(11) default 0 not null,
  trigger_time              DATE,
  trigger_code              NUMBER(11) not null,
  trigger_msg               NCLOB,
  handle_time               DATE,
  handle_code               NUMBER(11) not null,
  handle_msg                NCLOB,
  log_type                  CHAR(1) default 'L' not null
)
partition by list(handle_code) subpartition by range (handle_time)  
( 
 partition xxl_jqtl_part_t values (200) tablespace MAIN
 (
   subpartition xxl_jqtl_part_t_2024_07_01 values less than (TO_DATE('2024-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_t_2024_07_02 values less than (TO_DATE('2024-07-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_t_2024_07_03 values less than (TO_DATE('2024-07-03 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_t_2024_07_04 values less than (TO_DATE('2024-07-04 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_t_2024_07_05 values less than (TO_DATE('2024-07-05 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_t_2024_07_06 values less than (TO_DATE('2024-07-06 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_t_2024_07_07 values less than (TO_DATE('2024-07-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_t_2024_07_08 values less than (TO_DATE('2024-07-08 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_t_2024_07_09 values less than (TO_DATE('2024-07-09 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_t_2024_07_10 values less than (TO_DATE('2024-07-10 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_t_2024_07_11 values less than (TO_DATE('2024-07-11 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_t_2024_07_12 values less than (TO_DATE('2024-07-12 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN 
 ),                 
 partition xxl_jqtl_part_f values (0,500,900) tablespace MAIN
 (
   subpartition xxl_jqtl_part_f_2024_01 values less than (TO_DATE('2024-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_f_2024_02 values less than (TO_DATE('2024-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_f_2024_03 values less than (TO_DATE('2024-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_f_2024_04 values less than (TO_DATE('2024-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_f_2024_05 values less than (TO_DATE('2024-05-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_f_2024_06 values less than (TO_DATE('2024-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_f_2024_07 values less than (TO_DATE('2024-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_f_2024_08 values less than (TO_DATE('2024-08-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN,
   subpartition xxl_jqtl_part_f_2024_09 values less than (TO_DATE('2024-09-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_f_2024_10 values less than (TO_DATE('2024-10-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_f_2024_11 values less than (TO_DATE('2024-11-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN, 
   subpartition xxl_jqtl_part_f_2024_12 values less than (TO_DATE('2024-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) tablespace MAIN 
 )
) storage(NOBRANCH);

这里用Oracle的语法不会报错,但部分字段类型会被转换

SELECT * FROM SYS.DBA_TAB_SUBPARTITIONS WHERE TABLE_NAME='XXL_JOB_QRTZ_TRIGGER_LOG' ORDER BY PARTITION_NAME,SUBPARTITION_NAME;


-- ADD/DROP主分区
ALTER TABLE XXL_JOB_QRTZ_TRIGGER_LOG 
   ADD PARTITION xxl_jqtl_part_x values (1)
    (subpartition xxl_jqtl_part_x_2022_02_01 values less than (DATE'2024-07-01') tablespace MAIN);

ALTER TABLE XXL_JOB_QRTZ_TRIGGER_LOG 
RENAME PARTITION xxl_jqtl_part_x 
TO xxl_jqtl_part_x0;

ALTER TABLE XXL_JOB_QRTZ_TRIGGER_LOG DROP PARTITION xxl_jqtl_part_x0;


-- ADD/DROP子分区
ALTER TABLE XXL_JOB_QRTZ_TRIGGER_LOG
   MODIFY PARTITION xxl_jqtl_part_x 
      ADD SUBPARTITION xxl_jqtl_part_x_2022_02_02 values less than (DATE'2024-07-02') tablespace MAIN;
	  
ALTER TABLE XXL_JOB_QRTZ_TRIGGER_LOG 
RENAME SUBPARTITION xxl_jqtl_part_x_2022_02_02 
 TO xxl_jqtl_part_x_2022_02_020;

ALTER TABLE XXL_JOB_QRTZ_TRIGGER_LOG DROP SUBPARTITION xxl_jqtl_part_x_2022_02_020;


4. create index

alter table XXL_JOB_QRTZ_TRIGGER_LOG add primary key(ID);
create index idx_xxl_jqtl_job_group on XXL_JOB_QRTZ_TRIGGER_LOG(job_group);
create index idx_xxl_jqtl_job_id on XXL_JOB_QRTZ_TRIGGER_LOG(job_id) GLOBAL;
SELECT TABLE_NAME,INDEX_NAME,PARTITIONED FROM SYS.DBA_INDEXES WHERE TABLE_NAME='XXL_JOB_QRTZ_TRIGGER_LOG';

达梦分区表创建索引,默认为局部索引,主键是全局索引




Tips!!!

  1. 当分区表存在MAXVALUE分区时,不可添加分区
  2. 只能对范围分区和LIST分区进行删除分区,哈希分区不支持删除分区
  3. 删除分区时,不会影响局部索引,全局索引会自动重建
  4. 当表数据量较大时,建议通过禁用全局索引再删除表分区,删除完成后再进行索引重建
    禁用全局索引
    alter index 用户名.索引名 unusable;
    重建全局索引
    alter index 用户名.索引名 rebuild online;



达梦社区地址
https://eco.dameng.com

达梦数据库的列分区是一种将大型表按照列进行划分的存储机制,旨在提升查询性能、降低存储开销并增强数据管理的灵活性。其核心实现原理主要涉及以下几个方面: ### 1. 数据按列存储 列分区将数据库表中的数据按照列进行物理存储,而不是传统的行式存储。这种方式特别适用于仅需访问少数几列数据的查询场景。由于每列数据独立存储,查询时只需读取相关列的数据,从而显著减少 I/O 操作,提高查询效率[^4]。 ### 2. 分区策略与存储结构 达梦数据库支持多种分区策略,包括范围分区、哈希分区和列表分区等。列分区通常结合这些分区策略,将特定列的数据根据分区规则分布到不同的物理存储区域。这种分布方式不仅提升了查询性能,还增强了数据的可管理性,例如对特定列的数据进行归档或删除操作时,可以仅针对相关分区进行处理[^1]。 ### 3. 压缩与编码优化 列分区的另一个优势在于其天然适合数据压缩。由于同一列中的数据类型和值域较为一致,达梦数据库可以采用高效的压缩算法对列数据进行编码,从而减少存储空间占用。此外,压缩后的数据在传输和缓存中也更加高效,进一步提升了系统性能[^4]。 ### 4. 查询优化器支持 达梦数据库的查询优化器针对列分区进行了专门的优化。在执行查询时,优化器会根据查询条件和涉及的列,自动选择需要访问的分区,避免扫描不必要的数据。这种机制显著减少了查询的响应时间,特别是在大数据量场景下效果尤为明显[^2]。 ### 5. 事务与一致性管理 在列分区环境下,达梦数据库通过分布式事务机制确保数据的一致性和完整性。每个分区的操作都会被记录到 Redo 日志中,并通过日志重演机制保证在故障恢复时数据的一致性。此外,达梦数据库还支持跨分区的事务处理,确保复杂业务场景下的数据可靠性[^3]。 ### 6. 适用场景 列分区主要适用于以下场景: - 查询仅涉及少量列的分析型业务(OLAP)。 - 需要高效压缩和快速访问的海量数据存储。 - 对数据管理灵活性要求较高的场景,例如按时间分区的归档数据处理。 ### 示例代码 以下是一个简单的列分区表创建示例,假设有一个销售记录表,其中包含产品ID、销售日期和销售金额三个字段: ```sql CREATE TABLE sales ( product_id INT, sale_date DATE, amount DECIMAL(10, 2) ) PARTITION BY COLUMN ( product_id PARTITION p1, sale_date PARTITION p2, amount PARTITION p3 ); ``` 此代码将表的三列分别分配到三个分区中,每个分区可以独立管理。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值