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

发布于:2025-04-02 ⋅ 阅读:(14) ⋅ 点赞:(0)

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


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

场景:按订单日期范围分区(如按季度)。
创建表
-- 创建按日期范围分区的销售订单表
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')
);
插入数据
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
查询数据
-- 查询2023年Q2的订单
SELECT * FROM sales_order 
WHERE order_date BETWEEN '2023-04-01' AND '2023-06-30';
更新数据
-- 更新Q2订单金额
UPDATE sales_order 
SET amount = amount * 1.1 
WHERE order_date BETWEEN '2023-04-01' AND '2023-06-30';
删除数据
-- 删除Q1所有订单
DELETE FROM sales_order 
WHERE order_date < '2023-04-01';

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

场景:按地区代码分区(如北美、欧洲、亚洲)。
创建表
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')     -- 亚洲
);
插入数据
INSERT INTO region_sales (region_code, sales_id, total_sales) 
VALUES 
    ('US', 101, 50000.00),  -- 北美分区
    ('DE', 102, 30000.00),  -- 欧洲分区
    ('CN', 103, 45000.00);  -- 亚洲分区
查询数据
-- 查询欧洲地区的销售数据
SELECT * FROM region_sales 
WHERE region_code IN ('DE', 'FR');
更新数据
-- 更新亚洲地区的销售额
UPDATE region_sales 
SET total_sales = total_sales * 1.05 
WHERE region_code IN ('CN', 'JP');
删除数据
-- 删除北美分区的所有数据
DELETE FROM region_sales 
WHERE region_code IN ('US', 'CA');

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

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

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

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

    ALTER TABLE user_profile 
    COALESCE PARTITION 2;  -- 合并为2个分区
    

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