华为云用户手册

  • 注意事项 LOCK TABLE只能在一个事务块的内部有用,因为锁在事务结束时就会被释放。出现在任意事务块外面的LOCK TABLE都会报错。 如果没有声明锁模式,缺省为最严格的模式AC CES S EXCLUSIVE。 LOCK TABLE ... IN ACCESS SHARE MODE需要在目标表上有SELECT权限。所有其他形式的LOCK需要UPDATE和/或DELETE权限。 没有UNLOCK TABLE命令,锁总是在事务结束时释放。 LOCK TABLE只处理表级的锁,因此那些带“ROW”字样的锁模式都是有歧义的。这些模式名称通常可理解为用户试图在一个被锁定的表中获取行级的锁。同样,ROW EXCLUSIVE模式也是一个可共享的表级锁。注意,只要是涉及到LOCK TABLE,所有锁模式都有相同的语意,区别仅在于规则中锁与锁之间是否冲突,规则请参见表1。 如果没有打开xc_maintenance_mode参数,那么对系统表申请ACCESS EXCLUSIVE级别锁将报错。 自动CANCEL业务接口只允许重分布工具使用。
  • 示例 -- 创建表空间reason_table_spacegaussdb=# CREATE TABLESPACE REASON_TABLE_SPACE1 owner tpcds RELATIVE location 'tablespace/tsp_reason1';-- 在表空间创建表tpcds.reason_t1gaussdb=# CREATE TABLE tpcds.reason_t1 ( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) with(storage_type=ustore) tablespace reason_table_space1;-- 在表空间创建表tpcds.reason_t2gaussdb=# CREATE TABLE tpcds.reason_t2 ( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) with(storage_type=ustore) tablespace reason_table_space1;-- 在表空间创建表tpcds.reason_t3gaussdb=# CREATE TABLE tpcds.reason_t3 ( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) with(storage_type=ustore) tablespace reason_table_space1;-- 对表tpcds.reason_t1创建索引gaussdb=# CREATE INDEX index_t1 on tpcds.reason_t1(r_reason_id); gaussdb=# DROP TABLE tpcds.reason_t1;gaussdb=# DROP TABLE tpcds.reason_t2;gaussdb=# DROP TABLE tpcds.reason_t3;--查看回收站gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- BIN$16409$2CEE988==$0 | reason_t1 | 16408 BIN$16412$2CF2188==$0 | reason_t2 | 16408 BIN$16415$2CF2EC8==$0 | reason_t3 | 16408 BIN$16418$2CF3EC8==$0 | index_t1 | 0(4 rows)--PURGE清除表gaussdb=# PURGE TABLE tpcds.reason_t3;gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- BIN$16409$2CEE988==$0 | reason_t1 | 16408 BIN$16412$2CF2188==$0 | reason_t2 | 16408 BIN$16418$2CF3EC8==$0 | index_t1 | 0(3 rows)--PURGE清除索引gaussdb=# PURGE INDEX tindex_t1;gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- BIN$16409$2CEE988==$0 | reason_t1 | 16408 BIN$16412$2CF2188==$0 | reason_t2 | 16408(2 rows)--PURGE清除回收站所有对象gaussdb=# PURGE recyclebin;gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+---------------(0 rows)
  • 示例 --创建一个普通表gaussdb=# CREATE TABLE my_table (c1 int, c2 int);--创建增量物化视图gaussdb=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table;--基表写入数据gaussdb=# INSERT INTO my_table VALUES(1,1),(2,2);--对增量物化视图my_imv进行增量刷新gaussdb=# REFRESH INCREMENTAL MATERIALIZED VIEW my_imv;
  • 注意事项 清除(PURGE)操作支持:表(PURGE TABLE)、索引(PURGE INDEX)、回收站(PURGE RECYCLEBIN)。 执行PURGE操作的权限要求如下: PURGE TABLE:用户必须是表的所有者,且用户必须拥有表所在模式的USAGE权限,系统管理员默认拥有此权限。 PURGE INDEX:用户必须是索引的所有者,用户必须拥有索引所在模式的USAGE权限,系统管理员默认拥有此权限。 PURGE RECYCLEBIN:普通用户只能清理回收站中当前用户拥有的对象,且用户必须拥有对象所在模式的USAGE权限,系统管理员默认可以清理回收站所有对象。
  • 功能描述 FETCH通过已创建的游标来检索数据。 每个游标都有一个供FETCH使用的关联位置。游标的关联位置可以在查询结果的第一行之前,或者在结果中的任意行,或者在结果的最后一行之后: 游标刚创建完之后,关联位置在第一行之前的。 在抓取了一些移动行之后,关联位置在检索到的最后一行上。 如果FETCH抓取完了所有可用行,它就停在最后一行后面,或者在反向抓取的情况下是停在第一行前面。 FETCH ALL或FETCH BACKWARD ALL将总是把游标的关联位置放在最后一行或者在第一行前面。
  • 注意事项 如果游标定义了NO SCROLL,则不允许使用例如FETCH BACKWARD之类的反向抓取。 NEXT,PRIOR,FIRST,LAST,ABSOLUTE,RELATIVE形式在恰当地移动游标之后抓取一条记录。如果后面没有数据行,就返回一个空的结果,此时游标就会停在查询结果的最后一行之后(向后查询时)或者第一行之前(向前查询时)。 FORWARD和BACKWARD形式在向前或者向后移动的过程中抓取指定的行数,然后把游标定位在最后返回的行上;或者是,如果count大于可用的行数,则在所有行之后(向后查询时)或者之前(向前查询时)。 RELATIVE 0,FORWARD 0,BACKWARD 0都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚抓取过的行。除非游标定位在第一行之前或者最后一行之后,这个动作都应该成功,而在那两种情况下,不返回任何行。 当FETCH的游标上涉及列存表时,不支持BACKWARD、PRIOR、FIRST等涉及反向获取操作。 当FETCH的游标上涉及非系统表时,不支持BACKWARD、PRIOR、FIRST等涉及反向获取操作。
  • 语法格式 FETCH [ direction { FROM | IN } ] cursor_name; 其中direction子句为可选参数。 1 2 3 4 5 6 7 8 91011121314 NEXT | PRIOR | FIRST | LAST | ABSOLUTE count | RELATIVE count | count | ALL | FORWARD | FORWARD count | FORWARD ALL | BACKWARD | BACKWARD count | BACKWARD ALL
  • 示例 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 --SELECT语句,用一个游标读取一个表。开始一个事务。gaussdb=# START TRANSACTION;--建立一个名为cursor1的游标。gaussdb=# CURSOR cursor1 FOR SELECT * FROM tpcds.customer_address ORDER BY 1;--抓取头3行到游标cursor1里。gaussdb=# FETCH FORWARD 3 FROM cursor1; ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_location_type ---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+---------------------- 1 | AAAAAAAABAAAAAAA | 18 | Jackson | Parkway | Suite 280 | Fairfield | Maricopa County | AZ | 86192 | United States | -7.00 | condo 2 | AAAAAAAACAAAAAAA | 362 | Washington 6th | RD | Suite 80 | Fairview | Taos County | NM | 85709 | United States | -7.00 | condo 3 | AAAAAAAADAAAAAAA | 585 | Dogwood Washington | Circle | Suite Q | Pleasant Valley | York County | PA | 12477 | United States | -5.00 | single family (3 rows)--关闭游标并提交事务。gaussdb=# CLOSE cursor1;--结束一个事务。gaussdb=# END;--VALUES子句,用一个游标读取VALUES子句中的内容。开始一个事务。gaussdb=# START TRANSACTION;--建立一个名为cursor2的游标。gaussdb=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1;--抓取头2行到游标cursor2里。gaussdb=# FETCH FORWARD 2 FROM cursor2;column1 | column2---------+---------0 | 31 | 2(2 rows)--关闭游标并提交事务。gaussdb=# CLOSE cursor2;--结束一个事务。gaussdb=# END;--WITH HOLD游标的使用,开启事务。gaussdb=# START TRANSACTION;--创建一个with hold游标。gaussdb=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM tpcds.customer_address ORDER BY 1;--抓取头2行到游标cursor1里。gaussdb=# FETCH FORWARD 2 FROM cursor1; ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_location_type ---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+---------------------- 1 | AAAAAAAABAAAAAAA | 18 | Jackson | Parkway | Suite 280 | Fairfield | Maricopa County | AZ | 86192 | United States | -7.00 | condo 2 | AAAAAAAACAAAAAAA | 362 | Washington 6th | RD | Suite 80 | Fairview | Taos County | NM | 85709 | United States | -7.00 | condo (2 rows)--结束事务。gaussdb=# END;--抓取下一行到游标cursor1里。gaussdb=# FETCH FORWARD 1 FROM cursor1; ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_location_type ---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+---------------------- 3 | AAAAAAAADAAAAAAA | 585 | Dogwood Washington | Circle | Suite Q | Pleasant Valley | York County | PA | 12477 | United States | -5.00 | single family (1 row)--关闭游标。gaussdb=# CLOSE cursor1;
  • 参数说明 direction_clause 定义抓取数据的方向。 取值范围: NEXT(缺省值) 从当前关联位置开始,抓取下一行。 PRIOR 从当前关联位置开始,抓取上一行。 FIRST 抓取查询的第一行(和ABSOLUTE 1相同)。 LAST 抓取查询的最后一行(和ABSOLUTE -1相同)。 ABSOLUTE count 抓取查询中第count行。 ABSOLUTE抓取不会比用相对位移移动到需要的数据行更快,因为下层的实现必须遍历所有中间的行。 count取值范围:有符号的整数 count为正数,就从查询结果的第一行开始,抓取第count行。当count小于当前游标位置时,涉及到rewind操作,暂不支持。 count为负数或0,涉及到反向扫描操作,暂不支持。 RELATIVE count 从当前关联位置开始,抓取随后或前面的第count行。 取值范围:有符号的整数 count为正数就抓取当前关联位置之后的第count行。 count为负数或0,涉及到反向扫描操作,暂不支持。 如果当前行没有数据的话,RELATIVE 0返回空。 count 抓取随后的count行(和FORWARD count一样)。 ALL 从当前关联位置开始,抓取所有剩余的行(和FORWARD ALL一样)。 FORWARD 抓取下一行(和NEXT一样)。 FORWARD count 与RELATIVE count的效果相同,从当前关联位置开始,抓取随后或前面的第count行。 FORWARD ALL 从当前关联位置开始,抓取所有剩余行。 BACKWARD 从当前关联位置开始,抓取前面一行(和PRIOR一样) 。 BACKWARD count 从当前关联位置开始,抓取前面的count行(向后扫描)。 取值范围:有符号的整数 count为正数就抓取当前关联位置之前的第count行。 count为负数就抓取当前关联位置之后的第abs(count)行。 如果有数据的话,BACKWARD 0重新抓取当前行。 BACKWARD ALL 从当前关联位置开始,抓取所有前面的行(向后扫描) 。 { FROM | IN } cursor_name 使用关键字FROM或IN指定游标名称。 取值范围:已创建的游标的名称。
  • 功能描述 为当前事务做两阶段提交的准备。 在命令之后,事务就不再和当前会话关联了;它的状态完全保存在磁盘上,它被提交成功的可能性非常高,即使是在请求提交之前数据库发生了崩溃也如此。 一旦准备好了,一个事务就可以在稍后用COMMIT PREPARED或 ROLLBACK PREPARED命令分别进行提交或者回滚。这些命令可以从任何会话中发出,而不光是最初执行事务的那个会话。 从发出命令的会话的角度来看,PREPARE TRANSACTION不同于ROLLBACK:在执行它之后,就不再有活跃的当前事务了,并且预备事务的效果无法见到 (在事务提交的时候其效果会再次可见)。 如果PREPARE TRANSACTION因为某些原因失败,那么它就会变成一个ROLLBACK,当前事务被取消。
  • 语法格式 1 MOVE [ direction [ FROM | IN ] ] cursor_name; 其中direction子句为可选参数。 1 2 3 4 5 6 7 8 91011121314 NEXT | PRIOR | FIRST | LAST | ABSOLUTE count | RELATIVE count | count | ALL | FORWARD | FORWARD count | FORWARD ALL | BACKWARD | BACKWARD count | BACKWARD ALL
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718192021222324 --开始一个事务。gaussdb=# START TRANSACTION;--定义一个名为cursor1的游标。gaussdb=# CURSOR cursor1 FOR SELECT * FROM tpcds.reason;--忽略游标cursor1的前3行。gaussdb=# MOVE FORWARD 3 FROM cursor1;--抓取游标cursor1的前4行。gaussdb=# FETCH 4 FROM cursor1; r_reason_sk | r_reason_id | r_reason_desc -------------+------------------+------------------------------------------------------------------------------------------------------ 4 | AAAAAAAAEAAAAAAA | Not the product that was ordred 5 | AAAAAAAAFAAAAAAA | Parts missing 6 | AAAAAAAAGAAAAAAA | Does not work with a product that I have 7 | AAAAAAAAHAAAAAAA | Gift exchange (4 rows)--关闭游标。gaussdb=# CLOSE cursor1;--结束一个事务。gaussdb=# END;
  • 功能描述 创建一个预备语句。 预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用DEALLOCATE进行删除,会话结束时,PREPARE也会自动删除。
  • 参数说明 statement 指定要分析的SQL语句。 ANALYZE boolean | ANALYSE boolean 显示实际运行时间和其他统计数据。 取值范围: TRUE(缺省值):显示实际运行时间和其他统计数据。 FALSE:不显示。 VERBOSE boolean 显示有关计划的额外信息。 取值范围: TRUE(缺省值):显示额外信息。 FALSE:不显示。 COSTS boolean 包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。 取值范围: TRUE(缺省值):显示估计总成本和宽度。 FALSE:不显示。 CPU boolean 打印CPU的使用情况的信息。需要结合analyze选项一起使用。 取值范围: TRUE(缺省值):显示CPU的使用情况。 FALSE:不显示。 DETAIL boolean 打印DN上的信息。需要结合analyze选项一起使用。 取值范围: TRUE(缺省值):打印DN的信息。 FALSE:不打印。 NODES boolean 打印query执行的节点信息。 取值范围: TRUE(缺省值):打印执行的节点的信息。 FALSE:不打印。 NUM_NODES boolean 打印执行中的节点的个数信息。 取值范围: TRUE(缺省值):打印DN个数的信息。 FALSE:不打印。 BUFFERS boolean 包括缓冲区的使用情况的信息。需要结合analyze选项一起使用。 取值范围: TRUE:显示缓冲区的使用情况。 FALSE(缺省值):不显示。 TIMING boolean 包括实际的启动时间和花费在输出节点上的时间信息。需要结合analyze选项一起使用。 取值范围: TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。 FALSE:不显示。 PLAN boolean 是否将执行计划存储在plan_table中。当该选项开启时,会将执行计划存储在PLAN_TABLE中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。 取值范围: TRUE(缺省值):将执行计划存储在plan_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUCCESS。 FALSE:不存储执行计划,将执行计划打印到当前屏幕。 BLOCKNAME boolean 是否显示计划的每个操作所处于的查询块。当该选项开启时,会将每个操作所处于的查询快的名字输出在Query Block列上,方便用户获取查询块名字,并使用Hint修改执行计划: TRUE(缺省值):显示计划时,将每个操作所处于的查询快的名字输出在新增列Query Block列上。该选项需要在pretty 模式下使用。见指定Hint所处的查询块Queryblock章节。 FALSE:不对计划显示产生影响。 FORMAT 指定输出格式。 取值范围:TEXT,XML,JSON和YAML。 默认值:TEXT。 PERFORMANCE 使用此选项时,即打印执行中的所有相关信息。下述为部分信息描述: ex c/r:代表平均每行使用cpu周期数,等于(ex cyc)/(ex row)。 ex row:执行行数。 ex cyc:代表使用的cpu周期数。 inc cyc:代表包含子节点使用的总cpu周期数。 shared hit:代表算子的share buffer命中情况。 loops:算子循环执行次数。 total_calls:生成元素总数 remote query poll time stream gather:算子用于侦听各DN数据到达CN的网络poll时间。 deserialize time:反序列化所需时间。 estimated time:估计时间。
  • 语法格式 显示SQL语句的执行计划,支持多种选项,对选项顺序无要求。 1 EXPLAIN [ ( option [, ...] ) ] statement; 其中选项option子句的语法为。 1 2 3 4 5 6 7 8 910111213 ANALYZE [ boolean ] | ANALYSE [ boolean ] | VERBOSE [ boolean ] | COSTS [ boolean ] | CPU [ boolean ] | DETAIL [ boolean ] | NODES [ boolean ] | NUM_NODES [ boolean ] | BUFFERS [ boolean ] | TIMING [ boolean ] | PLAN [ boolean ] | BLOCKNAME [ boolean ] | FORMAT { TEXT | XML | JSON | YAML } 显示SQL语句的执行计划,且要按顺序给出选项。 1 EXPLAIN { [ { ANALYZE | ANALYSE } ] [ VERBOSE ] | PERFORMANCE } statement;
  • 功能描述 显示SQL语句的执行计划。 执行计划将显示SQL语句所引用的表会采用什么样的扫描方式,如:简单的顺序扫描、索引扫描等。如果引用了多个表,执行计划还会显示用到的JOIN算法。 执行计划的最关键的部分是语句的预计执行开销,这是计划生成器估算执行该语句将花费多长的时间。 若指定了ANALYZE选项,则该语句会被执行,然后根据实际的运行结果显示统计数据,包括每个计划节点内时间总开销(毫秒为单位)和实际返回的总行数。这对于判断计划生成器的估计是否接近现实非常有用。
  • 注意事项 表的所有者、拥有表INSERT权限的用户或拥有INSERT ANY TABLE权限的用户,可向表中插入数据,系统管理员默认拥有此权限。 如果使用RETURNING子句,用户必须要有该表的SELECT权限。 对于列存表,暂时不支持RETURNING子句。 如果使用ON DUPLICATE KEY UPDATE,用户必须要有该表的SELECT、UPDATE权限,唯一约束(主键或唯一索引)的SELECT权限。 如果使用query子句插入来自查询里的数据行,用户还需要拥有在查询里使用的表的SELECT权限。 如果使用query子句插入来自查询动态数据脱敏列的数据,插入的结果即为脱敏后的值,无法被还原。 当连接到TD兼容的数据库时,td_compatible_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的insert语句中(不包含外表的场景下),对目标表中char和varchar类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。
  • 优化建议 VALUES 通过insert语句批量插入数据时,建议将多条记录合并入一条语句中执行插入,以提高数据加载性能。例如,INSERT INTO sections VALUES (30, 'Administration', 31, 1900),(40, 'Development', 35, 2000), (50, 'Development' , 60 , 2001); 如果insert多values语句中values的值分布在一个DN上, GaussDB 可以把语句下推到对应DN执行。目前只支持values中值为常量,简单表达式和可下推函数(pg_proc中字段provolatile为'i')。如果表中列带有default值,只支持default值为常量,简单表达式。单values不能下推单DN的语句,多values同样不支持下推。
  • 语法格式 1234567 [ WITH [ RECURSIVE ] with_query [, ...] ]INSERT [/*+ plan_hint */] INTO table_name [ AS alias ] [ ( column_name [, ...] ) ] { DEFAULT VALUES | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | query } [ ON DUPLICATE KEY UPDATE { NOTHING | { column_name = { expression | DEFAULT } } [, ...] [ WHERE condition ] } ] [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ];
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 其中with_query的详细格式为: with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ]( {select | values | insert | update | delete} ) – with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 – column_name指定子查询结果集中显示的列名。 – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 – 用户可以使用MATERIALIZED / NOT MATERIALIZED对CTE进行修饰。 如果声明为MATERIALIZED,WITH查询将被物化,生成一个子查询结果集的拷贝,在引用处直接查询该拷贝,因此WITH子查询无法和主干SELECT语句进行联合优化(如谓词下推、等价类传递等),对于此类场景可以使用NOT MATERIALIZED进行修饰,如果WITH查询语义上可以作为子查询内联执行,则可以进行上述优化。 如果用户没有显示声明物化属性则遵守以下规则:如果CTE只在所属主干语句中被引用一次,且语义上支持内联执行,则会被改写为子查询内联执行,否则以CTE Scan的方式物化执行。 INSERT ON DUPLICATE KEY UPDATE不支持WITH及WITH RECURSIVE子句。 plan_hint子句 以/*+ */的形式在INSERT关键字后,用于对INSERT对应的语句块生成的计划进行hint调优,详细用法请参见章节使用Plan Hint进行调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。 table_name 要插入数据的目标表名。 取值范围:已存在的表名。 column_name 目标表中的字段名: 字段名可以有子字段名或者数组下标修饰。 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据的话,其他字段将是NULL。 目标字段(column_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 如果value子句和query中只提供了N个字段,则目标字段为前N个字段。 value子句和query提供的值在表中从左到右关联到对应列。 取值范围:已存在的字段名。 expression 赋予对应column的一个有效表达式或值: 如果是INSERT ON DUPLICATE KEY UPDATE语句下,expression可以为VALUES(column_name)或EXCLUDED.column_name用来表示引用冲突行对应的column_name字段的值。需注意,其中VALUES(column_name)不支持嵌套在表达式中(例如VALUES(column_name)+1),但EXCLUDED不受此限制。 向表中字段插入单引号 " ' "时需要使用单引号自身进行转义。 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 DEFAULT 对应字段名的缺省值。如果没有缺省值,则为NULL。 query 一个查询语句(SELECT语句),将查询结果作为插入的数据。 RETURNING 返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。注意:INSERT ON DUPLICATE KEY UPDATE不支持RETURNING子句。 output_expression INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 取值范围:该表达式可以使用table的任意字段。可以使用*返回被插入行的所有字段。 output_name 字段的输出名称。 取值范围:字符串,符合标识符命名规范。 ON DUPLICATE KEY UPDATE 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新。如果UPDATE子句为NOTHING,则不做任何操作。 对于不带唯一约束的表,则仅执行插入。 不支持触发器,不会触发目标表的INSERT或UPDATE触发器。 不支持延迟生效(DEFERRABLE)的唯一约束或主键。 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 分布列、唯一索引列不允许UPDATE。 列存表不支持该操作就行。 UPDATE的WHERE子句不支持包含子链接。
  • 优化建议 UN LOG GED 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的内容。 ORIENTATION ROW 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 ORIENTATION COLUMN 创建列存表,列存储适合于 数据仓库 业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。 DISTRIBUTE BY 事实表或者数据量较大的维度表建议创建为分布表。对指定的列进行Hash,通过映射,把数据分布到指定DN。语法为:distribute by hash(column_name)。 数据量较小的维度表建议创建为复制表。表的每条记录存在所有数据节点(DN)中,即每个数据节点都有完整的表数据。语法为: distribute by replication。
  • 语法格式 创建表。 1 2 3 4 5 6 7 8 9101112131415 CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] } [, ... ]) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY { REPLICATION | HASH ( column_name [, ...] ) | 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 [, ... ] ) } ]; 其中列约束column_constraint为: 1 2 3 4 5 6 7 8 91011 [ CONSTRAINT constraint_name ]{ NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | 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为: 123456 [ CONSTRAINT constraint_name ]{ CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) [ index_parameters ] | PRIMARY KEY ( column_name [, ... ] ) [ index_parameters ] | PARTIAL CLUSTER KEY ( column_name [, ... ] ) }[ DEFERRABLE | NOT DEFERRABLE ][ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中like选项like_option为: 1 { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL } 其中RANGE分布规则 slice_less_than_item为:SLICE slice_name VALUES LESS THAN ({ literal | MAXVALUE } [, ...]) [ DATANODE dn_name | ( dn_name [, ... ] ) ]slice_start_end_item为:SLICE slice_name_prefix {{ START ( literal ) END ( literal ) EVERY ( literal ) } |{ START ( literal ) END ( { literal | MAXVALUE } ) } |{ START ( literal ) } |{ END ( { literal | MAXVALUE } ) }} 其中LIST分布规则slice_values_item为: SLICE slice_name VALUES (list_values_item) [DATANODE dn_name | ( dn_name [, ... ] ) ]list_values_item为:{ DEFAULT | { partition_values_list [, ...] } }partition_values_list为:{ (literal [, ...]) } 其中索引参数index_parameters为: 12 [ WITH ( {storage_parameter = value} [, ... ] ) ][ USING INDEX TABLESPACE tablespace_name ]
  • 参数说明 EXPLAIN中的PLAN选项表示需要将计划信息存储于PLAN_TABLE中,存储成功将返回“EXPLAIN SUCCESS”。 用户可通过STATEMENT_ID对查询设置标签,输入的标签信息也将存储于PLAN_TABLE中。 用户在执行EXPLAIN PLAN时,如果没有设置STATEMENT_ID,则默认为空值。同时,用户可输入的STATEMENT_ID最大长度为30个字节,超过长度将会产生报错。
  • 注意事项 EXPLAIN PLAN不支持在DN上执行。 对于执行错误的SQL语句无法进行计划信息的收集。 PLAN_TABLE中的数据是session级生命周期并且session隔离和用户隔离,用户只能看到当前session、当前用户的数据。 PLAN_TABLE无法与GDS外表进行关联查询。 对于不能下推的查询,无法收集到具体的object信息,object只能收集到REMOTE_QUERY或CTE等信息。详见示例 2。
  • 示例 1 2 3 4 5 6 7 8 910111213141516171819202122232425 --查询当前集群的节点分布状态。gaussdb=# SELECT * FROM pgxc_node; node_name | node_type | node_port | node_host | node_port1 | node_host1 | hostis_primary | nodeis_primary | nodeis_preferred | node_id | sctp_port | control_port | sctp_port1 | control_port1 --------------+-----------+-----------+----------------+------------+----------------+----------------+----------------+------------------+-------------+-----------+--------------+------------+--------------- cn_5001 | C | 8050 | 10.180.155.74 | 8050 | 10.180.155.74 | t | f | f | 1120683504 | 0 | 0 | 0 | 0 cn_5003 | C | 8050 | 10.180.157.130 | 8050 | 10.180.157.130 | t | f | f | -125853378 | 0 | 0 | 0 | 0 dn_6001_6002 | D | 40050 | 10.180.155.74 | 45050 | 10.146.187.231 | t | f | f | 1644780306 | 40052 | 40052 | 45052 | 45052 dn_6003_6004 | D | 40050 | 10.146.187.231 | 45050 | 10.180.157.130 | t | f | f | -966646068 | 40052 | 40052 | 45052 | 45052 dn_6005_6006 | D | 40050 | 10.180.157.130 | 45050 | 10.180.155.74 | t | f | f | 868850011 | 40052 | 40052 | 45052 | 45052 cn_5002 | C | 8050 | localhost | 8050 | localhost | t | f | f | -1736975100 | 0 | 0 | 0 | 0(6 rows)--查询dn_6001_6002上tpcds.customer_address记录。gaussdb=# EXECUTE DIRECT ON(dn_6001_6002) 'select count(*) from tpcds.customer_address'; count ------- 16922(1 row)--查询tpcds.customer_address所有记录。gaussdb=# SELECT count(*) FROM tpcds.customer_address; count ------- 50000(1 row)
  • 注意事项 当enable_nonsysadmin_execute_direct=off时,只有系统管理员和监控管理员才能执行EXECUTE DIRECT。 为了各个节点上数据的一致性,SQL语句仅支持SELECT,不允许执行事务语句、DDL、DML。 使用此类型语句在指定的DN执行stddev聚集计算时,返回结果集是以三元数组形式返回,如{3, 8, 30},表示count结果为3,sum结果为8,平方和为30。使用此类型语句在指定的DN执行AVG聚集计算时,返回结果集以二元组形式返回,如{4,2},表示count结果为4,sum结果为2。注意,当数据为列存时,调用avg函数结果未定义,请使用stddev_samp函数。 当指定多个节点时,不支持agg函数,当query中包含agg函数时,会返回“EXECUTE DIRECT on multinode not support agg functions.” 由于CN节点不存储用户表数据,不允许指定CN节点执行用户表上的SELECT查询。 不允许执行嵌套的EXECUTE DIRECT语句,即执行的SQL语句不能同样是EXECUTE DIRECT语句,此时可直接执行最内层EXECUTE DIRECT语句代替。 agg函数查询结果与直接在CN上查询不一致,会返回多个信息,不支持array_avg函数。
  • 示例 1 2 3 4 5 6 7 8 910111213141516171819202122 --创建表reason。gaussdb=# CREATE TABLE tpcds.reason ( CD_DEMO_SK INTEGER NOT NULL, CD_GENDER character(16) , CD_MARITAL_STATUS character(100));--插入数据。gaussdb=# INSERT INTO tpcds.reason VALUES(51, 'AAAAAAAADDAAAAAA', 'reason 51');--创建表reason_t1。gaussdb=# CREATE TABLE tpcds.reason_t1 AS TABLE tpcds.reason;--为一个INSERT语句创建一个预备语句然后执行它。gaussdb=# PREPARE insert_reason(integer,character(16),character(100)) AS INSERT INTO tpcds.reason_t1 VALUES($1,$2,$3);gaussdb=# EXECUTE insert_reason(52, 'AAAAAAAADDAAAAAA', 'reason 52'); --删除表reason和reason_t1。gaussdb=# DROP TABLE tpcds.reason;gaussdb=# DROP TABLE tpcds.reason_t1;
  • 注意事项 须使用CASCADE级联删除依赖用户的对象(除数据库外)。当删除用户的级联对象时,如果级联对象处于锁定状态,则此级联对象无法被删除,直到对象被解锁或锁定级联对象的进程被杀死。 在GaussDB中,存在一个配置参数enable_kill_query,此参数在配置文件postgresql.conf中。此参数影响级联删除用户对象的行为: 当参数enable_kill_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的进程,并删除用户。 当参数enable_kill_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的进程结束之后再删除用户。 在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即drop user不支持跨数据库进行级联删除。 在删除用户时,需要先删除该用户拥有的所有对象并且收回该用户在其他对象上的权限,或者通过指定CASCADE级联删除该用户拥有的对象和被授予的权限。 在多租户场景下,删除组用户时,业务用户也会同时被删除,如果指定CASCADE级联删除,那么删除业务用户时同时也指定CASCADE。如果在删除某个用户失败时,会报错,同时其他用户也无法成功删除。 如果用户下存在创建GDS外表时指定的错误表,则无法通过drop user指定cascade关键字直接删除用户。 如果该用户被DATA SOURCE对象依赖时,无法直接级联删除该用户,需要手动删除对应的DATA SOURCE对象之后再删除该用户。
  • 参数说明 IF EXISTS 如果指定的用户不存在,发出一个notice而不是抛出一个错误。 user_name 待删除的用户名。 取值范围:已存在的用户名。 CASCADE | RESTRICT CASCADE:级联删除依赖用户的对象,并收回授予该用户的权限。 RESTRICT:如果用户还有任何依赖的对象或被授予了其他对象的权限,则拒绝删除该用户(缺省行为)。 在GaussDB中,存在一个配置参数enable_kill_query,此参数在配置文件postgresql.conf中。此参数影响级联删除用户对象的行为: 当参数enable_kill_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的进程,并删除用户。 当参数enable_kill_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的进程结束之后再删除用户。
  • 参数说明 IF EXISTS 如果指定的全文检索词典不存在,那么发出一个Notice而不是报错。 name 要删除的词典名称(可指定模式名,否则默认在当前模式下)。 取值范围:已存在的词典名。 CASCADE 自动删除依赖于该词典的对象,并依次删除依赖于这些对象的所有对象。 如果存在任何一个使用该词典的文本搜索配置,此DROP命令将不会成功。可添加CASCADE以删除引用该词典的所有文本搜索配置以及词典。 RESTRICT 如果任何对象依赖词典,则拒绝删除该词典。这是缺省值。
共100000条