暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T CREATE TABLE PARTITION

墨天轮 2019-10-12
1294

CREATE TABLE PARTITION

功能描述

创建分区表。

分区表是把逻辑上的一张表根据某种方案分为几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的,普通用户不可以创建系统用户对象。

背景信息

GaussDB 100支持范围分区(Range Partitioning)、哈希分区(Hash Partitioning)、列表分区(List Partitioning)、间隔分区(INTERVAL Partitioning)。

  • 范围分区是根据表的一列或者多列,将要插入表的记录分为若干个范围,这些范围在不同的分区里没有重叠。为每个范围创建一个分区,用来存储相应的数据。

    范围分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。这是最常用的分区策略。

  • 哈希分区是指,数据库根据哈希算法映射行到用户指定的分区键中。行的存放目的地由数据库的内部哈希函数来决定。哈希算法的目的是在设备上均匀分布行。
  • 列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。
  • 间隔分区策略:是范围分区的一种扩展。当插入记录时,如果可以映射到某一分区上,则把记录插入到对应的分区上,否则根据间隔分区策略自动创建分区,并把记录插入到新建的分区上。
分区可以提供若干好处:
  • 某些类型的查询性能可以得到极大提升。特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下,分区可以减少数据的搜索空间,提高数据访问效率。
  • 当查询或更新一个分区的大部分记录时,连续扫描那个分区而不是访问整个表可以获得巨大的性能提升。
  • 如果需要大量加载或者删除的记录位于单独的分区上,则可以通过直接读取或删除那个分区以获得巨大的性能提升。

注意事项

  • 如果是创建当前用户的表,用户需要被授予CREATE TABLE系统权限;如果是创建其他用户的表,用户需要被授予CREATE ANY TABLE系统权限,普通用户不可以创建系统用户对象。

创建分区表和创建普通表有所不同,存在一些不兼容的属性,如下:

  • 分区键不能超过16个字段。
  • 分区键支持如下数据类型:int、integer、bigint、number、decimal、real、double、numeric、varchar、varchar2、char、binary、raw、varbinary、date、datetime、timestamp。
  • 当前支持分区类型:RANGE、LIST、HASH、INTERVAL分区。
  • 间隔分区(INTERVAL)最多支持4194304个,如果分区总数超出4194304个,则报错。

语法格式

CREATE TABLE [ IF NOT EXISTS ][ schema_name. ]table_name [ relational_properties ] [ physical_properties ] [ TABLESPACE tablespace_name] [ table_properties ]
  • relational_properties 子句:

    AUTO_INCREMENT和DEFAULT不能同时使用。

    { column_name datatype_name [DEFAULT expr [ ON UPDATE expr ]] [ AUTO_INCREMENT ] [ COMMENT 'string' ] [ COLLATE collation_name ] [ inline_constraint ] | [ out_of_line_constraint ] } [ , ... ]
    • inline_constraint 子句:

      PRIMARY KEY和UNIQUE不能同时使用

      [ CONSTRAINT constraint_name ] { [ NOT ] NULL | UNIQUE | PRIMARY KEY | CHECK( expr ) | references_clause }[...]
      • references_clause 子句:
        REFERENCES [ schema_name. ]object_table_name ( column_name ) [ ON DELETE { CASCADE | SET NULL } ]
    • out_of_line_constraint 子句:
      [ CONSTRAINT constraint_name ] { UNIQUE( column_name [ , ... ] ) [ using_index_clause ] | PRIMARY KEY( column_name [ , ... ] ) [ using_index_clause ] | CHECK( expr ) | FOREIGN KEY( column_name [ , ... ] ) references_clause_ex }
      • using_index_clause 子句:
        USING INDEX [ INITRANS integer | TABLESPACE tablespace_name | LOCAL [ ( { PARTITION partition_name [ TABLESPACE tablespace_name | INITRANS integer | PCTFREE integer ] } [ , ... ] ) ] ] [ ...]
      • references_clause_ex 子句:
        REFERENCES [ schema_name. ]object_table_name ( column_name [ , ... ] ) [ ON DELETE { CASCADE | SET NULL } ]
  • physical_properties 子句:
    { segment_attributes_clause }
    • segment_attributes_clause 子句:
      { physical_attributes_clause | TABLESPACE tablespace_name } [ ... ]
      • physical_attributes_clause 子句:
        [ { PCTFREE integer | INITRANS integer } [ ...] ]
  • table_properties 子句:
    [ column_properties ] [ table_partitioning_clauses ] [ AUTO_INCREMENT [ = ] value ]
    • column_properties 子句:
      [ LOB_storage_clause ] [ APPENDONLY { ON | OFF } ]
      • LOB_storage_clause 子句:
        LOB ( LOB_item ) STORE AS { LOB_segname [ ( LOB_parameters ) ] }
        • LOB_parameters 子句:
          [ TABLESPACE tablespace_name | { ENABLE | DISABLE } STORAGE IN ROW ] [ ... ]
    • table_partitioning_clauses 子句:
      { range_partitioning | list_partitioning | hash_partitioning | interval_partitioning }
      • range_partitioning 子句:
        PARTITION BY RANGE ( partition_key [ , ... ] ) ( { PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } [ , ... ] ) [ TABLESPACE tablespace_name ] [physical_attributes_clause] } [ , ... ] )
      • list_partitioning 子句:
        PARTITION BY LIST ( partition_key [ , ... ] ) ( { PARTITION partition_name VALUES ( partition_value [ , ... ] |[ DEFAULT ] ) [ TABLESPACE tablespace_name ] [ physical_attributes_clause ] } [ , ... ] )
      • hash_partitioning 子句:
        PARTITION BY HASH ( partition_key [ , ... ] ) { ( { PARTITION partition_name [ TABLESPACE tablespace_name ] [ physical_attributes_clause ] } [ , ... ] ) | PARTITIONS partition_count [ STORE IN (tablespace_name [ , ... ]) ] }
      • interval_partitioning 子句:
        PARTITION BY RANGE ( partition_key ) INTERVAL ( interval_value ) ( { PARTITION partition_name VALUES LESS THAN ( partition_value ) [ TABLESPACE tablespace_name ] [ physical_attributes_clause ] } [ , ... ] )

