以下是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) + 分区数 |
自动均匀分布,查询/写入性能高 | 无法按范围查询,分区键选择影响性能 |
关键操作说明
添加新分区(以Range为例):
ALTER TABLE sales_order ADD PARTITION p2024q1 VALUES LESS THAN ('2024-04-01');
删除分区(以List为例):
ALTER TABLE region_sales DROP PARTITION p_na;
合并分区(以Hash为例):
ALTER TABLE user_profile COALESCE PARTITION 2; -- 合并为2个分区
通过以上示例和对比,可根据业务需求选择合适的分区策略,优化数据分布和查询性能。