YugabyteDB YSQL共置数据库创建分区表报错及方案咨询
YugabyteDB共置库分区表使用说明
核心结论
以colocated=true创建的共置数据库,完全支持同时部署地理分区(geo-partitioning)表和共置表,你遇到的报错是SQL写法不符合语法规则导致的,不是功能限制。
原SQL的错误点
你之前执行的建表语句存在三类问题:
- 表级存储参数
WITH (colocated = false)位置错误:YSQL兼容PostgreSQL语法规则,WITH子句必须放在PARTITION BY子句之前,不能跟在PARTITION BY后面 - 范围分区定义缺失分区键:
PARTITION BY RANGE后必须明确指定用于分区的字段,仅写RANGE属于语法不完整 - 存在逻辑冲突:你定义主键用了HASH分片,但表是RANGE分区类型,两者不兼容——范围分区表的主键必须包含分区键,且不能使用HASH分片,否则会导致分区裁剪失效。
正确实现方式
第一步:创建共置数据库
CREATE DATABASE biz_db WITH colocated = true; \c biz_db;
第二步:创建用于地理分区的非共置分区表
注意WITH子句位置、分区键、主键的匹配规则,以下为按地域字段做范围分区适配地理部署的示例:
CREATE TABLE user_geo ( id bigserial NOT NULL, region TEXT NOT NULL, user_name TEXT, -- 主键必须包含范围分区键region,不能加HASH分片配置 PRIMARY KEY(id, region) ) WITH (colocated = false) PARTITION BY RANGE (region);
后续给不同地域创建独立分区,绑定对应地域的表空间即可实现地理分区部署:
-- 提前创建对应地域的表空间,绑定对应地域的节点集群即可 -- 华北地域分区 CREATE TABLE user_north PARTITION OF user_geo FOR VALUES FROM ('cn-north') TO ('cn-north-end') WITH (tablespace = 'ts_north'); -- 华南地域分区 CREATE TABLE user_south PARTITION OF user_geo FOR VALUES FROM ('cn-south') TO ('cn-south-end') WITH (tablespace = 'ts_south');
第三步:创建共置表
同库下其余数据量小、不需要地理分区的表(比如配置表、维度表),直接正常建表即可,默认继承库级的colocated=true配置,自动共置存储,降低小表的资源开销:
-- 该表默认共置,不需要额外加参数 CREATE TABLE sys_config ( config_key TEXT PRIMARY KEY, config_value TEXT );
配置说明
- 共置库中,只有显式添加
WITH (colocated = false)的表(包括分区表)会独立分配tablet存储,其余表默认共置,完全满足“部分表共置+部分表地理分区”的业务需求 - 设置为
colocated=false的分区表,其下属子分区也会独立存储,配合表空间的节点放置策略,即可实现地理分区要求的就近访问、数据属地存储能力 - 范围分区表不要配置主键HASH分片,否则会导致查询无法命中分区裁剪,性能大幅下降
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

