更新时间:2026-07-28 GMT+08:00
分享

单节点表DDL操作

规格约束

  1. 单节点表仅支持创建为复制表类型,不支持创建为分布表(指定分布列)。
  2. 继承复制表约束:不支持创建全局二级索引(GSI),不支持定义为hash bucket表。
  3. 仅支持在系统预置的单节点组Node Group上创建单节点表。
  4. M-Compatibility模式数据库下不支持使用单节点表。
  5. 从不支持单节点表的版本升级到新版本,升级观察期间,不支持默认创建单节点表。
  6. 从不支持单节点表的版本升级到新版本,升级观察期间,新版本系统预置的单节点组Node Group上不允许进行创建表操作。
  7. 当系统预置的单节点组Node Group上已创建单节点表,不支持对Node Group进行缩容。
  8. 不支持物化视图、不支持外表。
  9. 单节点表逻辑解码和备份恢复只支持同构场景,异构场景可能会导致错误。
  10. 仅支持复制表基础上的本地临时表、unlogged表和全局临时表、一级分区表模式,其他表类型均不支持。

创建单节点表

可通过以下方式进行创建单节点表,不同的创建方式需满足不同条件:

  • 显式创建单节点表
    • 设置GUC参数single_node_table_strategy的值不为FORBID。
    • 在CREATE TABLE语句中,显式指定TO GROUP group_name子句,且指定的节点组为系统预定义的单节点组Node Group(类型标识为's'),其名称需以“sys_single_group”为前缀进行命名。如下所示:
      CREATE TABLE table1 (id INT) TO GROUP sys_single_group1;
  • 隐式创建单节点表
    • 在CREATE TABLE语句中,未明确指定TO GROUP group_name子句时,系统自动选择一个类型为's'的节点组Node Group,其名称前缀为“sys_single_group”。
    • 设置GUC参数single_node_table_strategy:
      • 当设置为ALLOW_DEFAULT_NON_PART时,支持隐式创建非分区表类型的单节点表。
      • 当设置为ALLOW_DEFAULT_ALL,既支持隐式创建非分区表类型的单节点表,也支持隐式创建一级分区表类型的单节点表。
    • 待创建表归属的Schema具有单节点属性,具体请参见设置Schema的单节点属性相关描述。

GUC参数的具体使用请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 单节点表”章节。

语法示例:
-- 显式创建单节点表。
gaussdb=# CREATE TABLE single_table(a int) DISTRIBUTE BY REPLICATION TO GROUP sys_single_group1;
CREATE TABLE

gaussdb=# \d+ single_table
                          Table "public.single_table"
 Column |  Type   | Modifiers | Storage | Stats target | Description 
--------+---------+-----------+---------+--------------+-------------
 a      | integer |           | plain   |              | 
Has OIDs: no
Distribute By: REPLICATION
Location Nodes: datanode1
Options: orientation=row, is_single_node=true, logical_repl_node=-1, compression=no, storage_type=USTORE, segment=off

-- 将GUC参数single_node_table_strategy设置为allow_default_all,详情请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 单节点表”章节。
-- 设置完成后,查看single_node_table_strategy的值是否为allow_default_all。
gaussdb=# SHOW single_node_table_strategy;
 single_node_table_strategy 
----------------------------
 allow_default_all
(1 row)

gaussdb=# CREATE SCHEMA schema1 SET NODE GROUP sys_single_group1;
CREATE SCHEMA

-- 隐式创建单节点表。
gaussdb=# CREATE TABLE schema1.single_table1(a int);
CREATE TABLE

gaussdb=# \d+ schema1.single_table1
                            Table "schema1.single_table1"
 Column |  Type   | Modifiers | Storage | Stats target | Description 
--------+---------+-----------+---------+--------------+-------------
 a      | integer |           | plain   |              | 
Has OIDs: no
Distribute By: REPLICATION
Location Nodes: datanode1
Options: orientation=row, is_single_node=true, logical_repl_node=-1, compression=no, storage_type=USTORE, segment=off

