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

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

相关推荐
wangwangmoon_light37 分钟前
1.1 LeetCode总结(线性表)_枚举技巧
算法·leetcode·哈希算法
清水白石00839 分钟前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
资生算法程序员_畅想家_剑魔41 分钟前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
PyHaVolask1 小时前
SQL注入漏洞原理
数据库·sql
ptc学习者1 小时前
黑格尔时代后崩解的辩证法
数据库
代码游侠1 小时前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
!chen2 小时前
EF Core自定义映射PostgreSQL原生函数
数据库·postgresql
霖霖总总2 小时前
[小技巧14]MySQL 8.0 系统变量设置全解析:SET GLOBAL、SET PERSIST 与 SET PERSIST_ONLY 的区别与应用
数据库·mysql
马克学长2 小时前
SSM校园食堂订餐系统531p9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·ssm 校园食堂订餐系统
alonewolf_992 小时前
深入剖析MySQL索引底层:B+树、联合索引与跳跃扫描原理全解
数据库·b树·mysql