华为高斯(GaussDB)数据库中 Range、List、Hash三种分区方式 的完整SQL示例及增删改查操作,并附上总结对比表格

以下是GaussDB中 Range、List、Hash三种分区方式 的完整SQL示例及增删改查操作,并附上总结对比表格:


1. Range分区(按范围分区)

场景:按订单日期范围分区(如按季度)。
创建表
sql 复制代码
-- 创建按日期范围分区的销售订单表
CREATE TABLE sales_order (
    order_id INT PRIMARY KEY,
    order_date DATE NOT NULL,
    amount DECIMAL(10,2)
) 
PARTITION BY RANGE (order_date) (
    PARTITION p2023q1 VALUES LESS THAN ('2023-04-01'),
    PARTITION p2023q2 VALUES LESS THAN ('2023-07-01'),
    PARTITION p2023q3 VALUES LESS THAN ('2023-10-01'),
    PARTITION p2023q4 VALUES LESS THAN ('2024-01-01')
);
插入数据
sql 复制代码
INSERT INTO sales_order (order_id, order_date, amount) 
VALUES 
    (1, '2023-03-15', 100.00),  -- 属于p2023q1
    (2, '2023-05-20', 200.50),  -- 属于p2023q2
    (3, '2023-08-10', 150.75);  -- 属于p2023q3
查询数据
sql 复制代码
-- 查询2023年Q2的订单
SELECT * FROM sales_order 
WHERE order_date BETWEEN '2023-04-01' AND '2023-06-30';
更新数据
sql 复制代码
-- 更新Q2订单金额
UPDATE sales_order 
SET amount = amount * 1.1 
WHERE order_date BETWEEN '2023-04-01' AND '2023-06-30';
删除数据
sql 复制代码
-- 删除Q1所有订单
DELETE FROM sales_order 
WHERE order_date < '2023-04-01';

2. List分区(按列表分区)

场景:按地区代码分区(如北美、欧洲、亚洲)。
创建表
sql 复制代码
CREATE TABLE region_sales (
    region_code VARCHAR(2) NOT NULL,
    sales_id INT PRIMARY KEY,
    total_sales DECIMAL(10,2)
) 
PARTITION BY LIST (region_code) (
    PARTITION p_na VALUES IN ('US', 'CA'),    -- 北美
    PARTITION p_eu VALUES IN ('DE', 'FR'),    -- 欧洲
    PARTITION p_as VALUES IN ('CN', 'JP')     -- 亚洲
);
插入数据
sql 复制代码
INSERT INTO region_sales (region_code, sales_id, total_sales) 
VALUES 
    ('US', 101, 50000.00),  -- 北美分区
    ('DE', 102, 30000.00),  -- 欧洲分区
    ('CN', 103, 45000.00);  -- 亚洲分区
查询数据
sql 复制代码
-- 查询欧洲地区的销售数据
SELECT * FROM region_sales 
WHERE region_code IN ('DE', 'FR');
更新数据
sql 复制代码
-- 更新亚洲地区的销售额
UPDATE region_sales 
SET total_sales = total_sales * 1.05 
WHERE region_code IN ('CN', 'JP');
删除数据
sql 复制代码
-- 删除北美分区的所有数据
DELETE FROM region_sales 
WHERE region_code IN ('US', 'CA');

3. Hash分区(按哈希值分区)

场景:按用户ID哈希值均匀分布数据(如分片存储)。
创建表
sql 复制代码
CREATE TABLE user_profile (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
) 
PARTITION BY HASH (user_id) 
PARTITIONS 4;  -- 分为4个分区
插入数据
sql 复制代码
INSERT INTO user_profile (user_id, username, email) 
VALUES 
    (1001, 'Alice', 'alice@example.com'),
    (1002, 'Bob', 'bob@example.com'),
    (1003, 'Charlie', 'charlie@example.com');
查询数据
sql 复制代码
-- 查询特定用户(哈希分区通过键值自动定位)
SELECT * FROM user_profile 
WHERE user_id = 1001;
更新数据
sql 复制代码
UPDATE user_profile 
SET email = 'alice.new@example.com' 
WHERE user_id = 1001;
删除数据
sql 复制代码
DELETE FROM user_profile 
WHERE user_id = 1002;

总结对比表格

分区类型 适用场景 分区键 分区创建方式 优点 缺点
Range 按时间、数值范围分区 连续值(如日期、金额) PARTITION BY RANGE (column) 易管理,适合时间序列数据 分区边界需预估,扩展时需手动添加分区
List 按离散值列表分区(如地区、类型) 离散值(如地区代码、状态) PARTITION BY LIST (column) 精确控制分区归属 需提前定义所有可能值,扩展灵活性差
Hash 均匀分布数据(如分片) 任意字段(如ID) PARTITION BY HASH (column) + 分区数 自动均匀分布,查询/写入性能高 无法按范围查询,分区键选择影响性能

关键操作说明

  1. 添加新分区(以Range为例):

    sql 复制代码
    ALTER TABLE sales_order 
    ADD PARTITION p2024q1 VALUES LESS THAN ('2024-04-01');
  2. 删除分区(以List为例):

    sql 复制代码
    ALTER TABLE region_sales 
    DROP PARTITION p_na;
  3. 合并分区(以Hash为例):

    sql 复制代码
    ALTER TABLE user_profile 
    COALESCE PARTITION 2;  -- 合并为2个分区

通过以上示例和对比,可根据业务需求选择合适的分区策略,优化数据分布和查询性能。

相关推荐
2501_920047034 分钟前
Redis-集群
数据库·redis·bootstrap
半夏陌离20 分钟前
SQL 拓展指南:不同数据库差异对比(MySQL/Oracle/SQL Server 基础区别)
大数据·数据库·sql·mysql·oracle·数据库架构
叙白冲冲26 分钟前
哈希算法以及面试答法
算法·面试·哈希算法
旋转的油纸伞40 分钟前
SQL表一共有几种写入方式
数据库·sql
半夏陌离41 分钟前
SQL 入门指南:排序与分页查询(ORDER BY 多字段排序、LIMIT 分页实战)
java·前端·数据库
isyoungboy42 分钟前
SQL高效处理海量GPS轨迹数据:人员gps轨迹数据抽稀实战指南
数据库·sql
敬业小码哥1 小时前
记一次:mysql的json及json数组使用组合使用
数据库·mysql·json
练小杰2 小时前
【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
数据库·sql·mysql·adb·配置文件·mysql安装·关系型数据库
陈陈爱java3 小时前
Spring八股文
开发语言·javascript·数据库
拾忆,想起4 小时前
Redis复制延迟全解析:从毫秒到秒级的优化实战指南
java·开发语言·数据库·redis·后端·缓存·性能优化