创建 / 拆分 / 删除分区
Oracle
-- Add a RANGE partition
ALTER TABLE sales ADD PARTITION p2026 VALUES LESS THAN (TO_DATE('2027-01-01','YYYY-MM-DD'));
-- Split an existing partition
ALTER TABLE sales SPLIT PARTITION pmax AT (TO_DATE('2027-01-01','YYYY-MM-DD')) INTO (PARTITION p2026, PARTITION pmax);
-- Drop a partition
ALTER TABLE sales DROP PARTITION p2020 UPDATE INDEXES;支持 RANGE/LIST/HASH 分区。DROP PARTITION 会删除该分区中的所有行;使用 UPDATE INDEXES 时全局索引保持有效。间隔分区可自动添加分区。
PostgreSQL
-- Declarative partitioning: parent table
CREATE TABLE sales (id bigint, created_at date, amount numeric) PARTITION BY RANGE (created_at);
-- Add a new partition
CREATE TABLE sales_2026 PARTITION OF sales FOR VALUES FROM ('2026-01-01') TO ('2027-01-01');
-- Attach a standalone (existing) table as a partition
CREATE TABLE sales_2027 (LIKE sales INCLUDING ALL);
ALTER TABLE sales ATTACH PARTITION sales_2027 FOR VALUES FROM ('2027-01-01') TO ('2028-01-01');
-- Detach a partition (the table is not dropped; it remains a standalone table)
ALTER TABLE sales DETACH PARTITION sales_2026;核心 PostgreSQL 没有 SPLIT/MERGE PARTITION(截至 PG17);要拆分,需 DETACH 该分区,按新边界创建两个分区,迁移数据后再 ATTACH。DETACH ... CONCURRENTLY(PG14+)可缩短加锁时间。
MySQL
-- Partitioned table
CREATE TABLE sales (id BIGINT, created_at DATE) PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- Add / split / drop a partition
ALTER TABLE sales REORGANIZE PARTITION pmax INTO (
PARTITION p2026 VALUES LESS THAN (2027),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
ALTER TABLE sales DROP PARTITION p2024;分区列必须包含在每个 PRIMARY KEY / UNIQUE 键中。对于 RANGE,拆分/合并通过 REORGANIZE PARTITION 完成。DROP PARTITION 同时会删除行(RANGE/LIST)。
SQL Server
-- 1) Partition function and scheme
CREATE PARTITION FUNCTION pf_date (date) AS RANGE RIGHT FOR VALUES ('2025-01-01','2026-01-01');
CREATE PARTITION SCHEME ps_date AS PARTITION pf_date ALL TO ([PRIMARY]);
-- 2) Add a new boundary (split)
ALTER PARTITION SCHEME ps_date NEXT USED [PRIMARY];
ALTER PARTITION FUNCTION pf_date() SPLIT RANGE ('2027-01-01');
-- 3) Remove a boundary (merge)
ALTER PARTITION FUNCTION pf_date() MERGE RANGE ('2025-01-01');先定义分区函数 + 分区方案,再通过 CREATE TABLE ... ON ps_date(created_at) 在该方案上建表。SPLIT 之前必须设置 NEXT USED 文件组。要移除数据,使用 SWITCH PARTITION 将其切换到临时表。
MongoDB
// MongoDB uses sharding instead of table partitioning
sh.shardCollection("db.sales", { created_at: 1 });
// Native time-series collection for time series
db.createCollection("measurements", { timeseries: { timeField: "ts", granularity: "hours" } });没有传统意义上的分区。水平拆分通过分片(sharding)以 chunk 方式实现;对于时间相关数据,时间序列集合提供自动分桶。
Redis
# Not applicable: Redis has no table/partition concept; scaling is done with Redis Cluster hash slots (16384).Redis Cluster 将键分布到 16384 个哈希槽;这是应用层面的拆分,而非表分区。没有手动分区命令。
Elasticsearch
# Time-based automatic splitting (rollover) with an ILM policy + data stream
PUT _ilm/policy/logs-policy
{ "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50gb", "max_age": "30d" } } } } } }
PUT _index_template/logs-tmpl
{ "index_patterns": ["logs*"], "data_stream": {}, "template": { "settings": { "index.lifecycle.name": "logs-policy" } } }在 Elasticsearch 中,拆分通过将索引划分为分片实现;对于时间序列,则通过 ILM + data streams 创建新的 backing index(rollover)。旧索引可通过 ILM 删除。