GBASE南大通用技术分享:GBase 8c 数据库分区表实践探秘(二)

南大通用GBase 8c 数据库支持以下四种分区类型:

  • 范围分区表:根据一个或多个列的取值范围划分分区,每个分区存储特定范围内的数据。适用于有明显范围特征的数据,如按时间存储的销售记录、日志数据等。
  • 列表分区表:依据某个列的离散值划分分区,每个分区对应一个值列表。适用于如地区、门店、类型等具有明确枚举值的场景。
  • 间隔分区表:一种特殊的范围分区,可自动根据间隔创建新分区。特别适合按时间自动扩展的场景,如按月度、年度自动分区。
  • 哈希分区表:通过哈希函数将数据均匀分布到不同分区,适用于没有明显范围或列表特征,但需均匀分布数据的场景。

本文将针对这四种分区类型分别阐述其功能、效果及常用使用场景。

1. 范围分区表

范围分区表按照划分范围的方式,分为以下类别:

  • VALUES LESS THAN:通过指定每个分区的上限值来定义分区范围,适用于已知明确上限的情况。
  • START END:通过指定分区的起点、终点或间隔等方式灵活定义分区,支持多种组合形式。

1.2 START END范围分区

适用场景

START END 分区方式适用于:

  • 需要自动生成多个均匀间隔分区的场景
  • 分区范围需要更灵活定义的场景
  • 数据分布较为均匀的时间序列或数值数据

语法格式

START END范围分区表有多种表达方式,而且这些方式可以在一个分区表内组合使用。

方式一:START(partition_value) END (partition_value | MAXVALUE)方式

sql 复制代码
CREATE TABLE partition_table_name
( [column_name data_type ]
 [, ... ]
)
    PARTITION BY RANGE (partition_key) 
        (
        PARTITION partition_name START(partition_value) END (partition_value | MAXVALUE)
        [, ... ]
        ); 

方式二:START(partition_value)方式

sql 复制代码
CREATE TABLE partition_table_name
( [column_name data_type ]
   [, ... ]
)
    PARTITION BY RANGE (partition_key)  
        (
        PARTITION partition_name START(partition_value) 
        [, ... ]  
        );  

方式三:END(partition_value | MAXVALUE)方式

sql 复制代码
CREATE TABLE partition_table_name
( [column_name data_type ]
   [, ... ]
)
    PARTITION BY RANGE (partition_key)  
        (
        PARTITION partition_name END(partition_value | MAXVALUE) 
        [, ... ]  
        );  

方式四:START(partition_value) END (partition_value) EVERY (interval_value)方式

sql 复制代码
CREATE TABLE partition_table_name
( [column_name data_type ]
   [, ... ]
)
    PARTITION BY RANGE (partition_key)  
        (
        PARTITION partition_name START(partition_value) END (partition_value) EVERY (interval_value)
        [, ... ]  
        );

SQL示例

sql 复制代码
drop table if exists record_start_end;
create table record_start_end  
(  
   number integer,  
   name varchar(20),  
   class varchar(20), 
   classno varchar(1),
   grade integer
)  
PARTITION BY RANGE(grade)  
(
   partition nopass START(10) END(60),
   -- 每隔 10 建立一个分区,将自动作为第一个实际分区pass_1
   PARTITION pass START(60) END(90) EVERY (10),  
   PARTITION excellent START(90) END(MAXVALUE)
);
INSERT INTO record_start_end (number, name, class, classno, grade) VALUES
(1, 'Alice', 'Class A', 1, 55),
(2, 'Bob', 'Class B', 2, 35),
(3, 'Charlie', 'Class D', 4, 75),
(4, 'David', 'Class A', 1, 45),
(5, 'Eve', 'Class B', 2, 65),
(6, 'Frank', 'Class C', 3, 85),
(7, 'Grace', 'Class A', 1, 70),
(8, 'Hannah', 'Class D', 4, 80),
(9, 'Ivy', 'Class C', 3, 95),
(10, 'Jack', 'Class D', 4, 50),
(11, 'Kate', 'Class B', 2, 60),
(12, 'Leo', 'Class C', 3, 20),
(13, 'Mike', 'Class D', 4, 72),
(14, 'Nancy', 'Class B', 2, 82),
(15, 'Olivia', 'Class C', 3, 92),
(16, 'Peter', 'Class A', 1, 62),
(17, 'Queen', 'Class D', 4, 5),
(18, 'Ryan', 'Class C', 3, 100),
(19, 'Sara', 'Class A', 1, 79),
(20, 'Tom', 'Class B', 2, 89);
-- 查询数据
SELECT * FROM record_start_end ;
-- 查询分区为 指定的值所在的分区
SELECT * FROM record_start_end PARTITION FOR (45);
-- 查询分区为 pass_1 的数据
SELECT * FROM record_start_end PARTITION (pass_1);
-- 删除分区
alter table record_start_end drop partition pass_2;
-- 分裂分区(B模式不支持):nopass_1分割为nopass_1_1,nopass_1_2;s4分割为s5,s6
ALTER TABLE record_start_end SPLIT PARTITION nopass_1 AT(50) INTO (PARTITION nopass_1_1,PARTITION nopass_1_2);
ALTER TABLE record_start_end SPLIT PARTITION pass_3 AT(85) INTO (PARTITION pass_3_1,PARTITION pass_3_2);
-- 合并分区(B模式不支持):将pass_1、pass_3_1,pass_3_2合并为pass
ALTER TABLE record_start_end MERGE PARTITIONS pass_1,pass_3_1,pass_3_2 INTO PARTITION pass;
-- 重命名分区:将excellent改成great
ALTER TABLE record_start_end rename PARTITION excellent to great;
-- 查看分区表信息
SELECT relname, boundaries::varchar FROM pg_partition p where p.parentid='record_start_end'::regclass order by 1;

2. 列表分区表

相关推荐
千桐科技8 小时前
qData 数据中台开源版 v1.6.4 发布:聚焦使用反馈,功能细节与产品体验持续优化
数据库·开源·qdata
fox06338 小时前
预约类平台的责任边界建模:从一个证件办理预约平台的流程设计说起
大数据·数据库·搜索引擎·全文检索·生活
John_Hui8 小时前
MySQL基础知识
数据库·sql·mysql·1024程序员节
DolphinDB8 小时前
QuantLib 之外,衍生品定价还能怎么选?DolphinDB Monte Carlo + PDE 工具实测
数据库·时序数据库·量化金融·dolphindb
泡海椒8 小时前
深度解析JQuick-SQL 逻辑计划到物理计划生成机制|分布式SQL原理
数据库·分布式·sql
恒知学术8 小时前
时间序列异常检测论文怎么查?我把 3 轮检索和筛选表写成了可复现流程
数据库·文献检索·谷歌学术
小豆庄8 小时前
视频脱敏:云端识别与本地推理的边界实测
数据库·yolo·自然语言处理·视觉检测·视频·设计规范·纹理贴图
wshzd8 小时前
LLM之Agent(120)|DeepSeek-Harness(二十七)Workflow 引擎与 Ralph 循环
前端·数据库·人工智能
l1t9 小时前
DeepSeek总结的DuckDB 2.0.0 中的隐藏亮点
大数据·数据库·duckdb
程序员塔塔喵9 小时前
【MySQL篇|第八篇】索引底层实现
数据库·mysql·adb·索引