云数据库 GAUSSDB-CREATE TABLE SUBPARTITION:参数说明

时间:2024-01-23 20:08:50

参数说明

  • IF NOT EXISTS

    如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。

  • subpartition_table_name

    二级分区表的名称。

    取值范围:字符串,要符合标识符命名规范

  • column_name

    新表中要创建的字段名。

    取值范围:字符串,要符合标识符命名规范

  • data_type

    字段的数据类型。

  • COLLATE collation

    COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。

  • CONSTRAINT constraint_name

    列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。

    定义约束有两种方法:

    • 列约束:作为一个列定义的一部分,仅影响该列。
    • 表约束:不和某个列绑在一起,可以作用于多个列。

      在B模式数据库下(即sql_compatibility = 'B')constraint_name为可选项,在其他模式数据库下,必须加上constraint_name。

  • index_name

    索引名。

    • index_name仅在B模式数据库下(即sql_compatibility = 'B')支持,其他模式数据库下不支持。
    • 对于外键约束,constraint_name和index_name同时指定时,索引名为constraint_name。
    • 对于唯一键约束,constraint_name和index_name同时指定时,索引名以index_name。
  • USING method

    指定创建索引的方法。

    取值范围参考参数说明中的USING method。

    • USING method仅在B模式数据库下(即sql_compatibility = 'B')支持,其他模式数据库下不支持。
    • 在B模式下,未指定USING method时,对于ASTORE的存储方式,默认索引方法为btree;对于USTORE的存储方式,默认索引方法为ubtree。
  • ASC | DESC

    ASC表示指定按升序排序(默认)。DESC指定按降序排序。

    ASC|DESC只在B模式数据库下(即sql_compatibility = 'B')支持,其他模式数据库不支持。

  • LIKE source_table [ like_option ... ]

    LIKE子句声明一个表,新表自动从这个表里面继承所有字段名及其数据类型和非空约束。和INHERITS不同,新表与原来的表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。

    • 字段缺省表达式只有在声明了INCLUDING DEFAULTS之后才会包含进来。缺省是不包含缺省表达式的,即新表中所有字段的缺省值都是NULL。
    • 如果指定了INCLUDING GENERATED,则源表列的生成表达式会复制到新表中。默认不复制生成表达式。
    • 非空约束将总是复制到新表中,CHECK约束则仅在指定了INCLUDING CONSTRAINTS的时候才复制,而其他类型的约束则永远也不会被复制。此规则同时适用于表约束和列约束。
    • 和INHERITS不同,被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。
    • 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。
    • 如果指定了INCLUDING STORAGE,则源表列的STORAGE设置也将被拷贝,默认情况下不包含STORAGE设置。
    • 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释也会被拷贝过来。默认情况下,不拷贝源表的注释。
    • 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)也将拷贝至新表。默认情况下,不拷贝源表的存储参数。
    • INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。
  • AUTO_INCREMENT [ = ] value

    这个子句为自动增长列指定一个初始值,value必须为正整数,不得超过2127-1。

    该子句仅在参数sql_compatibility='B'时有效。

  • WITH ( storage_parameter [= value] [, ... ] )

    这个子句为表或索引指定一个可选的存储参数。参数的详细描述如下所示:

    • FILLFACTOR

      一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。在Ustore存储引擎下,该值得默认值为92,在Astore存储引擎下默认值为100(完全填充)。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。

      取值范围:10~100

    • ORIENTATION

      决定了表的数据的存储方式。

      取值范围:

      • COLUMN:表的数据将以列式存储。
      • ROW(缺省值):表的数据将以行式存储。

        orientation不支持修改。

    • STORAGE_TYPE

      指定存储引擎类型,该参数设置成功后就不再支持修改。

      取值范围:

      • USTORE,表示表支持Inplace-Update存储引擎。特别需要注意,使用USTORE表,必须要开启track_counts和track_activities参数,否则会引起空间膨胀。
      • ASTORE,表示表支持Append-Only存储引擎。

      默认值:

      不指定表时,默认是Inplace-Update存储。

    • COMPRESSION
      • 列存表的有效值为LOW/MIDDLE/HIGH/YES/NO,压缩级别依次升高,默认值为LOW。
      • 行存表不支持压缩。
    • MAX_BATCHROW

      指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。

      取值范围:10000~60000,默认60000。

    • PARTIAL_CLUSTER_ROWS

      指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。

      取值范围:大于等于MAX_BATCHROW,建议取值为MAX_BATCHROW的整数倍数。

    • DELTAROW_THRESHOLD

      预留参数。该参数只对列存表有效。

      取值范围:0~9999

    • segment

      使用段页式的方式存储。本参数仅支持行存表。不支持列存表、临时表、unlog表。不支持ustore存储引擎。

      取值范围:on/off

      默认值:off

  • COMPRESS / NOCOMPRESS

    创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。行存表不支持压缩。

    缺省值为NOCOMPRESS,即不对元组数据进行压缩。

  • TABLESPACE tablespace_name

    指定新表将要在tablespace_name表空间内创建。如果没有声明,将使用默认表空间。

  • PARTITION BY {RANGE [COLUMNS] | LIST [COLUMNS] | HASH | KEY} (partition_key)
    • 对于partition_key,分区策略的分区键仅支持1列。
    • 分区键支持的数据类型和一级分区表约束保持一致。
    • COLUMNS关键字只能在sql_compatibility='B'时使用,只能加在RANGE或LIST之后,“RANGE COLUMNS” 语义同 “RANGE”,“LIST COLUMNS” 语义同 “LIST”。
    • KEY关键字只能在sql_compatibility='B'时使用,KEY与HASH同义。
  • SUBPARTITION BY {RANGE | LIST | HASH | KEY} (subpartition_key)
    • 对于subpartition_key,分区策略的分区键仅支持1列。
    • 分区键支持的数据类型和一级分区表约束保持一致。
    • KEY关键字只能在sql_compatibility='B'时使用,KEY与HASH同义。
  • PARTITIONS integer

    指定分区个数。

    integer为分区数,必须为大于0的整数,且不得大于1048575。

    • 当在RANGE和LIST分区后指定此子句时,必须显式定义每个分区,且定义分区的数量必须与integer值相等。只能在sql_compatibility='B'时在RANGE和LIST分区后指定此子句。
    • 当在HASH和KEY分区后指定此子句时,若不列出各个分区定义,将自动生成integer个分区,自动生成的分区名为“p+数字”,数字依次为0到integer-1,分区的表空间默认为此表的表空间;也可以显式列出每个分区定义,此时定义分区的数量必须与integer值相等。若既不列出分区定义,也不指定分区数量,将创建唯一一个分区。
  • SUBPARTITIONS integer

    指定二级分区数量。

    integer为二级分区个数,必须为大于0的整数,且不得大于1048575。

    • 只能在HASH和KEY二级分区后指定此子句。
      • 若不列出各个二级分区定义,将在每个一级分区内自动生成integer个二级分区,自动生成的二级分区名为“一级分区名+sp+数字”,数字依次为0到integer-1,分区的表空间默认为此表的表空间。
      • 也可以列出每个二级分区定义,此时二级分区的数量必须与integer值相等。
      • 若既不列出每个二级分区定义,也不指定二级分区数量,将创建唯一一个二级分区。
  • { ENABLE | DISABLE } ROW MOVEMENT

    行迁移开关。

    如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。

    取值范围:

    • ENABLE(缺省值):行迁移开关打开。
    • DISABLE:行迁移开关关闭。

    在打开行迁移开关情况下,并发update、delete操作可能会报错,原因如下:

    update和delete操作对于旧数据都是标记为已删除。在打开行迁移开关情况下,如果更新分区键时,导致了跨分区更新,内核会把旧分区中旧数据标记为已删除,在新分区中新增加一条数据,无法通过旧数据找到新数据。

    在以下三个并发场景下,update和update并发、delete和delete并发和update和delete并发,如果并发操作同一行数据时,数据跨分区和非跨分区结果有不同的行为。

    1. 对于数据非跨分区结果,第一个操作执行完后,第二个操作不会报错。
      • 如果第一个操作是update,第二个操作能成功找到最新的数据,之后对新数据操作。
      • 如果第一个操作是delete,第二个操作看到当前数据已经被删除而且找不到最新数据,就终止操作。
    2. 对于数据跨分区结果,第一个操作执行完后,第二个操作会报错。
      • 如果第一个操作是update,由于新数据在新分区中,第二个操作不能成功找到最新的数据,就无法操作,之后会报错。
      • 如果第一个操作是delete,第二个操作看到当前数据已经被删除而且找不到最新数据,但无法判断删除旧数据的操作是update还是delete。如果是update,报错处理。如果是delete,终止操作。为了保持数据的正确性,只能报错处理。

    如果是update和update并发,update和delete并发场景,需要串行执行才能解决问题,如果是delete和delete并发,关闭行迁移开关可以解决问题。

  • NOT NULL

    字段值不允许为NULL。ENABLE用于语法兼容,可省略。

  • NULL

    字段值允许NULL ,这是缺省。

    这个子句只是为和非标准SQL数据库兼容。不建议使用。

  • CHECK (condition) [ NO INHERIT ]

    CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。

    声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。

    用NO INHERIT标记的约束将不会传递到子表中去。

    ENABLE用于语法兼容,可省略。

  • DEFAULT default_expr

    DEFAULT子句给字段指定缺省值。该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其他字段的交叉引用)。缺省表达式的数据类型必须和字段类型匹配。

    缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。

  • GENERATED ALWAYS AS ( generation_expr ) [STORED]

    该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation_expr计算得到,STORED表示像普通列一样存储生成列的值。

    • STORED关键字可省略,与不省略STORED语义相同。
    • 生成表达式不能以任何方式引用当前行以外的其他数据。生成表达式不能引用其他生成列,不能引用系统列。生成表达式不能返回结果集,不能使用子查询,不能使用聚集函数,不能使用窗口函数。生成表达式调用的函数只能是不可变(IMMUTABLE)函数。
    • 不能为生成列指定默认值。
    • 生成列不能作为分区键的一部分。
    • 生成列不能和ON UPDATE约束字句的CASCADE,SET NULL,SET DEFAULT动作同时指定。生成列不能和ON DELETE约束字句的SET NULL,SET DEFAULT动作同时指定。
    • 修改和删除生成列的方法和普通列相同。删除生成列依赖的普通列,生成列被自动删除。不能改变生成列所依赖的列的类型。
    • 生成列不能被直接写入。在INSERT或UPDATE命令中,不能为生成列指定值,但是可以指定关键字DEFAULT。
    • 生成列的权限控制和普通列一样。
    • 列存表不支持生成列。
  • AUTO_INCREMENT

    指定列为自动增长列。

    详见:•AUTO_INCREMENT

  • UNIQUE [KEY] index_parameters

    UNIQUE ( column_name [, ... ] ) index_parameters

    UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。

    对于唯一约束,NULL被认为是互不相等的。

    UNIQUE KEY只能在sql_compatibility='B'时使用,与UNIQUE语义相同。

  • PRIMARY KEY index_parameters

    PRIMARY KEY ( column_name [, ... ] ) index_parameters

    主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值。

    一个表只能声明一个主键。

  • DEFERRABLE | NOT DEFERRABLE

    这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。缺省是NOT DEFERRABLE。目前,UNIQUE约束、主键约束、外键约束可以接受这个子句。所有其他约束类型都是不可推迟的。

  • INITIALLY IMMEDIATE | INITIALLY DEFERRED

    如果约束是可推迟的,则这个子句声明检查约束的缺省时间。

    • 如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行之后就立即检查它;
    • 如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它。

    约束检查的时间可以用SET CONSTRAINTS命令修改。

  • USING INDEX TABLESPACE tablespace_name

    为UNIQUE或PRIMARY KEY约束相关的索引声明一个表空间。如果没有提供这个子句,这个索引将在default_tablespace中创建,如果default_tablespace为空,将使用数据库的缺省表空间。

support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-0562.html