华为高斯(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个分区

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

相关推荐
星霜笔记1 小时前
Docker 部署 MariaDB+phpMyAdmin+Nextcloud 完整教程
运维·数据库·docker·容器·mariadb
wyiyiyi7 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
天宇_任7 小时前
Mysql数据库迁移到GaussDB注意事项
数据库·mysql·gaussdb
xiep143833351010 小时前
Ubuntu 安装带证书的 etcd 集群
数据库·etcd
Java小白程序员11 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
老虎062711 小时前
数据库基础—SQL语句总结及在开发时
数据库·sql·oracle
爱掘金的土拨鼠13 小时前
国产化dm数据库锁表解锁
数据库
庖丁解java13 小时前
N个Utils
数据库
Mr. zhihao14 小时前
SQL LEFT JOIN 与 WHERE 条件的隐藏坑
数据库·sql
2301_7930868714 小时前
Redis 04 Reactor
数据库·redis·缓存