You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:54:20