参数说明

  • IF NOT EXISTS

    创建表时,如果表已经存在,则替换表;如果表不存在,则创建新表。

  • [schema_name.]table_name

    表名,不能和用户下表重名。

  • tablespace_name

    某个范围分区的表空间。

    指定分区表的某个范围分区的表空间。

  • relational_properties

    表属性,包括列名、类型、行内约束和行外约束。

  • DEFAULT expr [ON UPDATE expr]

    列默认值支持表达式,在创建DDL时,如果DEFAULT是常量表达式会向列类型做兼容检查。

    • [on update expr] 是参考MYSQL语法,UPDATE行数据,不指定该列,取update默认值填充。
    • insert和update default expr最大长度为1024英文字符长度,default后面的文本超过最大长度将会报错“GS-00611, default value string is too long, exceed 1024.”。
  • AUTO_INCREMENT

    指定自增列。

    • 如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,GaussDB 100将自动生成下一个序列编号。编号从1开始,并1为基数递增。
    • 把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。
    • 当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
    • 当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
    • 如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。
    • 自增列增长到0x7FFFFFFFFFFFFFFF,为防止出现溢出,自增值一直为0x7FFFFFFFFFFFFFFF。
  • COMMENT 'string'

    指定列的注释,通过USER_COL_COMMENTS系统视图查看。

  • COLLATE collation_name

    定义排序的规则。

    当比较两个列的数据时,根据定义的排序规则来确定哪个比较大或是否相等。

    collation_name取值如下:

    • UTF8_BIN:适用UTF8字符集,将所有字符看作二进制串,然后从最高位往最低位比对。区分大小写。
    • UTF8_GENERAL_CI:适用UTF8字符集,不区分大小写。
    • UTF8_UNICODE_CI:适用UTF8字符集,不区分大小写。
    • GBK_BIN:适用GBK字符集,区分大小写。
    • GBK_CHINESE_CI:适用GBK字符集,不区分大小写。
  • inline_constraint

    列约束,作为列定义的一部分,现支持[NOT] NULL、UNIQUE、PRIMARY KEY、唯一索引、外键、check约束。

  • [ NOT ] NULL

    是否允许该列值为空。

    • NOT NULL:不允许该列值为空。
    • NULL:允许该列值为空。
  • UNIQUE

    值唯一,允许为空,一个表可以多个列为UNIQUE。

  • PRIMARY KEY

    主键,建立索引,不能为空,一个表只能建立一个主键。

  • CHECK( expr )

    对列值校验。

  • references_clause

    添加外键约束。schema_name表示所参考表的所有者,object_table表示所参考的表。column_name表示所参考的字段。

    父表不指定列,默认取父表的主键,如果父表的主键不存在,则报错。

  • ON DELETE { CASCADE | SET NULL }

    该属性用于外键,参照外表发生删除时,本表级联变化。

    • CASCADE

      本表删除。

    • SET NULL

      本表设置为NULL。

  • out_of_line_constraint

    表约束,单独一行,支持UNIQUE索引、PRIMARY KEY、外键、CHECK约束。

  • FOREIGN KEY

    外键。

  • TABLESPACE tablespace_name

    指定表空间。

  • LOCAL

    默认属性,创建本地索引。

  • PCTFREE integer

    为一个块保留的空间百分比。当数据块的可用空间低于该空间百分比时,只能更新该数据块的数据,不能向该数据块插入新数据。取值范围是[8,80],默认值是10。

  • INITRANS

    初始化数据块中事务槽的个数。

  • table_properties

    指定表属性。

  • AUTO_INCREMENT [ = ] value

    建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。

    不指定从1开始,指定从value开始。

  • APPENDONLY { ON | OFF }
    • APPENDONLY ON表示不同的线程在对同一张表插入时,会申请新的page做插入,而不会去使用未插满的page。这种情况下,页面锁等待时长减少,但page空间浪费较多。
    • APPENDONLY OFF表示不同的线程在对同一张表插入时,会尽量插满page空间。这种情况下,等锁时间比较长。

    不指定时,默认为OFF。

  • LOB_storage_clause
    • LOB ( LOB_item ) STORE AS { [ ( LOB_parameters ) ]

      指定lob字段单独segment储存,可以指定线行内存储和行外存储。目前存储层只支持行外存储。

    • LOB_item

      lob字段名称。

    • LOB_parameters

      lob字段存储参数。

      {ENABLE | DISABLE } STORAGE IN ROW

      行内存储和行外存储。

      • ENABLE

        行内存储。

      • DISABLE

        行外存储。

  • range_partitioning

    范围分区。

  • partition_key

    分区键所在列的集合。分区键所在列中,单列的长度不能超过2000。

    分区键支持如下数据类型:

    int、integer、bigint、number、decimal、real、double、numeric、varchar、varchar2、char、binary、raw、varbinary、date、datetime、timestamp。

  • PARTITION

    分区表。

  • partition_name

    范围分区的名称。

  • VALUES LESS THAN

    范围分区的上边界关键字。

  • partition_value

    范围分区的上边界。

    每个分区都需要指定一个上边界。

    分区上边界的类型应当和分区键的类型一致。

    分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。

  • MAXVALUE

    一个关键字。

    在创建范围分区时可以使用。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。

    对于间隔分区策略,是不允许范围分区的上边界为MAXVALUE。

  • list_partitioning

    LIST分区,按照分区键值相同分区,单个分区的list个数不能超过500。

    DEFAULT

    指定default分区,如果插入的数据是default值,就会分配到default分区。

  • hash_partitioning

    创建HASH分区。创建时指定列,在该列上创建HASH分区。

    STORE IN

    hash分区存储的指定的表空间。

  • interval_partitioning

    创建间隔分区。

示例

  • 创建分区表employment_history,按照哈希分区。
    --删除表employment_history。 DROP TABLE IF EXISTS employment_history;
    --创建分区表employment_history,按照哈希分区。 create table employment_history ( staff_id NUMBER(6), start_date DATE, end_date DATE, employment_id VARCHAR2(10), section_id NUMBER(4) ) PARTITION BY HASH(start_date) PARTITIONS 2;
  • 创建分区表education,按照列表分区。
    --删除表education。 DROP TABLE IF EXISTS education;
    --创建分区表education,按照列表分区。 CREATE TABLE education(staff_id INT NOT NULL, higest_degree CHAR(8), graduate_school VARCHAR(64), graduate_date DATETIME, education_note VARCHAR(70)) PARTITION BY LIST(higest_degree) ( PARTITION doctor VALUES ('DOCTOR'), PARTITION master VALUES ('MASTER'), PARTITION undergraduate VALUES ('SCHOLAR') );
  • 创建分区表traning,按照范围分区。
    --删除表training。 DROP TABLE IF EXISTS training;
    --创建分区表training,按照范围分区。 CREATE TABLE training(staff_id INT NOT NULL, course_name CHAR(20), course_start_date DATETIME, course_end_date DATETIME, exam_date DATETIME, score INT) PARTITION BY RANGE(staff_id) ( PARTITION training1 VALUES LESS than(100), PARTITION training2 VALUES LESS than(200), PARTITION training3 VALUES LESS than(300), PARTITION training4 VALUES LESS than(MAXVALUE) );
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论