gaussdb=# DROP TABLE single_table;
DROP TABLE
gaussdb=# DROP TABLE schema1.single_table1;
DROP TABLE
gaussdb=# DROP SCHEMA schema1 CASCADE;
DROP SCHEMA

设置Schema的单节点属性

可通过以下方式进行设置Schema的单节点属性,不同的设置方式需满足不同条件:

  • 显式设置Schema的单节点属性
    在CREATE SCHEMA语句中,显式指定SET NODE GROUP group_name子句,且指定的节点组为系统预定义的单节点组Node Group(类型标识为's'),其名称需以“sys_single_group”为前缀进行命名。如下所示:
    CREATE SCHEMA schema1 SET NODE GROUP sys_single_group1;
  • 隐式设置Schema的单节点
    • 在CREATE SCHEMA语句中,未明确指定SET NODE GROUP group_name子句时,系统自动选择一个类型为's'的节点组Node Group,其名称前缀为“sys_single_group”。
    • 在普通用户下创建具有单节点属性的Schema,不支持在初始用户、具有运维/安全等管理员权限的用户下隐式设置Schema的单节点属性。
    • 设置GUC参数default_nodegroup的值为SCHEMA。
  • GUC参数的具体使用请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 单节点表”章节。
  • CREATE SCHEMA语法包含CREATE TABLE子句的复合SQL语句不支持单节点表相关功能,既不支持单节点表创建,也不支持模式设置单节点表属性。具体语法请参见《参考》中“SQL参考 > SQL语法 > C > CREATE SCHEMA”章节。
语法示例:
-- 创建模式,显式设置单节点属性。
gaussdb=# CREATE SCHEMA schema1 SET NODE GROUP sys_single_group1;
CREATE SCHEMA

gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |       16389
(1 row)

gaussdb=# DROP SCHEMA schema1 CASCADE;
DROP SCHEMA

gaussdb=# CREATE USER test_usr PASSWORD "********";
CREATE ROLE

gaussdb=# GRANT ALL ON DATABASE POSTGRES TO test_usr;
GRANT

-- 切换到test_usr用户。
-- 将GUC参数default_nodegroup设置为schema,详情请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 单节点表”章节。
-- 设置完成后,查看default_nodegroup的值是否为schema。
gaussdb=> SHOW default_nodegroup;
 default_nodegroup
----------------------------
 schema
(1 row)

-- 创建模式,隐式设置单节点属性。
gaussdb=> CREATE SCHEMA schema2;
CREATE SCHEMA

gaussdb=> SELECT * FROM pg_namespace WHERE nspname='schema2';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema2 |    16395 |           0 |        | n                 | f             |              |       16390
(1 row)

gaussdb=# DROP SCHEMA schema2 CASCADE;
DROP SCHEMA

修改Schema的单节点属性

  • 修改单节点属性需满足以下条件:
    在ALTER SCHEMA语句中,指定SET NODE GROUP group_name子句,且指定的节点组为系统预定义的单节点组Node Group(类型标识为's'),其名称需以“sys_single_group”为前缀进行命名。如下所示:
    ALTER SCHEMA schema1 SET NODE GROUP sys_single_group1;
  • 删除单节点属性需满足以下条件:

    ALTER SCHEMA语法指定DROP NODE GROUP子句。

语法示例:
gaussdb=# CREATE SCHEMA schema1;
CREATE SCHEMA

gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |            
(1 row)

-- 修改Schema的单节点属性。
gaussdb=# ALTER SCHEMA schema1 SET NODE GROUP sys_single_group1;
ALTER SCHEMA

gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |       16389
(1 row)

-- 删除Schema的单节点属性。
gaussdb=# ALTER SCHEMA schema1 DROP NODE GROUP;
ALTER SCHEMA

gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |            
(1 row)

gaussdb=# DROP SCHEMA schema1 CASCADE;
DROP SCHEMA

相关文档