云服务器内容精选

  • 示例 创建表reason_update: 1 2 3 4 5 6 CREATE TABLE reason_update ( TABLE_SK INTEGER , TABLE_ID VARCHAR(20) , TABLE_NA VARCHAR(20) )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE=ON); 向表reason_update中插入数据: 1 INSERT INTO reason_update VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB'); 对表reason_update执行UPDATE操作: 1 UPDATE reason_update SET TABLE_NA = 'TeacherD' where TABLE_SK = 3;
  • 参数说明 plan_hint子句 以/*+ */的形式在关键字后,用于对指定语句块生成的计划进行hint调优,详细用法请参见使用Plan Hint进行调优。 table_name 要更新的表名,可以使用模式修饰。 取值范围:已存在的表名称。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 expression 赋给字段的值或表达式。 DEFAULT 用对应字段的缺省值填充该字段。 如果没有缺省值,则为NULL。 from_list 一个表的表达式列表,允许在WHERE条件里使用其他表的字段。与在一个SELECT语句的FROM子句里声明表列表类似。 目标表绝对不能出现在from_list里,除非在使用一个自连接(此时它必须以from_list的别名出现)。 condition 一个返回boolean类型结果的表达式。只有这个表达式返回true的行才会被更新。
  • 语法格式 1 2 3 4 UPDATE [/*+ plan_hint */] [ ONLY ] table_name [ * ] [ [ AS ] alias ] SET {column_name = { expression | DEFAULT } |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...] [ FROM from_list] [ WHERE condition ];
  • 示例 创建进行MERGE INTO的目标: 1 2 CREATE TABLE target(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON); INSERT INTO target VALUES(1, 1),(2, 2); 创建数据源表: 1 2 CREATE TABLE source(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON); INSERT INTO source VALUES(1, 1),(2, 2),(3, 3),(4, 4),(5, 5); 执行MERGE INTO操作: 1 2 3 4 5 6 7 MERGE INTO target t USING source s ON (t.a = s.a) WHEN MATCHED THEN UPDATE SET t.b = t.b + 1 WHEN NOT MATCHED THEN INSERT VALUES (s.a, s.b) WHERE s.b % 2 = 0;
  • 参数说明 INTO子句 指定正在更新或插入的目标表。 table_name 目标表的表名。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 USING子句 指定源表,源表可以为表、视图或子查询。 ON子句 关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。ON关联条件可以是ctid, xc_node_id, tableoid这三个系统列。 WHEN MATCHED子句 当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。 不支持更新分布列、系统表以及系统列。 WHEN NOT MATCHED子句 当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。 不支持INSERT子句中包含多个VALUES。 WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省。 不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 MERGE INTO table_name [ [ AS ] alias ] USING { { table_name | view_name } | subquery } [ [ AS ] alias ] ON ( condition ) [ WHEN MATCHED THEN UPDATE SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] [ WHERE condition ] ] [ WHEN NOT MATCHED THEN INSERT { DEFAULT VALUES | [ ( column_name [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } ];
  • 列存表的Delta表差异 表1 HStore表与列存表的辅助Delta表差异 数仓类型 列存的delta表 HStore的delta表 表结构 与列存主表的表定义一致。 与主表表定义不一样。 功能 用于暂存小批量insert的数据,满阈值后再merge到主表,避免直接insert到主表产生大量小CU。 用于持久化存储update/delete/insert信息。在故障拉起后用于恢复内存更新链等管理并发更新的内存结构。 缺陷 来不及merge导致delta表膨胀,影响查询性能,同时无法解决并发update的锁冲突问题。 依赖后台常驻autovacuum来做merge操作。
  • 参数说明 IF NOT EXISTS 指定IF NOT EXISTS时,如果不存在同名表,则可以成功创建表。如果已存在同名表,创建时不会报错,仅会提示该表已存在并跳过创建。 table_name 要创建的表名。 表名长度不超过63个字符,以字母或下划线开头,可包含字母、数字、下划线、$、#。 column_name 新表中要创建的字段名。 字段名长度不超过63个字符,以字母或下划线开头,可包含字母、数字、下划线、$、#。 data_type 字段的数据类型。 LIKE source_table [ like_option ... ] LIKE子句声明一个表,新表自动从这个表中继承所有字段名及其数据类型。 新表与原表之间在创建动作完毕之后是完全无关的。在原表做的任何修改都不会传播到新表中,并且也不可能在扫描原表的时候包含新表的数据。 被复制的列并不使用相同的名字进行融合。如果明确的指定了相同的名字或者在另外一个LIKE子句中,将会报错。 HStore表只能从HStore表中进行继承。 WITH ( { storage_parameter = value } [, ... ] ) 这个子句为表指定一个可选的存储参数。 ORIENTATION 指定表数据的存储方式,即时序方式、行存方式和列存方式,该参数设置成功后就不再支持修改。对于HStore表,应当使用列存方式,同时设置enable_hstore为on。 取值范围: TIMESERIES:表示表的数据将以时序方式存储。 COLUMN:表示表的数据将以列存方式存储。 ROW:表示表的数据将以行方式存储。 默认值:ROW COMPRESSION 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。 取值范围: HStore表列存表的有效值为YES/NO和/LOW/MIDDLE/HIGH,默认值为LOW。当设置为YES时,压缩级别默认为LOW。 暂不支持行存表压缩功能。 ORC格式迁移到 GaussDB (DWS)列存表,如果使用low级别压缩,单副本大小大约是ORC的1.5~2倍;如果使用high级别压缩,单副本大小基本与ORC持平,在新建GaussDB(DWS)集群规模时,需考虑该转换关系。 列存middle压缩固定使用字典压缩,对于数据特征不适合字典压缩的数据,使用middle压缩的结果可能比low压缩更大。 GaussDB(DWS)内部提供如下压缩算法。 表2 列存压缩算法 COMPRESSION NUMERIC STRING INT LOW delta压缩+RLE压缩 lz4压缩 delta压缩(RLE可选) MIDDLE delta压缩+RLE压缩+lz4压缩 dict压缩或lz4压缩 delta压缩或lz4压缩(RLE可选) HIGH delta压缩+RLE压缩+zlib压缩 dict压缩或zlib压缩 delta压缩或zlib压缩(RLE可选) COMPRESSLEVEL 指定表数据同一压缩级别下的不同压缩水平,它决定了同一压缩级别下表数据的压缩比以及压缩时间。对同一压缩级别进行了更加详细的划分,为用户选择压缩比和压缩时间提供了更多的空间。总体来讲,此值越大,表示同一压缩级别下压缩比越大,压缩时间越长;反之亦然。该参数只对时序表和列存表有效。 取值范围:0~3 默认值:0 MAX_BATCHROW 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对时序表和列存表有效。 取值范围:10000~60000 默认值:60000 PARTIAL_CLUSTER_ROWS 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对时序表和列存表有效。 取值范围:600000~2147483647 enable_delta 指定了在列存表是否开启delta表。对HStore表不能开启该参数。 默认值:off enable_hstore 指定了是否创建为H-Store表(基于列存表实现)。该参数只对列存表有效。该参数仅8.2.0.100及以上集群版本支持。云原生3.0暂不支持该参数。 默认值:off 打开该参数时必须设置以下GUC参数用于保证H-Store表的清理,推荐值如下: autovacuum=true,autovacuum_max_workers=6,autovacuum_max_workers_hstore=3。 SUB_PARTITION_COUNT 指定二级分区的个数。该参数用于设置在导入阶段二级分区个数。在建表时进行设置,建表后不支持修改。不建议用户随意设置该默认值,可能会影响导入和查询的性能。 取值范围:1~1024 默认值:32 DELTAROW_THRESHOLD 指定HStore表导入时小于多少行(SUB_PARTITION_COUNT * DELTAROW_THRESHOLD)的数据进入delta表。 取值范围:0~60000 默认值:60000 COLVERSION 指定存储格式的版本。 HStore表只支持2.0版本。 取值范围: 1.0:列存表的每列以一个单独的文件进行存储,文件名以relfilenode.C1.0、relfilenode.C2.0、relfilenode.C3.0等命名。 2.0:列存表的每列合并存储在一个文件中,文件名以relfilenode.C1.0命名。 默认值:2.0 DISTRIBUTE BY 指定表如何在节点之间分布或者复制。 取值范围: HASH (column_name ) :对指定的列进行Hash,通过映射,把数据分布到指定DN。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } TO GROUP指定创建表所在的Node Group,目前不支持hdfs表使用。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 PARTITION BY 指定HStore表的初始分区。
  • 示例 创建简单的HStore表: CREATE TABLE warehouse_t1 ( W_WAREHOUSE_SK INTEGER NOT NULL, W_WAREHOUSE_ID CHAR(16) NOT NULL, W_WAREHOUSE_NAME VARCHAR(20) , W_WAREHOUSE_SQ_FT INTEGER , W_STREET_NUMBER CHAR(10) , W_STREET_NAME VARCHAR(60) , W_STREET_TYPE CHAR(15) , W_SUITE_NUMBER CHAR(10) , W_CITY VARCHAR(60) , W_COUNTY VARCHAR(30) , W_STATE CHAR(2) , W_ZIP CHAR(10) , W_COUNTRY VARCHAR(20) , W_GMT_OFFSET DECIMAL(5,2) )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE=ON); CREATE TABLE warehouse_t2 (LIKE warehouse_t1 INCLUDING ALL);
  • 注意事项 创建HStore表的用户需要拥有schema cstore的USAGE权限。 表级参数enable_delta与enable_hstore无法同时开启,因为enable_delta用于控制普通列存表的delta开启,会与enable_hstore冲突。 每一个HStore表绑定一张delta表,delta表的oid记录在pg_class中reldeltaidx字段(reldelta字段被列存表的delta表使用)。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE [ IF NOT EXISTS ] table_name ({ column_name data_type | LIKE source_table [like_option [...] ] } } [, ... ]) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY HASH ( column_name [,...])] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] [ PARTITION BY { {RANGE (partition_key) ( partition_less_than_item [, ... ] )} } [ { ENABLE | DISABLE } ROW MOVEMENT ] ]; 其中like选项like_option为: { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL }
  • 参数说明 plan_hint子句 以/*+ */的形式在关键字后,用于对指定语句块生成的计划进行hint调优,详细用法请参见使用Plan Hint进行调优 table_name 要更新的表名,可以使用模式修饰。 取值范围:已存在的表名称。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 expression 赋给字段的值或表达式。 DEFAULT 用对应字段的缺省值填充该字段。 如果没有缺省值,则为NULL。 from_list 一个表的表达式列表,允许在WHERE条件里使用其他表的字段。与在一个SELECT语句的FROM子句里声明表列表类似。 目标表绝对不能出现在from_list里,除非在使用一个自连接(此时它必须以from_list的别名出现)。 condition 一个返回boolean类型结果的表达式。只有这个表达式返回true的行才会被更新。
  • 示例 创建表reason_update: 1 2 3 4 5 6 CREATE TABLE reason_update ( TABLE_SK INTEGER , TABLE_ID VARCHAR(20) , TABLE_NA VARCHAR(20) )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE=ON); 向表reason_update中插入数据: 1 INSERT INTO reason_update VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB'); 对表reason_update执行UPDATE操作: 1 UPDATE reason_update SET TABLE_NA = 'TeacherD' where TABLE_SK = 3;
  • 语法格式 1 2 3 4 UPDATE [/*+ plan_hint */] [ ONLY ] table_name [ * ] [ [ AS ] alias ] SET {column_name = { expression | DEFAULT } |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...] [ FROM from_list] [ WHERE condition ];
  • 参数说明 DISTINCT [ ON ( expression [, ...] ) ] 从SELECT的结果集中删除所有重复的行,使结果集中的每行都是唯一的。 ON ( expression [, ...] ) 只保留那些在给出的表达式上运算出相同结果的行集合中的第一行。 SELECT列表 指定查询表中列名,可以是部分列或者是全部(使用通配符*表示)。 通过使用子句AS output_name可以为输出字段取个别名,这个别名通常用于输出字段的显示。 FROM子句 为SELECT声明一个或者多个源表。 FROM子句涉及的元素如下所示。 WHERE子句 WHERE子句构成一个行选择表达式,用来缩小SELECT查询的范围。condition是返回值为布尔型的任意表达式,任何不满足该条件的行都不会被检索。 WHERE子句中可以通过指定"(+)"操作符的方法将表的连接关系转换为外连接。但是不建议用户使用这种用法,因为这并不是SQL的标准语法,在做平台迁移的时候可能面临语法兼容性的问题。同时,使用"(+)"有很多限制: GROUP BY子句 将查询结果按某一列或多列的值分组,值相等的为一组。 HAVING子句 与GROUP BY子句配合用来选择特殊的组。HAVING子句将组的一些属性与一个常数值比较,只有满足HAVING子句中的逻辑表达式的组才会被提取出来。 ORDER BY子句 对SELECT语句检索得到的数据进行升序或降序排序。对于ORDER BY表达式中包含多列的情况: