华为高斯(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', '[email protected]'),
    (1002, 'Bob', '[email protected]'),
    (1003, 'Charlie', '[email protected]');
查询数据
sql 复制代码
-- 查询特定用户(哈希分区通过键值自动定位)
SELECT * FROM user_profile 
WHERE user_id = 1001;
更新数据
sql 复制代码
UPDATE user_profile 
SET email = '[email protected]' 
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个分区

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

相关推荐
好吃的肘子15 分钟前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
weixin_4723394623 分钟前
MySQL MCP 使用案例
数据库·mysql
lqlj22331 小时前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
joker D8881 小时前
【C++】深入理解 unordered 容器、布隆过滤器与分布式一致性哈希
c++·分布式·哈希算法
遗憾皆是温柔2 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务2 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全
fengye2071613 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
Ailovelearning3 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
_星辰大海乀4 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
未来之窗软件服务5 小时前
solidwors插件 开发————仙盟创梦IDE
前端·javascript·数据库·ide·仙盟创梦ide