华为云用户手册

  • 列表分区 --创建列表分区表。 CREATE TABLE test_list ( NAME VARCHAR ( 50 ), area VARCHAR ( 50 ) ) PARTITION BY LIST (area) ( PARTITION p1 VALUES ('Beijing'), PARTITION p2 VALUES ('Shanghai'), PARTITION p3 VALUES ('Guangzhou'), PARTITION p4 VALUES ('Shenzhen'), PARTITION pdefault VALUES (DEFAULT) ); --插入数据。 INSERT INTO test_list VALUES ('bob', 'Shanghai'),('scott', 'Sichuan'); --查询分区数据。 SELECT * FROM test_list PARTITION (p2); name | area ------+---------- bob | Shanghai (1 row) SELECT * FROM test_list PARTITION (pdefault); name | area -------+--------- scott | Sichuan (1 row) --删除。 DROP TABLE test_list;
  • 参数说明 IF NOT EXISTS 如果已经存在相同名称的表,不抛出错误,而是发出一个notice,告知表已存在。 partition_table_name 分区表的名称。 取值范围:字符串,要符合标识符命名规范。 column_name 新表中要创建的字段名。 取值范围:字符串,要符合标识符命名规范。 data_type 字段的数据类型。 COLLATE collation COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“SELECT * FROM pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 CONSTRAINT constraint_name 列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。排序规则可以使用“SELECT * FROM pg_collation”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 定义约束有两种方法: 列约束:作为一个列定义的一部分,仅影响该列。 表约束:不和某个列绑在一起,可以作用于多个列。 LIKE source_table [ like_option ... ] LIKE子句声明一个表,新表自动从这个表里面继承所有字段名及其数据类型和非空约束。 新表与原表之间在创建动作完毕之后是完全无关的。在原表做的任何修改都不会传播到新表中,并且也不可能在扫描原表的时候包含新表的数据。 字段缺省表达式只有在声明了INCLUDING DEFAULTS之后才会包含进来。缺省是不包含缺省表达式的,即新表中所有字段的缺省值都是NULL。 非空约束将总是复制到新表中,CHECK约束则仅在指定了INCLUDING CONSTRAINTS的时候才复制,而其他类型的约束则永远也不会被复制。此规则同时适用于表约束和列约束。 被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。 如果指定了INCLUDING UPDATE,则原表列的ON UPDATE CURRENT_TIMESTAMP属性会复制到新表列中。默认不复制该属性。 如果指定了INCLUDING INDEXES,则原表上的索引也将在新表上创建,默认不建立索引。 如果指定了INCLUDING STORAGE,则原表列的STORAGE设置也将被复制,默认情况下不包含STORAGE设置。 如果指定了INCLUDING COMMENTS,则原表列、约束和索引的注释也会被复制过来。默认情况下,不复制原表的注释。 如果指定了INCLUDING RELOPTIONS,则原表的存储参数(即源表的WITH子句)也将复制至新表。默认情况下,不复制原表的存储参数。 如果指定了INCLUDING DISTRIBUTION,则新表将复制原表的分布信息,包括分布类型和分布列,同时新表将不能再使用DISTRIBUTE BY子句。默认情况下,不复制原表的分布信息。 如果指定了INCLUDING ILM,则源表的ILM策略信息会被复制到新表中,如果需要同时复制源表上的分区对象的ILM策略信息,需要同时指定INCLUDING PARTITION。 INCLUDING ALL是INCLUDING DEFAULTS、INCLUDING UPDATE、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING RELOPTIONS、INCLUDING DISTRIBUTION和INCLUDING ILM的简写形式。 CREATE TABLE table_name LIKE source_table;语法仅在MYSQL模式数据库(即sql_compatibility = 'MYSQL')下,且参数b_format_version值为5.7、b_format_dev_version值为s2时支持。 在MYSQL模式数据库下,且参数b_format_version值为5.7、b_format_dev_version值为s2时,不支持指定INCLUDING和EXCLUDING选项,缺省等同于指定INCLUDING ALL。 AUTO_INCREMENT [ = ] value 这个子句为自动增长列指定一个初始值,value必须为正数,不得超过2127-1。 该子句仅在参数sql_compatibility='MYSQL'时有效。 COMMENT [ = ] 'string' COMMENT [ = ] 'string'子句表示给表添加注释。 在column_constraint中的COMMENT 'string'表示给列添加注释。 在table_constraint中的COMMENT 'string'表示给主键和唯一键对应的索引添加注释。 具体请参见:COMMENT [ = ] 'string' CHARACTER SET | CHARSET charset 指定表字段的字符集。单独指定时会将字段的字符序设置为指定的字符集的默认字符序。 仅在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持该语法,其他模式数据库不支持。 COLLATE collation COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“SELECT * FROM pg_collation”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。对于MYSQL模式数据库下(即sql_compatibility = 'MYSQL')还支持utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci、binary、gbk_chinese_ci、gbk_bin、gb18030_chinese_ci、gb18030_bin字符序。 WITH ( storage_parameter [= value] [, ... ] ) 这个子句为表或索引指定一个可选的存储参数。参数的详细描述如下所示: FILLFACTOR 一个表的填充因子(fillfactor)是一个介于10~100之间的数字。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。 取值范围:10~100 ORIENTATION 决定了表的数据的存储方式。 取值范围: ROW(缺省值):表的数据将以行式存储。 orientation不支持修改。 STORAGE_TYPE 指定存储引擎类型,该参数设置成功后就不再支持修改。 取值范围: USTORE,表示表支持Inplace-Update存储引擎。特别需要注意,使用USTORE表,必须要开启track_counts和track_activities参数,否则会引起空间膨胀。 ASTORE,表示表支持Append-Only存储引擎。 默认值: 不指定时,由参数enable_default_ustore_table决定存储引擎方式,默认是Inplace-Update存储。 COMPRESSION 该参数仅支持列存压缩。 statistic_granularity 记录该表在分析统计信息时的默认partition_mode,partition_mode说明详见ANALYZE | ANALYSE参数说明,此参数对非分区表设置无效。 取值范围:见partition_mode取值范围。 默认值:AUTO。 autovacuum_enabled 自动清理功能是否对该表启用。 取值范围:on/off 默认值:on autovacuum_vacuum_threshold 自动清理功能中,指定在该表中触发VACUUM所需的更新或删除的最小元组数(仅对Astore表生效)。 取值范围:0~2147483647 默认值:-1,缺省时与GUC参数autovacuum_vacuum_threshold一致。 autovacuum_analyze_threshold 自动清理功能中,指定在该表中触发ANALYZE所需的插入、更新或删除的最小元组数。 取值范围:0~2147483647 默认值:-1,缺省时与GUC参数autovacuum_analyze_threshold一致。 autovacuum_vacuum_scale_factor 自动清理功能中,指定在该表中触发VACUUM所需的插入、更新或删除元组的比例(仅对Astore表生效)。 取值范围:0.0~100.0 默认值:-1,缺省时与GUC参数autovacuum_vacuum_scale_factor一致。 autovacuum_analyze_scale_factor 自动清理功能中,指定在该表中触发ANALYZE所需的插入、更新或删除元组的比例。 取值范围:0.0~100.0 默认值:-1,缺省时与GUC参数autovacuum_analyze_scale_factor一致。 autovacuum_freeze_min_age 自动清理功能中,指定在该表参数指定了一个行版本的最小年龄,超过这个年龄的行才会被冻结。 取值范围:0~1000000000 默认值:-1,缺省时与GUC参数vacuum_freeze_min_age一致。 autovacuum_freeze_max_age 自动清理功能中,该表pg_class.relfrozenxid字段在超过多少个事务后,就会强制执行VACUUM操作。即使自动清理被禁用,系统也会启动AUTOVACUUM进程。清理操作还允许从pg_clog/子目录中删除旧文件(仅对ASTORE表生效)。 取值范围:100000~2000000000 默认值:-1,缺省时与GUC参数autovacuum_freeze_max_age一致。 autovacuum_freeze_table_age 自动清理功能中,该表被标记为不需要自动清理时,将保持不变的时间。(仅对Astore表生效)。 取值范围:0~2000000000 默认值:-1,缺省时与GUC参数vacuum_freeze_table_age一致。 hashbucket 创建hash bucket存储。本参数仅支持行存表和行存range表。 取值范围:on/off 默认值:off 当前版本hashbucket表相关DDL操作性能受限,不建议频繁对hashbucket表进行DDL操作。 TABLESPACE tablespace_name 指定新表将要在tablespace_name表空间内创建。如果没有声明,将使用默认表空间。 DISTRIBUTE BY 指定表如何在节点之间分布或者复制。 取值范围及详细信息见•DISTRIBUTE BY一节。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } TO GROUP指定创建表所在的Node Group用。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 PARTITION BY RANGE [COLUMNS] (partition_key) 创建范围分区。partition_key为分区键的名称。 COLUMNS关键字只能在sql_compatibility='MYSQL'时使用,“PARTITION BY RANGE COLUMNS” 语义同 “PARTITION BY RANGE”。 (1)对于从句是VALUES LESS THAN的语法格式: 对于从句是VALUE LESS THAN的语法格式,范围分区策略的分区键最多支持16列。 该情形下,分区键支持的数据类型为:TINYINT、SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、FLOAT4、FLOAT8、DOUBLE PRECISION、CHARACTER VARYING(n)、VARCHAR(n)、CHARACTER(n)、CHAR(n)、CHARACTER、CHAR、TEXT、NVARCHAR2、NAME、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。 (2)对于从句是START END的语法格式: 对于从句是START END的语法格式,范围分区策略的分区键仅支持1列。 该情形下,分区键支持的数据类型为:TINYINT、SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、FLOAT4、FLOAT8、DOUBLE PRECISION、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。 PARTITION partition_name VALUES LESS THAN {( { partition_value | MAXVALUE } [,...] ) | MAXVALUE } 指定各分区的信息。partition_name为范围分区的名称。partition_value为范围分区的上边界,取值依赖于partition_key的类型。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。 每个分区都需要指定一个上边界。 分区上边界的类型应当和分区键的类型一致。 分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。 不在括号内的MAVALUE只能在sql_compatibility='MYSQL'时使用,并且只能有一个分区键。 PARTITION partition_name {START (partition_value) END (partition_value) EVERY (interval_value)} | {START (partition_value) END (partition_value|MAXVALUE)} | {START(partition_value)} | {END (partition_value | MAXVALUE)} 指定各分区的信息,各参数意义如下: partition_name:范围分区的名称或名称前缀,除以下情形外(假定其中的partition_name是p1),均为分区的名称。 若该定义是START+END+EVERY从句,则语义上定义的分区的名称依次为p1_1, p1_2, ...。例如对于定义“PARTITION p1 START(1) END(4) EVERY(1)”,则生成的分区是:[1, 2), [2, 3) 和 [3, 4),名称依次为p1_1, p1_2和p1_3,即此处的p1是名称前缀。 若该定义是第一个分区定义,且该定义有START值,则范围(MINVALUE, START)将自动作为第一个实际分区,其名称为p1_0,然后该定义语义描述的分区名称依次为p1_1, p1_2, ...。例如对于完整定义“PARTITION p1 START(1), PARTITION p2 START(2)”,则生成的分区是:(MINVALUE, 1), [1, 2) 和 [2, MAXVALUE),其名称依次为p1_0, p1_1和p2,即此处p1是名称前缀,p2是分区名称。这里MINVALUE表示最小值。 partition_value:范围分区的端点值(起始或终点),取值依赖于partition_key的类型,不可是MAXVALUE。 interval_value:对[START,END) 表示的范围进行切分,interval_value是指定切分后每个分区的宽度,不可是MAXVALUE;如果(END-START)值不能整除以EVERY值,则仅最后一个分区的宽度小于EVERY值。 MAXVALUE:表示最大值,它通常用于设置最后一个范围分区的上边界。 在创建分区表若第一个分区定义含START值,则范围(MINVALUE,START)将自动作为实际的第一个分区。 START END语法需要遵循以下限制: 每个partition_start_end_item中的START值(如果有的话,下同)必须小于其END值; 相邻的两个partition_start_end_item,第一个的END值必须等于第二个的START值; 每个partition_start_end_item中的EVERY值必须是正向递增的,且必须小于(END-START)值; 每个分区包含起始值,不包含终点值,即形如:[起始值,终点值),起始值是MINVALUE时则不包含; 一个partition_start_end_item创建的每个分区所属的TABLESPACE一样; partition_name作为分区名称前缀时,其长度不要超过57字节,超过时自动截断; 在创建、修改分区表时请注意分区表的分区总数不可超过最大限制(1048575); 在创建分区表时START END与LESS THAN语法不可混合使用。 即使创建分区表时使用START END语法,备份(gs_dump)出的SQL语句也是VALUES LESS THAN语法格式。 PARTITION BY LIST [COLUMNS] (partition_key) 创建列表分区。partition_key为分区键的名称。 COLUMNS关键字只能在sql_compatibility='MYSQL'时使用,“PARTITION BY LIST COLUMNS” 语义同 “PARTITION BY LIST”。 对于partition_key,列表分区策略的分区键最多支持16列。 对于从句是VALUES [IN] (list_values)的语法格式,list_values中包含了对应分区存在的键值,每个分区的键值数量不超过64个。 从句"VALUES IN"只能在sql_compatibility='MYSQL'时使用,语义同"VALUES"。 分区键支持的数据类型为:TINYINT、SMALLINT、INTEGER、BIGINT、NUMERIC、VARCHAR(n)、CHAR、BPCHAR、NVARCHAR2、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。分区个数不能超过1048575个。 PARTITION BY HASH(partition_key) 创建哈希分区。partition_key为分区键的名称。 对于partition_key,哈希分区策略的分区键仅支持1列。 分区键支持的数据类型为:TINYINT、SMALLINT、INTEGER、BIGINT、NUMERIC、VARCHAR(n)、CHAR、BPCHAR、TEXT、NVARCHAR2、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。分区个数不能超过1048575个。 PARTITIONS integer 指定分区个数。 integer为分区数,必须为大于0的整数,且不得大于1048575。 当在RANGE和LIST分区后指定此子句时,必须显式定义每个分区,且定义分区的数量必须与integer值相等。只能在sql_compatibility='MYSQL'时在RANGE和LIST分区后指定此子句。 当在HASH和KEY分区后指定此子句时,若不列出各个分区定义,将自动生成integer个分区,自动生成的分区名为“p+数字”,数字依次为0到integer-1,分区的表空间默认为此表的表空间;也可以显式列出每个分区定义,此时定义分区的数量必须与integer值相等。若既不列出分区定义,也不指定分区数量,将创建唯一一个分区。 { ENABLE | DISABLE } ROW MOVEMENT 行迁移开关。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 取值范围: ENABLE:行迁移开关打开。 DISABLE(缺省值):行迁移开关关闭。 在打开行迁移开关情况下,并发UPDATE、DELETE操作可能会报错,原因如下: UPDATE和DELETE操作对于旧数据都是标记为已删除。在打开行迁移开关情况下,如果更新分区键时,导致了跨分区更新。内核会把旧分区中旧数据标记为已删除,在新分区中新增加一条数据,无法通过旧数据找到新数据。 在UPDATE和UPDATE并发、DELETE和DELETE并发、UPDATE和DELETE并发三个并发场景下,如果并发操作同一行数据时,数据跨分区和非跨分区结果有不同的行为。 对于数据非跨分区结果,第一个操作执行完后,第二个操作不会报错。 如果第一个操作是UPDATE,第二个操作能成功找到最新的数据,之后对新数据操作。 如果第一个操作是DELETE,第二个操作看到当前数据已经被删除而且找不到最新数据,就终止操作。 对于数据跨分区结果,第一个操作执行完后,第二个操作会报错。 如果第一个操作是UPDATE,由于新数据在新分区中,第二个操作不能成功找到最新的数据,就无法操作,之后会报错。 如果第一个操作是DELETE,第二个操作看到当前数据已经被删除而且找不到最新数据,但无法判断删除旧数据的操作是UPDATE还是DELETE。如果是UPDATE,报错处理。如果是DELETE,终止操作。为了保持数据的正确性,只能报错处理。 如果是UPDATE和UPDATE并发,UPDATE和DELETE并发场景,需要串行执行才能解决问题,如果是DELETE和DELETE并发,关闭行迁移开关可以解决问题。
  • 注意事项 唯一约束和主键约束的约束键包含所有分区键将为约束创建LOCAL索引,否则创建GLOBAL索引。 目前哈希分区仅支持单列构建分区键,暂不支持多列构建分区键。 对于分区表PARTITION FOR (values)语法,values只能是常量。 对于分区表PARTITION FOR (values)语法,values在需要数据类型转换时,建议使用强制类型转换,以防隐式类型转换结果与预期不符。 分区数最大值为1048575个,一般情况下业务不可能创建这么多分区,这样会导致内存不足。应参照参数local_syscache_threshold的值合理创建分区,分区表使用内存大致为(分区数 * 3 / 1024)MB。理论上分区占用内存不允许大于local_syscache_threshold的值,同时还需要预留部分空间以供其他功能使用。 考虑性能影响,一般建议单表最大分区数不超过2000,子分区数 *(LOCAL索引个数 + 1) 不超过10000。 当分区数太多导致内存不足时,会间接导致性能急剧下降。 指定分区语句目前不能走全局索引扫描。 不支持XML类型数据作为分区键、二级分区键。 对于分区表进行UPDATE/DELETE时,如果生成的计划不是FQS或Stream计划,语句执行效率会比较差。建议排查语句,消除不可下推因素,从而生成FQS或Stream计划。 在为数据对象增加或者变更ILM策略的时候,如果追加了行级表达式,需要注意行表达式目前只支持白名单中列出的函数。具体白名单函数列表参考行表达式函数白名单。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE TABLE [ IF NOT EXISTS ] partition_table_name { ( [ { column_name data_type [ CHARACTER SET | CHARSET charset ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] } [, ... ] ] ) | LIKE source_table } [ table_option [ [ , ] ... ] ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER n { day | month | year } OF NO MODIFICATION [ ON ( EXPR )]] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY { REPLICATION | HASH ( column_name [, ...] ) | MURMURHASH ( diskey_expr ) | RANGE ( column_name [, ...] ) { SLICE REFEREN CES tablename | ( slice_less_than_item [, ...] ) | ( slice_start_end_item [, ...] ) } | LIST ( column_name [, ...] ) { SLICE REFERENCES tablename | ( slice_values_item [, ...] ) } } ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] PARTITION BY { {RANGE [COLUMNS] (partition_key) [ PARTITIONS integer ] ( partition_less_than_item [, ... ] )} | {RANGE [COLUMNS] (partition_key) [ PARTITIONS integer ] ( partition_start_end_item [, ... ] )} | {LIST [COLUMNS] (partition_key) [ PARTITIONS integer ] ( PARTITION partition_name VALUES [IN] (list_values) [ ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER n { day | month | year } OF NO MODIFICATION [ ON ( EXPR )]] [TABLESPACE [=] tablespace_name][, ... ])} | { HASH (partition_key) [ PARTITIONS integer ] ( PARTITION partition_name [ ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER n { day | month | year } OF NO MODIFICATION [ ON ( EXPR )]] [TABLESPACE [=] tablespace_name][, ... ])} } [ { ENABLE | DISABLE } ROW MOVEMENT ]; 其中table_option为: { COMMENT [ = ] 'string' | AUTO_INCREMENT [ = ] value | [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset | [ DEFAULT ] COLLATE [ = ] default_collation } 列约束column_constraint: 1 2 3 4 5 6 7 8 9 10 11 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | AUTO_INCREMENT | COMMENT 'string' | DEFAULT default_expr | ON UPDATE update_expr | UNIQUE [KEY] [ index_parameters ] | PRIMARY KEY [ index_parameters] } [ DEFERRABLE | NOT DEFERRABLE ][ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 表约束table_constraint: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ index_name ] [ USING method ] ( { column_name [ ASC | DESC ] } [, ... ] ) [ index_parameters ] | PRIMARY KEY ( column_name [, ... ] ) [ index_parameters]} [ DEFERRABLE | NOT DEFERRABLE ][ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] { [ COMMENT 'string' ] [ ... ] } like选项like_option: 1 { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS | DISTRIBUTION | UPDATE | ILM | ALL } 索引存储参数index_parameters: 1 2 [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ]
  • 功能描述 创建分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。 常见的分区方案有范围分区(Range Partitioning)、间隔分区(Interval Partitioning)、哈希分区(Hash Partitioning)、列表分区(List Partitioning)、数值分区(Value Partitioning)等。目前行存表支持范围分区、哈希分区、列表分区。 范围分区是根据表的一列或者多列,将要插入表的记录分为若干个范围,这些范围在不同的分区里没有重叠。为每个范围创建一个分区,用来存储相应的数据。 范围分区的分区策略是指记录插入分区的方式。 范围分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。这是最常用的分区策略。 哈希分区是根据表的一列,为每个分区指定模数和余数,将要插入表的记录划分到对应的分区中,每个分区所持有的行都需要满足条件:分区键的值除以为其指定的模数将产生为其指定的余数。 哈希分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则返回报错和提示信息。 列表分区是根据表的一列,将要插入表的记录通过每一个分区中出现的键值划分到对应的分区中,这些键值在不同的分区里没有重叠。为每组键值创建一个分区,用来存储相应的数据。 列表分区策略:根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。 分区可以提供若干好处: 某些类型的查询性能可以得到极大提升。特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下。分区可以减少数据的搜索空间,提高数据访问效率。 当查询或更新一个分区的大部分记录时,连续扫描该分区而不是访问整个表可以获得巨大的性能提升。 如果需要大量加载或者删除的记录位于单独的分区上,则可以通过直接读取或删除该分区以获得巨大的性能提升,同时还可以避免由于大量DELETE导致的VACUUM超载(哈希分区不支持删除分区)。
  • PG_THREAD_WAIT_STATUS 通过PG_THREAD_WAIT_STATUS视图可以检测当前实例中工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况。具体字段信息如表1所示。 表1 PG_THREAD_WAIT_STATUS字段 名称 类型 描述 node_name text 当前节点的名称。 db_name text 数据库名称。 thread_name text 线程名称。 query_id bigint 查询id,对应debug_query_id。 tid bigint 当前线程的线程号。 sessionid bigint 当前会话id。 lwtid integer 当前线程的轻量级线程号。 psessionid bigint 父会话ID。 tlevel integer streaming线程的层级。 smpid integer 并行线程的id。 wait_status text 当前线程的等待状态。等待状态的详细信息请参见表2。 wait_event text 如果wait_status是acquire lock、acquire lwlock、wait io三种类型,此列描述具体的锁、轻量级锁、I/O的信息。否则是空。 locktag text 当前线程正等待获取的锁的信息。 lockmode text 当前线程正等待获取的锁的模式。包含表级锁、行级锁、页级锁下的各模式。 block_sessionid bigint 阻塞当前线程获取锁的会话标识。 global_sessionid text 全局会话id。 wait_status列的等待状态如表2所示。 表2 等待状态列表 wait_status值 含义 none 没在等任意事件。 acquire lock 等待加锁,要么加锁成功,要么加锁等待超时。 acquire lwlock 等待获取轻量级锁。 wait io 等待I/O完成。 wait cmd 等待完成读取网络通信包。 wait pooler get conn 等待pooler完成获取连接。 wait pooler abort conn 等待pooler完成终止连接。 wait pooler clean conn 等待pooler完成清理连接。 pooler create conn: [nodename], total N 等待pooler建立连接,当前正在与nodename指定节点建立连接,且仍有N个连接等待建立。 get conn 获取到其他节点的连接。 set cmd: [nodename] 在连接上执行SET/RESET/TRANSACTION BLOCK LEVEL PARA SET/SESSION LEVEL PARA SET,当前正在nodename指定节点上执行。 cancel query 取消某连接上正在执行的SQL语句。 stop query 停止某连接上正在执行的查询。 wait node: [nodename](plevel), total N, [phase] 等待接收与某节点的连接上的数据,当前正在等待nodename节点plevel线程的数据,且仍有N个连接的数据待返回。如果状态包含phase信息,则可能的阶段状态有: begin:表示处于事务开始阶段。 commit:表示处于事务提交阶段。 rollback:表示处于事务回滚阶段。 wait transaction sync: xid 等待xid指定事务同步。 wait wal sync 等待特定LSN的wal log完成到备机的同步。 wait data sync 等待完成数据页到备机的同步。 wait data sync queue 等待把行存的数据页放入同步队列。 flush data: [nodename](plevel), [phase] 等待向网络中nodename指定节点的plevel对应线程发送数据。如果状态包含phase信息,则可能的阶段状态为wait quota,即当前通信流正在等待quota值。 stream get conn: [nodename], total N 初始化stream flow时,等待与nodename节点的consumer对象建立连接,且当前有N个待建连对象。 wait producer ready: [nodename](plevel), total N 初始化stream flow时,等待每个producer都准备好,当前正在等待nodename节点plevel对应线程的producer对象准备好,且仍有N个producer对象处于等待状态。 synchronize quit stream plan结束时,等待stream线程组内的线程统一退出。 nodegroup destroy stream plan结束时,等待销毁stream node group。 wait active statement 等待作业执行,正在资源负载管控中。 gtm connect 等待与GTM建连。 gtm get gxid 等待从GTM获取事务xid。 gtm get snapshot 等待从GTM获取事务快照snapshot。 gtm begin trans 等待GTM开始事务。 gtm commit trans 等待GTM提交事务。 gtm rollback trans 等待GTM执行事务回滚。 gtm start prepare trans 等待GTM开始两阶段事务的prepare阶段。 gtm prepare trans 等待GTM完成两阶段事务的prepare阶段。 gtm open sequence 等待GTM打开sequence。 gtm close sequence 等待GTM关闭sequence。 gtm create sequence 等待GTM创建sequence。 gtm alter sequence 等待GTM修改sequence。 gtm get sequence val 等待从GTM获取sequence的下一个值。 gtm set sequence val 等待GTM设置sequence的值。 gtm drop sequence 等待GTM删除sequence。 gtm rename sequence 等待GTM重命名sequence。 analyze: [relname], [phase] 当前正在对表relname执行analyze。如果状态包含phase信息,则为autovacuum,表示是数据库自动开启AutoVacuum线程执行的analyze分析操作。 vacuum: [relname], [phase] 当前正在对表relname执行vacuum。如果状态包含phase信息,则为autovacuum,表示是数据库自动开启AutoVacuum线程执行的vacuum清理操作。 vacuum full: [relname] 当前正在对表relname执行vacuum full清理。 create index 当前正在创建索引。 HashJoin - [ build hash | write file ] 当前是HashJoin算子,主要关注耗时的执行阶段。 build hash:表示当前HashJoin算子正在建立哈希表。 write file:表示当前HashJoin算子正在将数据写入磁盘。 HashAgg - [ build hash | write file ] 当前是HashAgg算子,主要关注耗时的执行阶段。 build hash:表示当前HashAgg算子正在建立哈希表。 write file:表示当前HashAgg算子正在将数据写入磁盘。 HashSetop - [build hash | write file ] 当前是HashSetop算子,主要关注耗时的执行阶段。 build hash:表示当前HashSetop算子正在建立哈希表。 write file:表示当前HashSetop算子正在将数据写入磁盘。 Sort | Sort - [fetch tuple | write file] 当前是Sort算子做排序,fetch tuple表示Sort算子正在获取tuple,write file表示Sort算子正在将数据写入磁盘。 Material | Material - write file 当前是Material算子,write file表示Material算子正在将数据写入磁盘。 standby read recovery conflict 备机只读与日志回放产生冲突。 standby get snapshot 备机只读获取快照。 prune table 等待堆表清理历史删除数据。 prune index 等待索引清理历史删除数据。 vacuum gpi 等待gpi索引清理历史删除数据。 gtm reset xmin 等待gtm重置xmin。 gtm get xmin 等待从gtm获取xmin。 gtm get csn 等待从gtm获取csn。 gtm start preprare trans 等待gtm启动二阶段事务。 gtm rename sequence 等待gtm重命名sequence。 wait reserve td 等待分配ustore事务槽。 wait td rollback 等待ustore事务槽回滚。 wait available td 等待ustore可用的事务槽。 wait transaction rollback 等待事务回滚。 gtm set disaster cluster 等待在gtm设置容灾集群信息。 gtm get disaster cluster 等待从gtm获取容灾集群信息。 gtm del disaster cluster 等待在gtm删除容灾集群信息。 gtm set consistency point 等待在gtm设置一致性点。 wait sync bgworkers 等待并行创建索引的子线程完成本地扫描和排序。 wait gs_sleep 等待服务器线程延迟时间。 wait vacuum delay 等待vacuum延迟时间。 wait seq scan seq scan执行时间。 wait index scan index scan执行时间。 wait checkpoint start checkpoint开始阶段时间。 wait checkpoint done checkpoint结束阶段时间。 wait xact start command xact开始时间。 wait xact commit command xact提交时间。 wait io control 等待作业执行,正在I/O管控中。 security audit write pipe 等待将审计日志写入管道。 当wait_status为acquire lwlock、acquire lock或wait io时,表示有等待事件。正在等待获取wait_event列对应类型的轻量级锁、事务锁或者正在进行I/O操作。 其中,wait_status值为acquire lwlock(轻量级锁)时对应的wait_event等待事件类型与描述信息如表3所示。(wait_event为extension时,表示此时的轻量级锁是动态分配的锁,未被监控。) 表3 轻量级锁等待事件列表 wait_event类型 类型描述 ShmemIndexLock 用于保护共享内存中的主索引哈希表。 OidGenLock 用于避免不同线程产生相同的OID。 XidGenLock 用于避免两个事务获得相同的xid。 ProcArrayLock 用于避免并发访问或修改ProcArray共享数组。 SInvalReadLock 用于避免与清理失效消息并发执行。 SInvalWriteLock 用于避免与其它写失效消息、清理失效消息并发执行。 WALInsertLock 用于避免与其它WAL插入操作并发执行。 WALWriteLock 用于避免并发WAL写盘。 ControlFileLock 用于避免pg_control文件的读写并发、写写并发。 CheckpointLock 用于避免多个checkpoint并发执行。 CLogControlLock 用于避免并发访问或者修改Clog控制数据结构。 SubtransControlLock 用于避免并发访问或者修改子事务控制数据结构。 MultiXactGenLock 用于串行分配唯一MultiXact id。 MultiXactOffsetControlLock 用于避免对pg_multixact/offset的写写并发和读写并发。 MultiXactMemberControlLock 用于避免对pg_multixact/members的写写并发和读写并发。 RelCacheInitLock 用于失效消息场景对init文件进行操作时加锁。 CheckpointerCommLock 用于向checkpointer发起文件刷盘请求场景,需要串行的向请求队列插入请求结构。 TwoPhaseStateLock 用于避免并发访问或者修改两阶段信息共享数组。 TablespaceCreateLock 用于确定tablespace是否已经存在。 BtreeVacuumLock 用于防止vacuum清理B-tree中还在使用的页面。 AlterPortLock 用于保护CN更改注册端口号的操作。 AutovacuumLock 用于串行化访问autovacuum worker数组。 AutovacuumScheduleLock 用于串行化分配需要vacuum的table。 AutoanalyzeLock 用于获取和释放允许执行Autoanalyze的任务资源。 SyncScanLock 用于确定heap扫描时某个relfilenode的起始位置。 NodeTableLock 用于保护存放CN和DN节点信息的共享结构。 PoolerLock 用于保证两个线程不会同时从连接池里取到相同的连接。 RelationMappingLock 用于等待更新系统表到存储位置之间映射的文件。 Async Ctl 用于保护Async buffer。 AsyncCtlLock 用于避免并发访问或者修改共享通知状态。 AsyncQueueLock 用于避免并发访问或者修改共享通知信息队列。 SerializableXactHashLock 用于避免对于可串行事务共享结构的写写并发和读写并发。 SerializableFinishedListLock 用于避免对于已完成可串行事务共享链表的写写并发和读写并发。 SerializablePredicateLockListLock 用于保护对于可串行事务持有的锁链表。 OldSerXidLock 用于保护记录冲突可串行事务的结构。 FileStatLock 用于保护存储统计文件信息的数据结构。 SyncRepLock 用于在主备复制时保护xlog同步信息。 DataSyncRepLock 用于在主备复制时保护数据页同步信息。 MetaCacheSweepLock 用于元数据循环淘汰。 ExtensionConnectorLibLock 用于初始化ODBC连接场景,在加载与卸载特定动态库时进行加锁。 SearchServerLibLock 用于GPU加速场景初始化加载特定动态库时,对读文件操作进行加锁。 LsnXlogChkFileLock 用于串行更新特定结构中记录的主备机的xlog flush位置点。 GTMHostInfoLock 用于避免并发访问或者修改GTM主机信息。 ReplicationSlotAllocationLock 用于主备复制时保护主机端的流复制槽的分配。 ReplicationSlotControlLock 用于主备复制时避免并发更新流复制槽状态。 ResourcePoolHashLock 用于避免并发访问或者修改资源池哈希表。 OBSGetPathLock 用于避免对obs路径的写写并发和读写并发。 JobShmemLock 用于MPP兼容ORACLE定时任务功能中保护定时读取的全局变量。 OBSRuntimeLock 用于获取环境变量,如GAUSSHOME。 LLVMDumpIRLock 用于导出动态生成函数所对应的汇编语言。 LLVMParseIRLock 用于在查询开始处从IR文件中编译并解析已写好的IR函数。 CriticalCacheBuildLock 用于从共享或者本地缓存初始化文件中加载cache的场景。 WaitCountHashLock 用于保护用户语句计数功能场景中的共享结构。 BufMappingLock 用于保护对共享缓冲映射表的操作。 LockMgrLock 用于保护常规锁结构信息。 PredicateLockMgrLock 用于保护可串行事务锁结构信息。 OperatorRealTLock 用于避免并发访问或者修改记录算子级实时数据的全局结构。 OperatorHistLock 用于避免并发访问或者修改记录算子级历史数据的全局结构。 SessionRealTLock 用于避免并发访问或者修改记录query级实时数据的全局结构。 SessionHistLock 用于避免并发访问或者修改记录query级历史数据的全局结构。 CacheSlotMappingLock 用于保护CU Cache全局信息。 BarrierLock 用于保证当前只有一个线程在创建Barrier。 GPCCommitLock 用于保护全局Plan Cache hash表的添加操作。 GPCClearLock 用于保护全局Plan Cache hash表的清除操作。 GPCTimelineLock 用于保护全局Plan Cache hash表检查Timeline的操作。 GPCMappingLock 用于全局Plan Cache缓存管理。 GPCPrepareMappingLock 用于全局Plan Cache缓存管理。 GPRCMappingLock 用于管理自治事务全局缓存hash表的访问和修改操作。 BufFreelistLock 用于保证共享缓冲区空闲列表操作的原子性。 AddinShmemInitLock 保护共享内存对象的初始化。 wait active statement 等待作业执行,正在资源负载管控中。 wait memory 等待内存获取。 DnUsedSpaceHashLock 用于更新会话对应的空间使用信息。 InstanceRealTLock 用于保护共享实例统计信息hash表的更新操作。 IOStatLock 用于资源管理IO统计信息哈希表并发维护操作。 PldebugLock 用于存储过程调试并发维护操作。 StartBlockMappingLock 用于globalstat从pgstat获取startblockarray等信息。 GlobalSeqLock 用于全局seqence序列管理。 MatviewSeqnoLock 用于物化视图缓存管理。 DataFileIdCacheLock 管理共享内存中存储数据文件描述符的哈希表的并发访存。 GTMHostInfoLock 保护共享GTM主机信息的并发访存。 TwoPhaseStatePartLock 保护(各个分区)两阶段事务状态信息。 WALBufMappingLock 保护共享内中各个wal缓存页面与lsn偏移的映射关系。 UndoZoneLock 保护undozone的并发访存。 RollbackReqHashLock 管理共享内存中存储回滚请求信息的哈希表的并发访存。 UHeapStatLock 保护ustore统计信息的并发访存。 WALWritePaxosLock 保护向paxos复制组件写wal日志的并发顺序。 SyncPaxosLock 保护paxos同步队列的并发访存。 BackgroundWorkerLock 保护background worker的并发顺序。 HadrSwitchoverLock 保护容灾切换的并发顺序。 HashUidLock 保护uid分配的并发顺序。 ParallelDecodeLock 保护并行解码的并发顺序。 XLogMax CS NLock 保护容灾模式下本地最大可恢复CSN信息。 DisasterCacheLock 保护共享内存中容灾信息缓存的并发访存。 MaxCSNArrayLock 保护共享内存中各个分片备机CSN恢复进度信息。 RepairBadBlockStatHashLock 保护共享内存中损坏页面哈希表的并发访存。 DropArchiveSlotLock 保护删除归档槽信息的并发顺序。 ProcXactMappingLock 保护事务号-线程信息映射哈希表的并发访存。 UndoPerZoneLock 保护每个undozone内信息的并发访存。 UndoSpaceLock 保护undospace的并发访存。 SnapshotBlockLock 控制快照备份与页面刷盘的并发顺序。 DWSingleFlushFirstLock 控制非段页式单页面双写文件的并发顺序。 DWSingleFlushSecondLock 控制段页式单页面双写文件的并发顺序 DWSingleFlushSecondBufTagLock 控制段页式单页面双写文件的元信息并发访存 RestartPointQueueLock 控制备机restart Point数组的并发访存。 UnlinkRelHashTblLock 保护共享内存中待删除文件哈希表的并发访存。 UnlinkRelForkHashTblLock 保护共享内存中待删除文件fork哈希表的并发访存。 WALFlushWait 保护日志刷盘的并发顺序。 WALConsensusWait 保护日志达成一致才进行事务提交或日志回放操作。 WALBufferInitWait 保护wal共享内存页面的初始化和刷盘顺序。 WALInitSegment 保护wal日志段文件的初始化顺序。 SegmentHeadPartitionLock 保护段页式segment头部元信息的分区锁。 PgwrSyncQueueLock 保护待刷盘文件队列的并发访存。 BarrierHashTblLock 保护共享内存中barrier列表信息的并发访存。 PageRepairHashTblLock 保护页面修复哈希表的并发访存。 FileRepairHashTblLock 保护文件修复哈希表的并发访存。 BadBlockStatHashLock 保护共享损坏页面统计哈希表的并发访存。 BufferIOLock 保护共享缓冲区单个页面加载或淘汰的IO并发。 BufferContentLock 保护共享缓冲区单个页面的读写并发。 CUSlotListLock 保护共享CU槽位链表的并发访存。 DataCacheLock 保护共享CU只读缓存的并发访存。 MetaCacheLock 保护共享cu meta缓存的并发访存。 CBMParseXlogLock 控制cbm文件的并发访存。 CLogBufMappingLock 控制共享clog页面映射的并发访存。 C LOG Ctl 控制各个clog分区信息的并发访存。 CSNBufMappingLock 控制共享csnlog页面映射的并发访存。 CSNLOG Ctl 控制各个csnlog分区信息的并发访存。 DelayDDLLock 控制删除类ddl和延迟备份功能的并发顺序。 DoubleWriteLock 控制双写模块的并发顺序。 DfsConnectorCacheLock 控制dfs连接缓存的并发访存。 DfsUserLoginLock 控制dfs用户登录的并发顺序。 DfsSpaceCacheLock 控制dfs空间管理缓存的并发顺序。 PGPROCLock 保护全局共享线程状态数组的并发访存。 RelfilenodeReuseLock 控制文件名复用的并发顺序。 ReplicationSlotLock 保护逻辑复制槽信息的并发访存。 LogicalReplicationSlotPersistentDataLock 控制逻辑复制槽持久化的并发顺序。 RowPageReplicationLock 控制行存页面复制的并发顺序。 MultiXactOffset Ctl 保护multixact offset文件信息的并发访存。 MultiXactMember Ctl 保护multixact member文件信息的并发访存。 OldSerXid SLRU Ctl 保护oldser事务号缓存信息的并发访存。 FullBuildXlogCopyStartPtrLock 控制全量build起点位置的并发访存。 RcvWriteLock 控制wal receiver writer的并发顺序。 XlogRemoveSegLock 控制最新删除wal文件信息的并发访存。 CsnMinLock 控制csn min信息的并发访存。 HypoIndexLock 虚拟索引创建、删除、重置等动作中使用的轻量级锁。 XGBoostLibLock DB4AI特性调用xgboost库时启用的锁。 InstrUserLockId 对保护用户登录或者退出登录哈希表并发修改加锁。 GsStackLock 控制gs_stack函数不被并发调用。 InstrStmtTrackCtlLock 在动态开启全量SQL时, 保护哈希表的并发访存。 CaptureViewFileHashLock 开启性能视图采集时,保护哈希表的并发访存。 UniqueSqlEvictLock 开启Unique SQL回收时,保护哈希表的并发访存。 ASPMappingLock 用于管理ASP的hash表的并发访存。 AuditIndexFileLock 控制审计日志index文件的并发读写。 SQLAdvisorLock 用于管理分布列推荐中hash表的并发访存。 LWTRANCHE_ACCOUNT_TABLE 控制账户锁定状态hash表的并发读写。 当wait_status值为wait io时对应的wait_event等待事件类型与描述信息如表4所示。 表4 I/O等待事件列表 wait_event类型 类型描述 BufFileRead 从临时文件中读取数据到指定buffer。 BufFileWrite 向临时文件中写入指定buffer中的内容。 ControlFileRead 读取pg_control文件。主要在数据库启动、执行checkpoint和主备校验过程中发生。 ControlFileSync 将pg_control文件持久化到磁盘。数据库初始化时发生。 ControlFileSyncUpdate 将pg_control文件持久化到磁盘。主要在数据库启动、执行checkpoint和主备校验过程中发生。 ControlFileWrite 写入pg_control文件。数据库初始化时发生。 ControlFileWriteUpdate 更新pg_control文件。主要在数据库启动、执行checkpoint和主备校验过程中发生。 CopyFileRead copy文件时读取文件内容。 CopyFileWrite copy文件时写入文件内容。 DataFileExtend 扩展文件时向文件写入内容。 DataFileFlush 将表数据文件持久化到磁盘 DataFileImmediateSync 将表数据文件立即持久化到磁盘。 DataFilePrefetch 异步读取表数据文件。 DataFileRead 同步读取表数据文件。 DataFileSync 将表数据文件的修改持久化到磁盘。 DataFileTruncate 表数据文件truncate。 DataFileWrite 向表数据文件写入内容。 LockFileAddToDataDirRead 读取"postmaster.pid"文件。 LockFileAddToDataDirSync 将"postmaster.pid"内容持久化到磁盘。 LockFileAddToDataDirWrite 将pid信息写到"postmaster.pid"文件。 LockFileCreateRead 读取LockFile文件"%s.lock"。 LockFileCreateSync 将LockFile文件"%s.lock"内容持久化到磁盘。 LockFileCreateWRITE 将pid信息写到LockFile文件"%s.lock"。 NgroupDestoryLock 对于保护nodegroup哈希表并发修改加锁。 NGroupMappingLock 对于保护nodegroup哈希表的单个分桶并发修改加锁。 RelationMapRead 读取系统表到存储位置之间的映射文件 RelationMapSync 将系统表到存储位置之间的映射文件持久化到磁盘。 RelationMapWrite 写入系统表到存储位置之间的映射文件。 ReplicationSlotRead 读取流复制槽文件。重新启动时发生。 ReplicationSlotRestoreSync 将流复制槽文件持久化到磁盘。重新启动时发生。 ReplicationSlotSync checkpoint时将流复制槽临时文件持久化到磁盘。 ReplicationSlotWrite checkpoint时写流复制槽临时文件。 SLRUFlushSync 将pg_clog、pg_subtrans和pg_multixact文件持久化到磁盘。主要在执行checkpoint和数据库停机时发生。 SLRURead 读取pg_clog、pg_subtrans和pg_multixact文件。 SLRUSync 将脏页写入文件pg_clog、pg_subtrans和pg_multixact并持久化到磁盘。主要在执行checkpoint和数据库停机时发生。 SLRUWrite 写入pg_clog、pg_subtrans和pg_multixact文件。 TimelineHistoryRead 读取timeline history文件。在数据库启动时发生。 TimelineHistorySync 将timeline history文件持久化到磁盘。在数据库启动时发生。 TimelineHistoryWrite 写入timeline history文件。在数据库启动时发生。 TwophaseFileRead 读取pg_twophase文件。在两阶段事务提交、两阶段事务恢复时发生。 TwophaseFileSync 将pg_twophase文件持久化到磁盘。在两阶段事务提交、两阶段事务恢复时发生。 TwophaseFileWrite 写入pg_twophase文件。在两阶段事务提交、两阶段事务恢复时发生。 WALBootstrapSync 将初始化的WAL文件持久化到磁盘。在数据库初始化发生。 WALBootstrapWrite 写入初始化的WAL文件。在数据库初始化发生。 WALCopyRead 读取已存在的WAL文件并进行复制时产生的读操作。在执行归档恢复完后发生。 WALCopySync 将复制的WAL文件持久化到磁盘。在执行归档恢复完后发生。 WALCopyWrite 读取已存在WAL文件并进行复制时产生的写操作。在执行归档恢复完后发生。 WALInitSync 将新初始化的WAL文件持久化磁盘。在日志回收或写日志时发生。 WALInitWrite 将新创建的WAL文件初始化为0。在日志回收或写日志时发生。 WALRead 从xlog日志读取数据。两阶段文件redo相关的操作产生。 WALSyncMethodAssign 将当前打开的所有WAL文件持久化到磁盘。 WALWrite 写入WAL文件。 DoubleWriteFileRead 等待读取双写文件。 DoubleWriteFileSync 等待刷盘双写文件。 DoubleWriteFileWrite 等待写入双写文件。 PredoProcessPending 等待并行回放处理剩余记录。 PredoApply 等待并行回放应用回放。 DisableConnectFileRead 等待读取锁分片文件。 DisableConnectFileSync 等待刷盘锁分片文件。 DisableConnectFileWrite 等待写入锁分片文件 BufHashTableSearch 共享缓冲区hash表搜索(可能会触发页面淘汰)。 buffer_strategy_get 策略化缓冲区页面获取(可能会触发页面淘汰)。 UndoFileExtend undo文件扩展。 UndoFilePrefetch undo文件预取。 UndoFileRead undo文件读取。 UndoFileWrite undo文件写。 UndoFileSync undo文件刷盘。 UndoFileUnlink undo文件删除。 UndoMetaSync undo元数据文件刷盘。 WALBufferAccess WAL Buffer访问(出于性能考虑,内核代码里只统计访问次数,未统计其访问耗时)。 WALBufferFull WAL Buffer满时,写wal文件相关的处理。 DWSingleFlushGetPos 单页面双写文件查找可用位置。 DWSingleFlushWrite 单页面双写文件刷盘。 CkptWaitPageWriterFlush 执行全量checkpoint时等待刷页。 CkptWaitPageWriterSync checkpoint打点前等待有修改的文件同步到磁盘。 CkptWaitCommitTransactionFinish checkpoint打点前等待所有已经提交的事务提交完毕。 MPFL_INIT 初始化max_page_flush_lsn。 MPFL_READ 读取max_page_flush_lsn。 MPFL_WRITE 写max_page_flush_lsn。 OBSList 遍历OBS目录。 OBSRead 读取OBS对象。 OBSWrite 写入OBS对象。 LOGCTRL_SLEEP 等待备机回放追赶。 ShareStorageWalRead 共享盘读取日志文件。 ShareStorageWalWrite 共享盘写入日志文件。 ShareStorageCtlInfoRead 共享盘读取控制信息。 ShareStorageCtlInfoWrite 共享盘写入控制信息。 SegFileExtend 段页式文件扩展。 SegReadDisk 段页式文件读取。 SegWriteDisk 段页式文件写入。 SegSync 段页式文件刷盘。 SegFileShrink 段页式文件收缩。 当wait_status值为acquire lock(事务锁)时对应的wait_event等待事件类型与描述信息如表5所示。 表5 事务锁等待事件列表 wait_event类型 类型描述 relation 对表加锁。 extend 对表扩展空间时加锁。 partition 对分区表加锁。 partition_seq 对分区表的分区加锁。 page 对表页面加锁。 tuple 对页面上的tuple加锁。 transactionid 对事务id加锁。 virtualxid 对虚拟事务id加锁。 object 加对象锁。 userlock 加用户锁。 advisory 加advisory锁。 filenode 对文件名加锁。 subtransactionid 对子事务号加锁。 tuple_uid 对元组头部的uid隐藏字段加锁。 父主题: 其他系统视图
  • num_internal_lock_partitions 参数说明:控制内部轻量级锁分区的个数。主要用于各类场景的性能调优。 参数内容以关键字和数字的KV方式组织,各个不同类型锁之间以逗号隔开。 先后顺序对设置结果不影响。例如"CLOG_PART=256,CSNLOG_PART=512"等同于"CSNLOG_PART=512,CLOG_PART=256"。 重复设置同一关键字时,以最后一次设置为准。例如"CLOG_PART=256,CLOG_PART=2",设置的结果为CLOG_PART=2。 参数类型:字符串 参数单位:无 取值范围: CLOG_PART:CLOG文件控制器的个数。最小值为1,最大值为256。 CSNLOG_PART:CSNLOG文件控制器的个数。最小值为1,最大值为512。 LOG2_LOCKTABLE_PART:常规锁表锁分区个数的2对数。最小值4,即锁分区数为16;最大值为16,即锁分区数为65536。 TWOPHASE_PART:两阶段事务锁的分区数。最小值为1,最大值为64。 FASTPATH_PART:每个线程可以不通过主锁表拿锁的最大锁个数。最小值为20,最大值为10000。 默认值:"CLOG_PART=256,CSNLOG_PART=512,LOG2_LOCKTABLE_PART=4,TWOPHASE_PART=1,FASTPATH_PART=20" 设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 设置建议: CLOG_PART:增大该值可以提高CLOG日志写入效率,提升事务提交性能,但是会增大内存使用;减小该值会减少相应内存使用,但可能使得CLOG日志写入冲突变大,影响性能。 CSNLOG_PART:增大该值可以提高CSNLOG日志写入效率,提升事务提交性能,但是会增大内存使用;减小该值会减少相应内存使用,但可能使得CSNLOG日志写入冲突变大,影响性能。 LOG2_LOCKTABLE_PART:增大该值可以提升正常流程常规锁获取锁的并行度,但是会增大内存使用,对于等待事件在LockMgrLock时,可以调大该锁增加性能。 TWOPHASE_PART:调大该值可以提高两阶段事务提交的并发数,但是会增大内存使用。 FASTPATH_PART:对于分区表读取、更新、插入、删除操作且等待事件在LockMgrLock时,可以通过调大该值避免获取LockMgrLock提升性能,建议调整数量大于等于分区数*(1+本地索引数量)+全局索引数量+10,调大该值可能增加锁转移和锁消除时的耗时,并会额外增加内存。fastpath增量内存=((fastpath增加量/20)*8 + fastpath增加量*12) * 线程池大小,单位是字节。 设置不当的风险与影响:设置不当可能会影响数据库性能。
  • enable_wait_exclusive_lock 参数说明:控制ProcArrayLock的排他锁hang死检测与治愈功能的开关。 参数类型:布尔型 参数单位:无 取值范围: on:表示开启。 off:表示关闭。 默认值:on 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。
  • xloginsert_locks 参数说明:控制用于并发写预写式日志锁的个数。主要用于提高写预写式日志的效率。 参数类型:整型 参数单位:无 取值范围:1 ~ 1000。若CPU为NUMA架构,数值必须为NUMA节点数量的整数倍。 默认值:16 设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 设置建议:ARM CPU架构在并发压力大的场景下,可能因为原子操作的竞争而导致概率性的性能抖动,可以适当降低该参数值而获取相对稳定的运行性能。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。
  • lockwait_timeout 参数说明:控制单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。该参数仅针对常规锁生效。 参数类型:整型 参数单位:ms(毫秒) 取值范围:0 ~ 2147483647 默认值:1200000(20min) 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。例如,不带单位取值900,表示lockwait_timeout为900ms;带单位取值20min,表示lockwait_timeout为20min。取值如果要带单位,必须为ms、s、min、h、d。 设置建议:一般设置为默认值。根据业务需要,业务需要锁冲突超过多久,该参数就设置多少。 设置不当的风险与影响:设置过大时,锁冲突造成的阻塞时间更长;设置过小时,可能会出现更多的锁超时报错。
  • gs_clean_timeout 参数说明: GaussDB数据库 中事务处理使用的是两阶段提交方法,当有两阶段事务残留时,该事务通常会持有表级锁,导致其它连接无法加锁,此时需要调用gs_clean工具对集群中两阶段事务进行清理,gs_clean_timeout是控制Coordinator周期性调用gs_clean的时间。gs_clean也可用来定时清理残留临时表。 参数类型:整型 参数单位:s(秒) 取值范围:0 ~ 2147483 默认值:60 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。例如:不带单位取值1,表示gs_clean_timeout为1s;带单位取值1min,表示gs_clean_timeout为1min。取值如果要带单位,必须为s、min、h、d。 设置建议:推荐使用默认值。 设置不当的风险与影响:设置过大时,会使两阶段事务和残留临时表清理周期延长,可能导致清理前其他连接无法加锁。
  • max_pred_locks_per_transaction 参数说明:当数据库连接数达到最大时,每个事务能够持有断定锁的平均数量。 这个参数并不严格限制每个事务最多可以持有多少断定锁。如果连接数没有达到最大值max_connections,那么每个事务能够持有断定锁的平均数量会增大。 参数类型:整型 参数单位:无 取值范围:10 ~ 2147483647‬ 默认值:64 设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 设置建议: 共享的断定锁表的大小是以假设任意时刻最多只有max_pred_locks_per_transaction*(max_connections+max_prepared_transactions) 个独立的对象需要被锁住为基础进行计算的。不超过设定数量的多个对象可以在任一时刻同时被锁定。当在一个事务里面修改很多不同的表时,可能需要提高这个默认数值。只能在服务器启动的时候设置。 增大这个参数可能导致 GaussDB 请求更多的System V共享内存,有可能超过操作系统的缺省配置。 设置不当的风险与影响:设置过大时,可能导致数据库启动失败。
  • partition_lock_upgrade_timeout 参数说明:在执行某些查询语句的过程中,需要将分区表上的锁级别由允许读的ExclusiveLock级别升级到读写阻塞的AccessExclusiveLock级别。如果此时已经存在并发的读事务,那么该锁升级操作将阻塞等待。partition_lock_upgrade_timeout为尝试锁升级的等待超时时间。 举例:在分区表上进行MERGE PARTITION和CLUSTER PARTITION操作时,都利用了临时表进行数据重排和文件交换,为了最大程度提高分区上的操作并发度,在数据重排阶段给相关分区加锁ExclusiveLock,在文件交换阶段加锁AccessExclusiveLock。加锁方式是尝试性加锁,加锁成功了则立即返回,不成功则等待50ms后继续下次尝试,加锁超时时间使用会话级设置参数partition_lock_upgrade_timeout。 参数类型:整型 参数单位:s(秒) 取值范围:-1 ~ 3000。-1表示无限等待,即不停地尝试锁升级,直到加锁成功。 默认值:1800 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:设置为-1时,长时间无法升级锁可能导致业务阻塞。
  • update_lockwait_timeout 参数说明:在业务允许并发更新的情况下,该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。该参数仅针对常规锁生效。 参数类型:整型 参数单位:ms(毫秒) 取值范围:0 ~ 2147483647 默认值:120000(2min) 设置方式:该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。例如,不带单位取值900,表示update_lockwait_timeout为900ms;带单位取值2min,表示update_lockwait_timeout为2min。取值如果要带单位,必须为ms、s、min、h、d。 设置建议:设置值主要取决于并发更新同一行的事务的workload。一般TP业务,执行时间较短小于两分钟,因此等待并发更新事务提交时间较短,按默认值2min误报锁超时概率较小;如果业务出现大量并发更新同一行事务,执行时间超过两分钟,可以调大该参数避免等锁超时误报。 设置不当的风险与影响:设置过大时,并发更新同一行时锁冲突造成的阻塞时间更长;设置过小时,可能会出现更多的锁超时报错。
  • enable_online_ddl_waitlock 参数说明:控制DDL是否会阻塞等待pg_advisory_lock/pgxc_lock_for_backup等集群锁。 参数类型:布尔型 参数单位:无 取值范围: on:表示开启。 off:表示关闭。 默认值:off 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置建议:主要用于OM在线操作场景,不建议用户设置。 设置不当的风险与影响:修改该参数取值可能导致集群出现意料之外的结果,请保持默认值。
  • deadlock_timeout 参数说明:设置死锁超时检测时间。当申请的锁超过设定值时,系统会检查是否产生了死锁。该参数仅针对常规锁生效。 参数类型:整型 参数单位:ms(毫秒) 取值范围:1 ~ 2147483647 默认值:1000(即1s) 设置方式:该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。 设置建议: 死锁的检查代价是比较高的,服务器不会在每次等待锁的时候都运行这个过程。在系统运行过程中,不经常出现死锁情况,因此在检查死锁前只需等待一个相对较短的时间。deadlock_timeout增加,可以减少死锁检查浪费的时间,但是会减慢真正的死锁错误报告的速度。在负载过重的服务器上,用户可能需要增大deadlock_timeout。这个值的设置应该超过事务持续时间,这样可以减少在锁释放之前就开始死锁检查的问题。 当设置log_lock_waits为on时,deadlock_timeout决定一个等待时间来将查询执行过程中的锁等待耗时信息写入日志。如果要研究锁延时情况,可以设置deadlock_timeout值比正常情况小。 设置不当的风险与影响:设置过大时,会减慢死锁错误报告的速度;设置过小时,会出现锁释放前就开始检测死锁的问题。
  • 优化建议 UNLOGGED UNLOGGED表和表上的索引因为数据写入时不通过WAL日志机制,写入速度远高于普通表。因此,可以用于缓冲存储复杂查询的中间结果集,增强复杂查询的性能。 UNLOGGED表无主备机制,在系统故障或异常断点等情况下,会有数据丢失风险,因此,不可用来存储基础数据。 TEMPORARY | TEMP 临时表只在当前会话可见,会话结束后会自动删除。 除了当前CN外,其他CN对于该临时表不可见。 LIKE 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 LIKE INCLUDING DEFAULTS 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 LIKE INCLUDING CONSTRAINTS 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 LIKE INCLUDING INDEXES 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 LIKE INCLUDING STORAGE 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 LIKE INCLUDING COMMENTS 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 LIKE INCLUDING PARTITION 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不复制源表的分区定义。 LIKE INCLUDING RELOPTIONS 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 LIKE INCLUDING DISTRIBUTION 如果指定了INCLUDING DISTRIBUTION,则源表的分布信息会复制到新表中,包括分布类型和分布列,同时新表将不能再使用DISTRIBUTE BY子句。默认情况下,不复制源表的分布信息。 LIKE INCLUDING ALL INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS、INCLUDING DISTRIBUTION和INCLUDING ILM的内容。 ORIENTATION ROW 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 DISTRIBUTE BY 事实表或者数据量较大的维度表建议创建为分布表。对指定的列进行Hash,通过映射,把数据分布到指定DN。语法为:DISTRIBUTE BY HASH(column_name)。 数据量较小的维度表建议创建为复制表。表的每条记录存在所有数据节点(DN)中,即每个数据节点都有完整的表数据。语法为: DISTRIBUTE BY REPLICATION。
  • 表数据分布示例 REPLICATION gaussdb=# CREATE TABLE test_replication( id CHAR(7), name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY REPLICATION; --查询表信息。 gaussdb=# \d+ test_replication Table "public.test_replication" Column | Type | Modifiers | Storage | Stats target | Description ----------+-----------------------+------------------------------------+----------+--------------+------------- id | character(7) | | extended | | name | character varying(20) | | extended | | province | character varying(60) | | extended | | country | character varying(30) | default 'China'::character varying | extended | | Has OIDs: no Distribute By: REPLICATION Location Nodes: ALL DATANODES Options: orientation=row, logical_repl_node=-1, compression=no, storage_type=USTORE, segment=off --删除。 gaussdb=# DROP TABLE test_replication; HASH --定义一个表,使用HASH分布。 gaussdb=# CREATE TABLE test_hash( id CHAR(7), name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY HASH(id); --插入数据。 gaussdb=# INSERT INTO test_hash VALUES ('0000001', 'Bob', 'Shanghai', 'China'), ('0000002', 'Jack', 'Beijing', 'China'), ('0000003', 'Scott', 'Beijing', 'China'); --查看数据分布情况。 gaussdb=# SELECT a.count,b.node_name FROM (SELECT COUNT(*) AS count, xc_node_id FROM test_hash GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC; count | node_name -------+------------------- 2 | dn_6001_6002_6003 1 | dn_6004_6005_6006 --删除表。 gaussdb=# DROP TABLE test_hash; MURMURHASH --测试环境包含1个CN和6个DN。 --创建NODEGROUP,NODEGROUP中的DN名字可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询,查询的结果按需替换CREATE NODE GROUP语句中WITH后的DN名。 gaussdb=# CREATE NODE GROUP NG1 WITH(datanode1, datanode2, datanode3, datanode4, datanode5, datanode6); --定义一个表,使用MURMURHASH分布。 gaussdb=# CREATE TABLE test_murmurhash1 (a int NOT NULL, b int) DISTRIBUTE BY MURMURHASH(a) TO GROUP NG1; gaussdb=# CREATE TABLE test_murmurhash2 (a int NOT NULL, b int) DISTRIBUTE BY MURMURHASH(lpad_s(a,10,'0')) TO GROUP NG1; --插入数据。 gaussdb=# INSERT INTO test_murmurhash1 VALUES(0,1); gaussdb=# INSERT INTO test_murmurhash2 VALUES(1,2); --查询数据。 gaussdb=# SELECT * FROM test_murmurhash1; a | b ---+--- 0 | 1 (1 row) gaussdb=# SELECT * FROM test_murmurhash2; a | b ---+--- 1 | 2 (1 row) --删除表。 gaussdb=# DROP TABLE test_murmurhash1; gaussdb=# DROP TABLE test_murmurhash2; --删除NODE GROUP。 gaussdb=# DROP NODE GROUP NG1; RANGE --定义一个表,使用RANGE分布(需要根据实际情况修改dn名字,查询dn节点名可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询)。 gaussdb=# CREATE TABLE test_range( id INT, name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY RANGE(id)( SLICE s1 VALUES LESS THAN (100) DATANODE dn_6001_6002_6003, SLICE s2 VALUES LESS THAN (200) DATANODE dn_6004_6005_6006, SLICE s3 VALUES LESS THAN (MAXVALUE) DATANODE dn_6007_6008_6009 ); --插入数据。 gaussdb=# INSERT INTO test_range VALUES (52, 'Bob', 'Beijing', 'China'); gaussdb=# INSERT INTO test_range VALUES (100, 'Ben', 'Shanghai', 'China'); gaussdb=# INSERT INTO test_range VALUES (150, 'Scott', 'Guangzhou', 'China'); gaussdb=# INSERT INTO test_range VALUES (300, 'Jordan', 'Beijing', 'China'); --查看数据分布情况。 gaussdb=# SELECT a.count,b.node_name FROM (SELECT COUNT(*) AS count, xc_node_id FROM test_range GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC; count | node_name -------+------------------- 2 | dn_6004_6005_6006 1 | dn_6001_6002_6003 1 | dn_6007_6008_6009 (3 rows) --查询各dn上存储的数据。 gaussdb=# SELECT b.node_name, a.* FROM (SELECT *, xc_node_id FROM test_range) a, pgxc_node b WHERE a.xc_node_id=b.node_id order by node_name; node_name | id | name | province | country | xc_node_id -------------------+-----+--------+-----------+---------+------------- dn_6001_6002_6003 | 52 | Bob | Beijing | China | -1072999043 dn_6004_6005_6006 | 100 | Ben | Shanghai | China | -564789568 dn_6004_6005_6006 | 150 | Scott | Guangzhou | China | -564789568 dn_6007_6008_6009 | 300 | Jordan | Beijing | China | 1532339558 (4 rows) --删除表。 gaussdb=# DROP TABLE test_range; LIST --定义一个表,使用LIST分布(需要根据实际情况修改dn名字,查询dn节点名可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询)。 gaussdb=# CREATE TABLE test_list( id INT, name VARCHAR(20), country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY LIST(country)( SLICE s1 VALUES ('China') DATANODE dn_6001_6002_6003, SLICE s2 VALUES ('USA') DATANODE dn_6004_6005_6006, SLICE s3 VALUES (DEFAULT) DATANODE dn_6007_6008_6009 ); --插入数据。 gaussdb=# INSERT INTO test_list VALUES (1,'Scott','China'); gaussdb=# INSERT INTO test_list VALUES (2,'Henry','USA'); gaussdb=# INSERT INTO test_list VALUES (3,'Michael','France'); gaussdb=# INSERT INTO test_list VALUES (4,'Jack','UK'); --查询各dn上存储的数据。 gaussdb=# SELECT b.node_name, a.* FROM (SELECT *, xc_node_id FROM test_list) a, pgxc_node b WHERE a.xc_node_id=b.node_id order by node_name; node_name | id | name | country | xc_node_id -------------------+----+---------+--------+------------- dn_6001_6002_6003 | 1 | Scott | China | -1072999043 dn_6004_6005_6006 | 2 | Henry | USA | -564789568 dn_6007_6008_6009 | 3 | Michael | France | 1532339558 dn_6007_6008_6009 | 4 | Jack | UK | 1532339558 (4 rows) --删除表。 gaussdb=# DROP TABLE test_list;
  • 建表示例 创建普通表 gaussdb=# CREATE TABLE tbl_test1( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ); gaussdb=# DROP TABLE tbl_test1; WITH子句为表或者索引增加存储参数 --建表指定填充因子。 gaussdb=# CREATE TABLE tbl_test2( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ) WITH (FILLFACTOR = 70); --建表指定存储引擎。 gaussdb=# CREATE TABLE tbl_test3( id int, name varchar(50), province varchar (60), --省 country varchar (60) DEFAULT 'China' --国籍 ) WITH (STORAGE_TYPE = ASTORE); --删除。 gaussdb=# DROP TABLE tbl_test2; gaussdb=# DROP TABLE tbl_test3; 临时表 --创建临时表,并指定提交事务时删除该临时表数据。 gaussdb=# CREATE TEMPORARY TABLE test_t2( id CHAR(7), name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 ) ON COMMIT DELETE ROWS; gaussdb=# DROP TABLE test_t2; 建表时指定字符集字符序 --创建前置数据库。 gaussdb=# CREATE DATABASE testdb1 ENCODING = 'UTF8'; gaussdb=# \c testdb1 --创建t1表,设置t1的默认字符集为utf8mb4,默认字符序为utf8mb4_bin,设置c1字段为表的默认字符集字符序,设置c2字段的字符集为utf8mb4,字符序为utf8mb4_unicode_ci。 testdb1=# CREATE TABLE t1(c1 text, c2 text charset utf8mb4 collate utf8mb4_unicode_ci) charset utf8mb4 collate utf8mb4_bin; --删除。 testdb1=# DROP TABLE t1; testdb1=# \c postgres gaussdb=# DROP DATABASE testdb1; IF NOT EXISTS关键字 使用该关键字,表不存在时报NOTICE;如不用该关键字,则报ERROR。两种情况下表都不会创建成功。 gaussdb=# CREATE TABLE test_t3(id INT); --创建一个已经存在同名的表test_t3。 gaussdb=# CREATE TABLE test_t3(id INT); ERROR: Relation test_t3 already exists in schema public. DETAIL: Creating new table with existing name in the same schema. --使用IF NOT EXISTS关键字。 gaussdb=# CREATE TABLE IF NOT EXISTS test_t3(id INT); NOTICE: Relation test_t3 already exists, skipping. CREATE TABLE --删除表。 gaussdb=# DROP TABLE test_t3; 建表时指定表空间 --创建表空间。 gaussdb=# CREATE TABLESPACE ds_tbs1 RELATIVE LOCATION 'tablespace/tablespace_1'; --创建表时,指定表空间。 gaussdb=# CREATE TABLE test(id CHAR(7), name VARCHAR(20)) TABLESPACE ds_tbs1; --删除表和表空间。 gaussdb=# DROP TABLE test; gaussdb=# DROP TABLESPACE ds_tbs1;
  • 语法格式 创建表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name { ( { column_name data_type [ CHARACTER SET | CHARSET charset ] [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] } [, ... ] ) | LIKE source_table } [ table_option [ [ , ] ... ] ] [ htap_option ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ] [ ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER n { day | month | year } OF NO MODIFICATION [ ON ( EXPR )]] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY { REPLICATION | HASH ( column_name [, ...] ) | MURMURHASH ( expression ) | KMEANS ( column_name ) distance_type | RANGE ( column_name [, ...] ) { SLICE REFERENCES tablename | ( slice_less_than_item [, ...] ) | ( slice_start_end_item [, ...] ) } | LIST ( column_name [, ...] ) { SLICE REFERENCES tablename | ( slice_values_item [, ...] ) } } ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]; 其中table_option为: { COMMENT [ = ] 'string' | AUTO_INCREMENT [ = ] value | [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset | [ DEFAULT ] COLLATE [ = ] default_collation | ENGINE [ = ] { InnoDB | 'InnoDB' | "InnoDB" } } 其中htap_option为: { COLVIEW [ PRIORITY { HIGH | LOW | NONE } ] | NOCOLVIEW [ PRIORITY { HIGH | LOW | NONE } ]} 其中列约束column_constraint为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | ON UPDATE update_expr | GENERATED ALWAYS AS ( generation_expr ) [STORED] | AUTO_INCREMENT | COMMENT 'string' | COLVIEW | NOCOLVIEW | UNIQUE [KEY] index_parameters | PRIMARY KEY index_parameters | ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中列的压缩可选项compress_mode为: 1 { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } 其中表约束table_constraint为: 1 2 3 4 5 6 [ CONSTRAINT [ constraint_name ] ] { CHECK ( expression ) | UNIQUE [ index_name ] [ USING method ] ( { { column_name [ ( length ) ] | ( expression ) } [ ASC | DESC ] }[, ... ] ) index_parameters | PRIMARY KEY [ USING method ] ( { column_name [ ASC | DESC ] } [, ... ] ) index_parameters [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] { [ COMMENT 'string' ] [ ... ] } 其中like选项like_option为: 1 { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | UPDATE | ILM | ALL } 其中索引参数index_parameters为: 1 2 [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ] 其中距离参数distance_type为: 1 { L2 | COSINE | HAMMING } 其中RANGE分布规则 slice_less_than_item为: SLICE name VALUES LESS THAN ({ expression | MAXVALUE } [, ...]) [ DATANODE datanode_name | ( datanode_name_list [, ... ] ) ] slice_start_end_item为: SLICE name { { START ( expression ) END ( expression ) EVERY ( expression ) } | { START ( literal ) END ( { literal | MAXVALUE } ) } | { START ( literal ) } | { END ( { literal | MAXVALUE } ) } } 其中LIST分布规则slice_values_item为: [ ( SLICE name VALUES (expression [, ... ]) [DATANODE datanode_name | ( datanode_name_list )] [, ... ] ) | ( SLICE name VALUES (DEFAULT) [DATANODE datanode_name] | ( datanode_name_list ) ) ] 其中update_expr为: { CURRENT_TIMESTAMP | LOCALTIMESTAMP | NOW() }
  • format_pg_to_timestamp 参数说明:在PG模式下,控制to_timestamp(string [, fmt])函数的行为。开启后,如果有不支持的格式,自动跳过,当前版本不支持FF,FF7,FF8,FF9,RR,RRRR,SYYYY,x,X等格式;支持早于294277-01-01 00:00:00之前的时间日期和负数年份(转化成公元前);FF1-FF6会把超出精确度的毫秒四舍五入;当时间日期中相同项冲突时(例如DDD和DD所指的天数不同时)返回一个格式正确的时间不会报错,具体冲突行为如表13所示。 参数类型:布尔型 参数单位:无 取值范围: on:实现上述功能。 off:取消实现上述功能。 默认值:on 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:开启会导致GaussDB不支持的fmt失效。 表13 to_timestamp fmt冲突 模式 描述 SSSSS与时间冲突 保留时间(分钟,小时)中的值以及SSSSS中的秒数部分的值。 W,J与时间日期冲突 优先级:J,W,mmdd按顺序进行覆盖。 W:未指定时,默认为星期三。 默认行为:W覆盖mmdd。 SSSSS与SS冲突 保留SS,舍弃SSSSS。 DDD与日期冲突 舍弃DDD。
  • forbid_public_funcname_same_with_sysfunc 参数说明:控制在创建函数及RENAME函数时,是否禁止PUBLIC函数与pg_catalog下的系统函数名称相同。 参数类型:布尔型 参数单位:无 取值范围: on:创建函数及RENAME函数时,禁止PUBLIC函数与pg_catalog下的系统函数名称相同。 off:创建函数及RENAME函数时,允许PUBLIC函数与pg_catalog下的系统函数名称相同。 默认值:on。 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:若设置为off,允许public函数与pg_catalog下的系统函数名称相同。 直接安装505.2.0版本数据库时,该参数值为on。从505.2.0之前版本升级到当前版本时,该参数值为off。
  • enable_ecpg_cursor_duplicate_operation 参数说明:ECPG控制在ORA兼容下是否支持重复打开/关闭游标,仅在ECPG连接ORA兼容数据库时生效。 参数类型:布尔型 参数单位:无 取值范围: on:ECPG连接ORA兼容数据库时,支持重复打开/关闭游标。 off:ECPG连接ORA兼容数据库时,不支持重复打开/关闭游标。 默认值:on 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:若设置为off,重复打开/关闭游标时会报错。 直接安装本版本数据库时,该参数值为on。从老版本升级到当前版本时,该参数值为off。
  • synonym_priv_strict_check 参数说明:控制通过同义词搜索对象时,是否检查同义词关联对象的访问权限。 参数类型:布尔型 参数单位:无 取值范围: on:通过同义词检索对象时,检查是否具有同义词关联对象的访问权限。 off:通过同义词检索对象时,不检查是否具有同义词关联对象的访问权限。 默认值:on。 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:若设置为off,通过同义词访问对象时,不检查对象的访问权限,可能构成越权风险。 直接安装505.2.0版本数据库时,该参数值为on。从505.2.0之前版本升级到当前版本时,该参数值为off。
  • enable_case_intervaltonumeric 参数说明:控制CASE语句中是否支持INTERVAL转换为NUMERIC,该参数仅在ORA兼容模式下生效。 参数类型:布尔型 参数单位:无 取值范围: on:CASE语句中支持INTERVAL转换为NUMERIC。 off:CASE语句中不支持INTERVAL转换为NUMERIC。 默认值:off 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:若设置为on,后续修改为off,可能导致现有CASE语句报错。
  • enable_m_format_hook 参数说明:M-Compatibility模式数据库行为配置项。该参数控制M-Compatibility模式hook是否生效。 参数类型:布尔型 参数单位:无 取值范围: on:表示M-Compatibility模式数据库允许挂载对应解析执行hook。 off:表示M-Compatibility模式数据库不挂载对应解析执行hook。 默认值:on 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:当前参数仅针对当前未完全适配的外部工具使用,不允许用户使用。 设置不当的风险与影响:无
  • gs_format_behavior_compat_options 参数说明:gs_format_behavior_compat_options用于选择GaussDB内部系统函数配置项。 参数类型:字符串 参数单位:无 取值范围:当前只支持表10中的兼容性配置项,当设置多个兼容性配置项时,相邻配置项之间用逗号隔开。 默认值:"sqrt_karatsuba" 表10 gs_format_behavior兼容性配置项 兼容性配置项 兼容性行为控制 sqrt_karatsuba 设置此参数:表示在调用sqrt平方根函数时,使用Karatsuba平方根算法,karatsuba算法性能更高但是在极少数情况下精度可能会和牛顿迭代算法不一致。 不设置此参数:在计算sqrt平方根算法时,会使用默认的牛顿迭代算法进行平方根的计算。 allow_textconcat_null 设置此参数:在PG兼容模式下,字符串和null值拼接会返回对应的字符串的值。 -- 在PG兼容模式下执行 gaussdb=# set gs_format_behavior_compat_options='allow_textconcat_null'; SET gaussdb=# select 'a' || null || 'b'; ?column? ---------- ab (1 row) 不设置此参数:在PG兼容模式下,字符串和null值拼接会返回NULL。 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:控制一些兼容性特性是否可用,若要更改,请在理解参数含义后谨慎操作,避免因误操作产生意料之外的风险。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。
  • support_zero_character 参数说明:当数据中包含Unicode编码为\u0000的字符(以下简称0字符)时,数据库是否取消对0字符的校验并且正确处理而不进行截断操作。 参数类型:布尔型 参数单位:无 取值范围: on:表示开启,数据库取消对0字符的校验,能够正确插入和处理0字符,使数据在处理过程中不发生截断。 off:表示关闭,数据库保留对0字符的校验,部分函数在处理0字符时会发生报错或数据截断。 默认值:off 设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值,仅在数据中存在0字符且需要对0字符进行正确处理时开启该参数。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。 该参数仅在数据库兼容性为ORA兼容模式且所有节点都设置为support_zero_character=on时生效。 如果需要向数据库中写入0字符,需确认support_zero_character=on生效,0字符数据才能正常插入并存储。 当support_zero_character=on时,如果数据类型为CHAR(n)、CHARACTER(n)、NCHAR(n)、VARCHAR(n)、CHARACTER VARYING(n)、VARCHAR2(n)、NVARCHAR2(n)、TEXT或CLOB类型,数据库可以正确插入并处理0字符;如果包含0字符的字符串数据可以显式转换为JSON/JSONB、XML、XMLTYPE、数值类型、货币类型、时间类型、几何类型、网络地址类型、位串类型、文本搜索类型、HLL类型、范围类型、对象标识符类型、aclitem类型或向量类型时,会在0字符处发生截断;如果字符串类型显式转换为UUID类型时,会在0字符处发生报错。 数据库仅支持以下写入0字符的方式: 通过JDBC连接数据库时,0字符可以通过文本方式写入数据库。 通过dbe_raw.cast_to_varchar2函数直接将0字符编码写入数据库。 通过copy/gs_loader工具将0字符编码写入数据库。 在开启GUC参数时,不同字符集之间进行转换时,0字符会直接返回,不再发生报错。 gsql客户端版本应与数据库版本匹配,在开启GUC参数时,若gsql端接收的数据中包含0字符,gsql工具会将0字符转换为空格后进行打印输出。若使用旧版本gsql连接数据库,包含0字符的数据仍存在显示被截断的情况。 当开启GUC参数时,0字符在表11所列的函数、高级包函数中的表现为:函数能够正常处理0字符,不会发生在0字符处截断的情况。 部分高级包接口入参为Schema名或object名,理论上不能含有0字符,因此对表12中的函数添加0字符校验,当入参包含0字符时进行报错处理(原表现为0字符后数据被截断)。 当support_zero_character=on时,若处理的数据中不包含0字符,函数性能无明显劣化;若处理的数据中包含0字符,对比相同数量的有效字符时,initcap、upper、lower、nls_upper和nls_lower函数性能劣化程度与数据中0字符个数紧密相关,即0字符个数越多,性能劣化越严重。 当support_zero_character=on时,若逻辑解码工具读取到数据中包含的0字符,则会将0字符转换为空格后进行打印输出(原表现为0字符后数据被截断)。 表11 0字符支持的系统函数和高级包函数列表 序号 函数名/高级包函数名 1 btrim(string text [, characters text]) 2 char_length(string) 或 character_length(string) 3 chr(cvalue int|bigint) 4 chr(integer) 5 coalesce(expr1, expr2, ..., exprn) 6 concat(str1,str2) 7 concat_ws(sep text, str"any" [, str"any" [, ...] ]) 8 convert(string bytea, src_encoding name, dest_encoding name) 9 convert_from(string bytea, src_encoding name) 10 convert_to(string text, dest_encoding name) 11 decode(base_expr, compare1, value1, Compare2,value2, … default) 12 dump(expr[, return_fmt [, start_position [, length ] ] ]) 13 encode(data bytea, format text) 14 format(formatstr text [, str"any" [, ...] ]) 15 greatest(expr1 [, ...]) 16 group_concat([DISTINCT | ALL] expression [,expression ...] [ORDER BY { expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ] } [,...]] [SEPARATOR str_val]) 17 initcap(string) 18 instr(string,substring[,position,occurrence]) instr(text,text,int,int) 19 instrb(text,text,int,int) 20 least(expr1 [, ...]) 21 left(str text, n int) 22 length(string) length(string bytea, encoding name ) 23 lengthb(text/bpchar) 24 listagg(expression [, delimiter]) WITHIN GROUP(ORDER BY order-list) 25 lower(string) 26 lpad(string text, length int [, fill text]) 27 ltrim(string [, characters]) 28 nls_lower(string [, nlsparam]) 29 nls_upper(string [, nlsparam]) 30 nullif(expr1, expr2) 31 nvl( expr1 , expr2 ) 32 nvl2( expr1 , expr2,expr3 ) 33 overlay(string placing string FROM int [for int]) 34 position(substring in string) 35 quote_nullable(string text) 36 regexp_count(string text, pattern text [, position int [, flags text]]) 37 regexp_instr(string text, pattern text [, position int [, occurrence int [, return_opt int [, flags text]]]]) 38 regexp_like(text,text,text) regexp_like(source_string, pattern [, match_parameter]) 39 regexp_matches(string text, pattern text [, flags text]) 40 regexp_replace(string, pattern, replacement [,flags ]) 41 regexp_split_to_array(string text, pattern text [, flags text ]) 42 regexp_split_to_table(string text, pattern text [, flags text]) 43 regexp_substr(source_char, pattern) regexp_substr(string text, pattern text [, position int [, occurrence int [, flags text]]]) 44 repeat(string text, number int ) 45 replace(string text, from text, to text) replace(string, substring) 46 reverse(str) 47 right(str text, n int) 48 rpad(string text, length int [, fill text]) 49 rtrim(string [, characters]) 50 similar_escape(pat text, esc text) 51 split_part(string text, delimiter text, field int) 52 string [NOT] LIKE pattern [ESCAPE escape-character] 53 string || string 或 string || non-string 或 non-string || string 54 string_agg(expression, delimiter) 55 strpos(string, substring) 56 substr(string,from) substr(bytea,from,count) substr(string,from,count) 57 substrb(text,int) substrb(text,int,int) 58 substring(string [from int] [for int]) substring(string from pattern for escape) substring(string from pattern) substring_inner(string [from int] [for int]) 59 translate(string text, from text, to text) 60 trim([leading |trailing |both] [characters] from string) 61 unistr(string) 62 upper(string) 63 PKG_UTIL.LOB_GET_LENGTH 64 PKG_UTIL.LOB_READ 65 PKG_UTIL.LOB_WRITE 66 PKG_UTIL.LOB_APPEND 67 PKG_UTIL.LOB_COMPARE 68 PKG_UTIL.LOB_MATCH 69 PKG_UTIL.LOB_READ_HUGE 70 PKG_UTIL.LOB_WRITEAPPEND_HUGE 71 PKG_UTIL.LOB_APPEND_HUGE 72 PKG_UTIL.LOB_COPY_HUGE 73 PKG_UTIL.LOB_CONVERTTOBLOB_HUGE 74 PKG_UTIL.IO_PRINT 75 PKG_UTIL.RAW_CAST_FROM_VARCHAR2 76 PKG_UTIL.FILE_READ 77 PKG_UTIL.FILE_REA DLI NE 78 PKG_UTIL.APP_READ_CLIENT_INFO 79 PKG_UTIL.APP_SET_CLIENT_INFO 80 PKG_UTIL.LOB_CONVERTTOBLOB 81 PKG_UTIL.LOB_CONVERTTOCLOB 82 PKG_UTIL.MATCH_EDIT_DISTANCE_SIMILARITY 83 PKG_UTIL.RAW_CAST_TO_VARCHAR2 84 PKG_UTIL.APP_SET_MODULE 85 PKG_UTIL.APP_READ_MODULE 86 PKG_UTIL.APP_SET_ACTION 87 PKG_UTIL.APP_READ_ACTION 88 DBE_OUTPUT.PRINT_LINE 89 DBE_OUTPUT.PRINT 90 DBE_OUTPUT.GET_LINE 91 DBE_OUTPUT.GET_LINES 92 DBE_OUTPUT.PUT 93 DBE_OUTPUT.PUT_LINE 94 DBE_UTILITY.CANONICALIZE 95 DBE_UTILITY.COMMA_TO_TABLE 96 DBE_UTILITY.NAME_TOKENIZE 97 DBE_UTILITY.TABLE_TO_COMMA 98 DBE_UTILITY.CANONICALIZE_RET 99 DBE_UTILITY.COMMA_TO_TABLE_FUNC 100 DBE_UTILITY.NAME_SEPARATE 101 DBE_UTILITY.NAME_TOKENIZE_FUNC 102 DBE_UTILITY.NAME_TOKENIZE_LOWER 103 DBE_UTILITY.NAME_TOKENIZE_LOWER_FUNC 104 DBE_UTILITY.TABLE_TO_COMMA_FUNC 表12 入参包含0字符进行报错处理的函数 序号 高级包函数名 1 PKG_UTIL.SESSION_SET_CONTEXT 2 PKG_UTIL.UTILITY_COMPILE_SCHEMA 3 PKG_UTIL.GS_COMPILE_SCHEMA 4 DBE_UTILITY.NAME_RESOLVE 5 DBE_UTILITY.COMPILE_SCHEMA 6 DBE_UTILITY.SEARCH_CLASS_WITH_NSPOID_ONAME_TYPE 7 DBE_UTILITY.SEARCH_OBJE CTS 8 DBE_UTILITY.SEARCH_OBJECTS_SYNONYM_FILL_SCHEMA 9 DBE_UTILITY.SEARCH_PROCEDURE_WITH_NSPOID_ONAME 10 DBE_UTILITY.SEARCH_SYNONYM_WITH_NSPOID_ONAME
  • max_allowed_packet 参数说明:M-Compatibility模式数据库行为配置项,用于表示字符串函数返回值上限。若实际结果超过该上限,则会告警,并返回NULL值。 参数类型:整型 参数单位:字节 取值范围:1024 ~ 1073741824(取值只能是1024的倍数,非倍数时将向下舍入到最接近的倍数)。 默认值:4194304 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。
  • div_precision_increment 参数说明:M-Compatibility模式数据库行为配置项。用于设置除法结果的精度提升值,即除法运算结果的小数位数等于被除数的小数位数加上该参数值。 参数类型:整型 参数单位:无 取值范围:0 ~ 30 默认值:4。 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改,避免出现意料之外的结果。
共100000条