华为云用户手册

  • 注意事项 只有数据库所有者或者被授予了数据库DROP权限的用户有权限执行DROP DATABASE命令,系统管理员默认拥有此权限。 不能对系统默认安装的三个数据库(POSTGRES、TEMPLATE0和TEMPLATE1)执行删除操作,系统做了保护。如果想查看当前服务中有哪几个数据库,可以用gsql的\l命令查看。 如果有用户正在与要删除的数据库连接,则删除操作失败。可以通过视图DV_SESSIONS查看当前有哪些数据库连接。 不能在事务块中执行DROP DATABASE命令。 确定删除数据库前需要执行“CLEAN CONNECTION TO ALL FORCE FOR DATABASE XXXX;”命令,用于强制停止当前已有的用户连接及后台线程,防止因为有后台线程未完全退出而导致的删库失败问题。此处需要注意,强制停止后台线程可能导致当前数据库数据一致性问题,此命令仅在确定删库阶段执行。 如果执行DROP DATABASE失败,事务回滚,需要再次执行一次DROP DATABASE IF EXISTS。 DROP DATABASE一旦执行将无法撤销,请谨慎使用。
  • 示例 对复合类型的修改。 --创建复合类型。 gaussdb=# CREATE TYPE typ_stu AS (name varchar(10),age int); --创建表并插入数据,其中info字段数据类型为typ_stu。 gaussdb=# CREATE TABLE tbl_test (id int PRIMARY KEY,info typ_stu); gaussdb=# INSERT INTO tbl_test VALUES (1,('Jim',16)); --查看tbl_test数据。 gaussdb=# SELECT * FROM tbl_test; id | info ----+---------- 1 | (Jim,16) (1 row) --为复合类型增加一个新的属性。 gaussdb=# ALTER TYPE typ_stu ADD ATTRIBUTE year int CASCADE; --再次查看tbl_test数据,info多了一个属性。 gaussdb=# SELECT * FROM tbl_test; id | info ----+----------- 1 | (Jim,16,) (1 row) --从复合类型删除一个属性。 gaussdb=# ALTER TYPE typ_stu DROP ATTRIBUTE year; 修改类型所有者。 --创建用户test。 gaussdb=# CREATE ROLE test PASSWORD '********'; --修改typ_stu的所有者为test。 gaussdb=# ALTER TYPE typ_stu OWNER TO test; --查询typ_stu拥有者。 gaussdb=# SELECT t1.typname, t2.rolname AS owner FROM pg_type t1, pg_roles t2 WHERE t1.typname = 'typ_stu' AND t1.typowner = t2.oid; typname | owner ---------+-------- typ_stu | test (1 row) 修改类型或是一个复合类型中的一个属性的名称。 --将typ_stu的其中一个属性age重命名为age1。 gaussdb=# ALTER TYPE typ_stu RENAME ATTRIBUTE age to age1; --通过如下SQL查询tbl_test表中年龄为16的数据。 gaussdb=# SELECT id,(info).name,(info).age1 FROM tbl_test WHERE (info).age1 = 16; id | name | age1 ----+------+------ 1 | Jim | 16 (1 row) 将类型移至一个新的模式中。 --创建模式sctest。 gaussdb=# CREATE SCHEMA sctest; --将typ_stu移至模式sc_test中。 gaussdb=# ALTER TYPE typ_stu SET SCHEMA sctest; --查询typ_stu的所属模式。 gaussdb=# \dT sctest.* List of data types Schema | Name | Description --------+----------------+------------- sctest | sctest.typ_stu | (1 row) --删除表。 gaussdb=# DROP TABLE tbl_test; gaussdb=# DROP TYPE sctest.typ_stu; gaussdb=# DROP ROLE test; gaussdb=# DROP SCHEMA sctest; 为枚举类型增加一个新值。 --创建一个枚举类型typ_bugstatus。 gaussdb=# CREATE TYPE typ_bugstatus AS ENUM ('create', 'modify', 'closed'); --创建表tbl_test1。 gaussdb=# CREATE TABLE tbl_test1 (id serial, bugstat typ_bugstatus); --插入数据时bugstat字段必须是枚举类型中的值,否则报错。 gaussdb=# INSERT INTO tbl_test1 (bugstat) VALUES ('closed'); gaussdb=# INSERT INTO tbl_test1 (bugstat) VALUES ('deleted'); ERROR: invalid input value for enum typ_bugstatus: "deleted" LINE 1: INSERT INTO tbl_test1 (bugstat) VALUES ('deleted'); ^ CONTEXT: referenced column: bugstat --查看tbl_test1数据。 gaussdb=# SELECT * FROM tbl_test1; id | bugstat ----+--------- 1 | closed (1 row) --为枚举类型增加一个标签值。 gaussdb=# ALTER TYPE typ_bugstatus ADD VALUE IF NOT EXISTS 'regress' BEFORE 'closed'; --查询。 gaussdb=# \dT+ typ_bugstatus List of data types Schema | Name | Internal name | Size | Elements | Access privileges | Description --------+---------------+---------------+------+----------+-------------------+------------- public | typ_bugstatus | typ_bugstatus | 4 | create +| | | | | | modify +| | | | | | regress +| | | | | | closed | | (1 row) 重命名枚举类型的一个标签值。 --将类型typ_bugstatus中closed修改为close。 gaussdb=# ALTER TYPE typ_bugstatus RENAME VALUE 'closed' TO 'close'; --查看表tbl_test1数据,其中closed的数据也都改成了close。 gaussdb=# SELECT * FROM tbl_test1; id | bugstat ----+--------- 1 | close (1 row) --查询。 gaussdb=# \dT+ typ_bugstatus; List of data types Schema | Name | Internal name | Size | Elements | Access privileges | Description --------+---------------+---------------+------+----------+-------------------+------------- public | typ_bugstatus | typ_bugstatus | 4 | create +| | | | | | modify +| | | | | | regress +| | | | | | close | | (1 row) --删除。 gaussdb=# DROP TABLE tbl_test1; gaussdb=# DROP TYPE typ_bugstatus;
  • 语法格式 修改类型。 1 ALTER TYPE name action [, ... ]; 其中action对应的子句如下: 给复合类型增加新的属性。 1 ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] 从复合类型中删除一个属性。 1 DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ] 改变一种复合类型中某个属性的类型。 1 ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
  • 参数说明 name 一个需要修改的现有类型的名称(可以有模式修饰) 。 new_name 该类型的新名称。 new_owner 新所有者的用户名 。 new_schema 该类型的新模式 。 attribute_name 拟增加、更改或删除的属性的名称。 new_attribute_name 拟改名的属性的新名称。 data_type 拟新增属性的数据类型,或是拟更改的属性的新类型名。 new_enum_value 枚举类型新增加的标签值,是一个非空的长度不超过63个字节的字符串。 neighbor_enum_value 一个已有枚举标签值,新值应该增加在紧接着该枚举值之前或者之后的位置上。 existing_enum_value 现有的要重命名的枚举值,是一个非空的长度不超过63个字节的字符串 CASCADE 自动级联更新需更新类型以及相关联的记录和继承它们的子表。 RESTRICT 如果需联动更新类型是已更新类型的关联记录,则拒绝更新,这是缺省选项。 ADD ATTRIBUTE、DROP ATTRIBUTE和ALTER ATTRIBUTE选项可以组合成一个列表同时处理多个属性更改。 例如,在一条命令中同时增加几个属性或是更改几个属性的类型。 要修改一个类型的模式,必须在新模式上拥有CREATE权限。要修改所有者,必须是新的所有角色的直接或间接成员,并且该成员必须在此类型的模式上有CREATE权限(这些限制了修改所有者不会做任何通过删除和重建类型不能做的事情。但是,三权分立关闭时的系统管理员可以以任何方式修改任意类型的所有权)。要增加一个属性或是修改一个属性的类型,也必须有该类型的USAGE权限。 CURRENT_USER 当前用户。 SESSION_USER 当前系统用户。 COLLATE collation COLLATE子句为该列(必须是一种可排序数据类型)赋予一个排序规则。 如果没有指定,将使用该列数据类型的默认排序规则。
  • 示例 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 26 27 --创建test_jim和test_tom用户。 gaussdb=# CREATE USER test_jim PASSWORD '********'; gaussdb=# CREATE USER test_tom PASSWORD '********'; --查看自动创建的模式的拥有者为同名的用户。 gaussdb=# \dn test* List of schemas Name | Owner ----------+---------- test_jim | test_jim test_tom | test_tom (2 rows) --将所有test_jim拥有的数据库对象的属主更改为test_tom。 gaussdb=# REASSIGN OWNED BY test_jim TO test_tom; --查看schema的信息,test_jim模式的属主更换为test_tom。 gaussdb=# \dn test* List of schemas Name | Owner ----------+---------- test_jim | test_tom test_tom | test_tom (2 rows) --删除test_jim和test_tom用户。 gaussdb=# DROP USER test_jim, test_tom CASCADE;
  • PG_CLASS PG_CLASS系统表存储数据库对象信息及其之间的关系。 表1 PG_CLASS字段 名称 类型 描述 oid oid 行标识符(隐含字段,必须明确选择)。 relname name 表、索引、视图等对象的名称。 relnamespace oid 包含这个关系的名称空间的OID。 reltype oid 对应这个表的行类型的数据类型(索引为零,因为索引没有pg_type记录)。 reloftype oid 复合类型的OID,0表示其他类型。 relowner oid 关系所有者。 relam oid 如果行是索引,则就是所用的访问模式(B-tree等)。 relfilenode oid 这个关系在磁盘上的文件的名称,如果没有则为0。 reltablespace oid 这个关系存储所在的表空间。如果为零,则意味着使用该数据库的缺省表空间。如果关系在磁盘上没有文件,则这个字段没有什么意义。 relpages double precision 以页(大小为BLCKSZ)为单位的该表在磁盘上的大小,它只是优化器用的一个近似值。 reltuples double precision 表中行的数目,只是优化器使用的一个估计值。 relallvisible integer 被标识为全可见的表中的页的数量。此字段是优化器用来做SQL执行优化使用的。VACUUM、ANALYZE和一些DDL语句(例如,CREATE INDEX)会引起此字段更新。 reltoastrelid oid 与该表关联的TOAST表的OID ,如果没有则为0。 TOAST表在一个从属表里“离线”存储大字段。 reltoastidxid oid 对于TOAST表是它的索引的OID,如果不是TOAST表则为0。 relhasindex boolean 如果它是一个表而且至少有(或者最近有过)一个索引,则为真。 它是由CREATE INDEX设置的,但DROP INDEX不会立即将它清除。如果VACUUM线程检测一个表没有索引,将会把它将清理relhasindex字段,将值设置为假。 relisshared boolean 如果该表在整个集群中由所有数据库共享则为真,否则为假。只有某些系统表(比如pg_database)是共享的。 relpersistence "char" p:表示永久表。 u:表示非日志表。 t:表示临时表。 g:表示全局临时表。 relkind "char" r:表示普通表。 i:表示索引。 G:表示全局二级索引。 S:表示序列。 v:表示视图。 t:表示TOAST表。 f:表示外表。 m:表示物化视图。 e:表示STREAM对象。 o:表示CONTVIEW对象。 relnatts smallint 关系中用户字段数目(除了系统字段以外)。在12.2.15.26 PG_ATTRIBUTE里肯定有相同数目对应行。 relchecks smallint 表里的检查约束的数目,参阅12.2.15.30 PG_CONSTRAINT表。 relhasoids boolean 如果为关系中每行都生成一个OID则为真,否则为假。 relhaspkey boolean 如果这个表有一个(或者曾经有一个)主键,则为真,否则为假。 relhasrules boolean 如表有规则就为真。是否有规则可参考系统表12.2.15.63 PG_REWRITE。 relhastriggers boolean True表示表中有触发器,或者曾经有过触发器。系统表12.2.15.72 PG_TRIGGER中记录了表和视图的触发器。 relhassubclass boolean 如果有(或者曾经有)任何继承的子表,为真,否则为假。 relcmprs tinyint 表示是否启用表的压缩特性。需要特别注意,当且仅当批量插入才会触发压缩,普通的CRUD并不能够触发压缩。 0表示其他不支持压缩的表(主要是指系统表,不支持压缩属性的修改操作)。 1表示表数据的压缩特性为NOCOMPRESS或者无指定关键字。 2表示表数据的压缩特性为COMPRESS。 relrowmovement boolean 针对分区表进行update操作时,是否允许行迁移。 true:表示允许行迁移。 false:表示不允许行迁移。 parttype "char" 表或者索引是否具有分区表的性质。 p:表示带有分区表性质。 n:表示没有分区表特性。 relfrozenxid xid32 该表中所有在这个之前的事务ID已经被一个固定的("frozen")事务ID替换。该字段用于跟踪该表是否需要为了防止事务ID重叠(或者允许收缩pg_clog)而进行清理。如果该关系不是表则为零(InvalidTransactionId)。 为保持前向兼容,保留此字段,新增relfrozenxid64用于记录此信息。 relacl aclitem[] 访问权限。aclitem类型说明可以参考aclitem类型。 查询的回显结果为以下形式: 1 user1=privs/user2 表示user2赋予user1的权限为privs 1 =privs/user3 表示user3赋予public角色的权限为privs 其中user1、user2和user3为数据库中已存在的用户/角色名,privs为数据库中支持的权限。权限的参数说明请参见表2。 reloptions text[] 表或索引的访问方法,使用"keyword=value"格式的字符串。 relreplident "char" 逻辑解码中解码列的标识: d:默认 (主键,如果存在)。 n:无。 f:所有列。 i:索引的indisreplident被设置或者为默认。 relfrozenxid64 xid 该表中所有在这个之前的事务ID已经被一个固定的("frozen")事务ID替换。该字段用于跟踪该表是否需要为了防止事务ID重叠(或者允许收缩pg_clog)而进行清理。如果该关系不是表则为零(InvalidTransactionId)。 relbucket oid 当前表是否包含hash bucket分片。有效的OID指向pg_hashbucket表中记录的具体分片信息。NULL表示不包含hash bucket分片。 relbucketkey int2vector 表示hash分区列信息,NULL表示不包含。 relminmxid xid 该表中所有在这个之前的多事务ID已经被一个事务ID替换。该字段用于跟踪该表是否需要为了防止多事务ID重叠或者允许收缩pg_clog而进行清理。如果该关系不是表则为零(InvalidTransactionId)。 表2 权限的参数说明 参数 参数说明 r SELECT(读) w UPDATE(写) a INSERT(插入) d DELETE D TRUNCATE x REFEREN CES t TRIGGER X EXECUTE U USAGE C CREATE c CONNECT T TEMPORARY A ALTER P DROP m COMMENT i INDEX v VACUUM * 给前面权限的授权选项 父主题: 其他系统表
  • 语法格式 1 2 3 4 5 VALUES {( expression [, ...] )} [, ...] [ ORDER BY { sort_expression [ ASC | DESC | USING operator ] } [, ...] ] [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ];
  • 参数说明 expression 用于计算或插入结果表指定地点的常量或者表达式。 在一个出现在INSERT顶层的VALUES列表中,expression可以被DEFAULT替换以表示插入目的字段的缺省值。除此以外,当VALUES出现在其他场合的时候是不能使用DEFAULT的。 sort_expression 一个表示如何排序结果行的表达式或者整数常量。 ASC 指定按照升序排列。 DESC 指定按照降序排列。 operator 一个排序操作符。 count 返回的最大行数。 OFFSET start [ ROW | ROWS ] 声明返回的最大行数,而start声明开始返回行之前忽略的行数。 FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY FETCH子句限定返回查询结果从第一行开始的总行数,count的缺省值为1。
  • 属性 游标的属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PLSQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。显式游标的属性为: %FOUND布尔型属性:当最近一次读记录时成功返回,则值为TRUE。 %NOTFOUND布尔型属性:当最近一次读记录时失败返回,则值为TRUE。 %ISOPEN布尔型属性:当游标已打开时返回TRUE。 %ROWCOUNT数值型属性:返回已从游标中读取的记录数。
  • 处理步骤 显式游标处理需六个PL/SQL步骤: 定义静态游标:就是定义一个游标名,以及与其相对应的SELECT语句。 定义静态游标的语法图,如图1所示。 图1 static_cursor_define::= 或 图2 static_cursor_define::= 参数说明: cursor_name:定义的游标名。 parameter:游标参数,只能为输入参数,参数支持定义默认值,以:=、=、default定义。其格式如图3所示。: 图3 parameter格式使用参考图 select_statement:查询语句。 根据执行计划的不同,系统会自动判断该游标是否可以用于以倒序的方式检索数据行。 语法上支持parameter为输出参数,但其行为与输入参数保持一致。 定义动态游标:指ref游标,可以通过一组静态的SQL语句动态的打开游标。首先定义ref游标类型,然后定义该游标类型的游标变量,在打开游标时通过OPEN FOR动态绑定SELECT语句。 定义动态游标的语法图,如图4和图5所示。 图4 cursor_typename::= GaussDB 支持sys_refcursor动态游标类型,函数或存储过程可以通过sys_refcursor参数传入或传出游标结果集合,函数也可以通过返回sys_refcursor来返回游标结果集合。 图5 dynamic_cursor_define::= 打开静态游标:就是执行游标所对应的SELECT语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN语句还将锁定数据库表中游标结果集合对应的数据行。 打开静态游标的语法图,如图6所示。 图6 open_static_cursor::= 打开动态游标:可以通过OPEN FOR语句打开动态游标,动态绑定SQL语句。 打开动态游标的语法图,如图7所示。 图7 open_dynamic_cursor::= PL/SQL程序不能用OPEN语句重复打开一个游标。 提取游标数据:检索结果集合中的数据行,放入指定的输出变量中。 提取游标数据的语法图,如图8所示。 图8 fetch_cursor::= 对该记录进行处理。 继续处理,直到活动集合中没有记录。 关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH语句获取其中数据。关闭后的游标可以使用OPEN语句重新打开。 关闭游标的语法图,如图9所示。 图9 close_cursor::=
  • 参数 表1 SQLSetStmtAttr参数 关键字 参数说明 StatementHandle 语句句柄。 Attribute 需设置的属性。 ValuePtr 指向对应Attribute的值。依赖于Attribute的值,ValuePtr可能是32位无符号整型值,或指向以空结束的字符串,二进制缓冲区,或者驱动定义值。如果ValuePtr参数是驱动程序指定值,ValuePtr可能是有符号的整数。 StringLength 如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。
  • 原型 1 2 3 4 SQLRETURN SQLSetStmtAttr(SQLHSTMT StatementHandle SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
  • 不支持下推的函数 首先介绍函数的易变性。在GaussDB中共分三种形态: IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 VOLATILE 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 函数易变性可以查询pg_proc的provolatile字段获得,i代表IMMUTABLE,s代表STABLE,v代表VOLATILE。另外,在pg_proc中的proshippable字段,取值范围为t/f/NULL,这个字段与provolatile字段一起用于描述函数是否下推。 如果函数的provolatile属性为i,则无论proshippable的值是否为t,则函数始终可以下推。 如果函数的provolatile属性为s或v,则仅当proshippable的值为t时,函数可以下推。 random、exec_hadoop_sql、exec_on_extension如果出现CTE中,也不下推。因为这种场景下下推可能出现结果错误。 对于用户自定义函数,可以在创建函数的时候指定provolatile和proshippable属性的值,详细请参见CREATE FUNCTION。 对于函数不能下推的场景: 如果是系统函数,建议根据业务等价替换这个函数。 如果是自定义函数,建议分析客户业务场景,看函数的provolatile和proshippable属性定义是否正确。
  • 语句下推介绍 目前,GaussDB优化器在分布式框架下制定语句的执行策略时,有三种执行计划方式:生成下推语句计划、生成分布式执行计划、生成发送语句的分布式执行计划。 下推语句计划:指直接将完整的查询语句从CN发送到DN进行执行,然后将执行结果返回给CN。 分布式执行计划:指CN对查询语句进行编译和优化,生成计划树,再将计划树发送给DN进行执行,并在执行完毕后返回结果到CN。 发送语句的分布式执行计划:上述两种方式都不可行时,将可下推的查询部分组成查询语句(多为基表扫描语句)下推到DN进行执行,获取中间结果到CN,然后在CN执行剩下的部分。 在第3种策略中,要将大量中间结果从DN发送到CN,并且要在CN运行不能下推的部分语句,会导致CN成为性能瓶颈(带宽、存储、计算等)。在进行性能调优的时候,应尽量避免只能选择第3种策略的查询语句。 执行语句不能下推是因为语句中含有不支持下推的函数或者不支持下推的语法。一般都可以通过等价改写规避执行计划不能下推的问题。
  • 功能描述 检查点(CHECKPOINT)是一个事务日志中的点,所有数据文件都在该点被更新以反映日志中的信息,所有数据文件都将被刷新到磁盘。 设置事务日志检查点。预写式日志(WAL)缺省时在事务日志中每隔一段时间放置一个检查点。可以使用gs_guc命令设置相关运行时参数(checkpoint_segments, checkpoint_timeout和incremental_checkpoint_timeout)来调整这个原子化检查点的间隔。
  • 接口介绍 高级功能包DBE_UTILITY支持的所有接口请参见表1。 表1 DBE_UTILITY 接口名称 描述 DBE_UTILITY.FORMAT_ERROR_BACKTRACE 输出存储过程异常的调用堆栈。 DBE_UTILITY.FORMAT_ERROR_STACK 输出存储过程异常的具体信息。 DBE_UTILITY.FORMAT_CALL_STACK 输出存储过程的调用堆栈。 DBE_UTILITY.GET_TIME 输出当前时间,一般用于做差得到执行时长。 DBE_UTILITY.CANONICALIZE 用于给表名字符串做规范。 DBE_UTILITY.COMMA_TO_TABLE 将用逗号隔开的名字列表的字符串转换为PL/SQL表名列表。 DBE_UTILITY.DB_VERSION 返回数据库的版本号和兼容性版本号。 DBE_UTILITY.EXEC_DDL_STATEMENT 用于执行用户输入的DDL语句。 DBE_UTILITY.EXPAND_SQL_TEXT_PROC 用于展开SQL查询的视图。 DBE_UTILITY.GET_CPU_TIME 返回当前CPU处理时间的测量值。 DBE_UTILITY.GET_ENDIANNESS 用于获取数据库所在平台字节序的大小端信息。 DBE_UTILITY.GET_HASH_VALUE 返回一个给定字符串的hash值。 DBE_UTILITY.GET_SQL_HASH 输出一个给定字符串的hash值,该存储过程在不打开proc_outparam_override时使用。 DBE_UTILITY.IS_BIT_SET 用于检查参数n是否存在于r。 DBE_UTILITY.IS_CLUSTER_DATABASE 用于判断当前数据库是否在数据库集群模式下运行。 DBE_UTILITY.NAME_RESOLVE 解析给定的对象名称,包括同义词翻译和必要的授权检查。 DBE_UTILITY.NAME_TOKENIZE 用于解析a [. b [. c ]][@ dblink ]形式的名字。 DBE_UTILITY.OLD_CURRENT_SCHEMA 返回当前用户环境下的数据库模式名称。 DBE_UTILITY.OLD_CURRENT_USER 返回当前用户的名称。 DBE_UTILITY.TABLE_TO_COMMA 将PL/SQL中的表名转换为用逗号隔开的名字列表的字符串。 DBE_UTILITY.GET_SQL_HASH_FUNC 功能同DBE_UTILITY.GET_SQL_HASH,该函数在打开proc_outparam_override时使用。 DBE_UTILITY.EXPAND_SQL_TEXT 内部函数,不建议用户使用。 DBE_UTILITY.CANONICALIZE_RET 内部函数,不建议用户使用。 DBE_UTILITY.COMMA_TO_TABLE_FUN 内部函数,不建议用户使用。 DBE_UTILITY.COMPILE_SCHEMA 内部函数,不建议用户使用,已废弃。 DBE_UTILITY.NAME_SEPARATE 内部函数,不建议用户使用。 DBE_UTILITY.NAME_TOKENIZE_FUNC 内部函数,不建议用户使用。 DBE_UTILITY.NAME_TOKENIZE_LOWER 内部函数,不建议用户使用。 DBE_UTILITY.NAME_TOKENIZE_LOWER_FUNC 内部函数,不建议用户使用。 DBE_UTILITY.PRIVILEGE_CHECK 内部函数,不建议用户使用。 DBE_UTILITY.SEARCH_CLASS_WITH_NSPOID_ONAME_TYPE 内部函数,不建议用户使用。 DBE_UTILITY.SEARCH_OBJE CTS 内部函数,不建议用户使用。 DBE_UTILITY.SEARCH_OBJECTS_SYNONYM_FILL_SECHEMA 内部函数,不建议用户使用。 DBE_UTILITY.SEARCH_PROCEDURE_WITH_NSPOID_ONAME 内部函数,不建议用户使用。 DBE_UTILITY.SEARCH_SYNONM_WITH_NSPOID_ONAME 内部函数,不建议用户使用。 DBE_UTILITY.TABLE_TO_COMMA_FUNC 内部函数,不建议用户使用。 DBE_UTILITY.USER_NAME 内部函数,不建议用户使用。 DBE_UTILITY.FORMAT_ERROR_BACKTRACE 存储过程FORMAT_ERROR_BACKTRACE返回在执行过程中出现错误时,出现错误位置的调用堆栈。DBE_UTILITY.FORMAT_ERROR_BACKTRACE函数原型为: 1 2 DBE_UTILITY.FORMAT_ERROR_BACKTRACE() RETURN TEXT; DBE_UTILITY.FORMAT_ERROR_STACK 存储过程FORMAT_ERROR_STACK返回在执行过程中出现错误时,出现错误位置的具体信息。DBE_UTILITY.FORMAT_ERROR_STACK函数原型为: 1 2 DBE_UTILITY.FORMAT_ERROR_STACK() RETURN TEXT; DBE_UTILITY.FORMAT_CALL_STACK 存储过程FORMAT_CALL_STACK设置输出函数调用堆栈。DBE_UTILITY.FORMAT_CALL_STACK函数原型为: 1 2 DBE_UTILITY.FORMAT_CALL_STACK() RETURN TEXT; DBE_UTILITY.GET_TIME 存储过程GET_TIME设置输出时间,通常用于做差,单独的返回值没有意义。DBE_UTILITY.GET_TIME函数原型为: 1 2 DBE_UTILITY.GET_TIME() RETURN BIGINT;
  • 下标生成函数 generate_subscripts(array anyarray, dim int) 描述:生成一系列包括给定数组的下标。 返回值类型:setof int generate_subscripts(array anyarray, dim int, reverse boolean) 描述:生成一系列包括给定数组的下标。当reverse为真时,该系列则以相反的顺序返回。 返回值类型:setof int
  • 序列号生成函数 generate_series(start, stop) 描述:生成一个数值序列,从start到stop,步长为1。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) generate_series(start, stop, step) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) generate_series(start, stop, step interval) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:timestamp或timestamp with time zone 返回值类型:setof timestamp或setof timestamp with time zone(与参数类型相同)
  • 参数说明 new_table new_table指定新建表的名称。 UN LOG GED 指定表为非日志表。非日志表中写入的数据不会被写入到预写日志中,比普通表快很多。但是,非日志表在冲突或异常关机后会被自动删截,非日志表中的内容也不会被复制到备用服务器中,在该类表中创建的索引也不会被自动记录。 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 SELECT INTO的其它参数可参考SELECT的参数说明。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 --建表并插入数据。 gaussdb=# CREATE TABLE tbl_person ( id integer, name varchar(20), sex varchar(5) CHECK(sex = '男' or sex = '女') ); gaussdb=# INSERT INTO tbl_person VALUES (1, 'Bob', '男'),(2, 'Anne', '女'),(3, 'Jack', '男'),(4, 'Danny', '男'),(5, 'Alice', '女'),(6, 'Susan', '女'); --将person表中所有男生的信息加入到新表中 gaussdb=# SELECT * INTO tbl_man FROM tbl_person WHERE sex = '男'; --查询tbl_man数据。 gaussdb=# SELECT * FROM tbl_man; id | name | sex ----+-------+----- 1 | Bob | 男 3 | Jack | 男 4 | Danny | 男 (3 rows) --删除表。 gaussdb=# DROP TABLE tbl_person, tbl_man;
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] { * | {expression [ [ AS ] output_name ]} [, ...] } INTO [ UNLOGGED ] [ TABLE ] new_table [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ WINDOW {window_name AS ( window_definition )} [, ...] ] [ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT | WAIT N]} [...] ];
  • DBE_PLDEBUGGER.turn_off 仅用于去掉当前session被turn_on添加的调试标记,返回值表示成功或失败,如表1所示。可通过DBE_PLDEBUGGER.local_debug_server_info查找已经turn_on的存储过程oid。 函数原型为: 1 2 DBE_PLDEBUGGER.turn_off(Oid) RETURN boolean; 表1 turn_off 入参和返回值列表 名称 类型 描述 func_oid IN oid 函数oid。 turn_off OUT boolean turn off是否成功。 父主题: DBE_PLDEBUGGER Schema
  • 字符类型表达式的字符集和字符序 每一个字符类型的表达式含有字符集和字符序属性。 在MYSQL模式(即sql_compatibility = 'MYSQL')的数据库下,如果设置参数b_format_version='5.7'和b_format_dev_version='s2'时,字符串常量的默认字符集与字符序由系统参数character_set_connection和collation_connection决定。否则,其默认字符集与数据库字符集server_encoding相同,其默认字符序为default。 字符集语法: GaussDB暂不支持以下语法指定字符串常量的字符集。 1 [_charset_name]'string' 字符序语法: 其他字符串类型的表达式也可以指定字符序。 1 EXPRESSION [COLLATE collation_name] 参数说明: COLLATE collation_name 指定字符序的名称,用于设置这个字符串的字符序属性。 表达式的数据类型只能是支持字符序的数据类型。 指定的字符序必须是表达式的字符集允许的字符序。 示例: 1 2 --使用collate语句指定字符序 gaussdb=# SELECT 'a' COLLATE utf8mb4_general_ci = 'A'; 父主题: 字符集与字符序
  • Hint的错误、冲突及告警 Plan Hint的结果会体现在计划的变化上,可以通过explain来查看变化。 hint中的错误不会影响语句的执行,只是不能生效,该错误会根据语句类型以不同方式提示用户。对于explain语句,hint的错误会以warning形式显示在界面上,对于非explain语句,会以debug1级别日志显示在日志中,关键字为PLANHINT。 hint的错误分为以下类型: 语法错误 语法规则树归约失败,会报错,指出出错的位置。 例如:hint关键字错误,leading hint或join hint指定2个表以下,其它hint未指定表等。一旦发现语法错误,则立即终止hint的解析,所以此时只有错误前面解析完的hint有效。 例如: 1 leading((t1 t2)) nestloop(t1) rows(t1 t2 #10) nestloop(t1)存在语法错误,则终止解析,可用hint只有之前解析的leading((t1 t2))。 语义错误 表不存在、存在多个、或在leading或join中出现多次,均会报语义错误。 scanhint中的index不存在,会报语义错误。 如果子查询提升后,同一层出现多个名称相同的表,且其中某个表需要被hint,hint会存在歧义,无法使用,需要为相同表增加别名规避。 hint重复或冲突 如果存在hint重复或冲突,只有第一个hint生效,其它hint均会失效,会给出提示。 hint重复是指,hint的方法及表名均相同。例如:nestloop(t1 t2) nestloop(t1 t2)。 hint冲突是指,table list一样的hint,存在不一样的hint,hint的冲突仅对于每一类hint方法检测冲突。 例如:nestloop (t1 t2) hashjoin (t1 t2),则后面与前面冲突,此时hashjoin的hint失效。注意:nestloop(t1 t2)和no mergejoin(t1 t2)不冲突。 leading hint中的多个表会进行拆解。例如:leading ((t1 t2 t3))会拆解成:leading((t1 t2)) leading(((t1 t2) t3)),此时如果存在leading((t2 t1)),则两者冲突,后面的会被丢弃。(例外:指定内外表的hint若与不指定内外表的hint重复,则始终丢弃不指定内外表的hint。) 查询改写的hint允许重复,但对于重复的hint数据库只会使用第一个,对于其他未使用的hint则会报"unused hint" Warning提示。例如:/*+ expand_sublink expand_sublink */由于数据库只使用第一个expand_sublink hint,所以仍然会报"unused hint" Warning提示。 子链接提升后hint失效 子链接提升后的hint失效,会给出提示。通常出现在子链接中存在多个表连接的场景。提升后,子链接中的多个表不再作为一个整体出现在join中。 列类型不支持重分布 对于skew hint来说,目的是为了进行重分布时的调优,所以当hint列的类型不支持重分布时,hint将无效。 hint未被使用 非等值join使用hashjoin hint或mergejoin hint。 不包含索引的表使用indexscan hint或indexonlyscan hint。 不包含全局二级索引的表使用gsi hint。 通常只有在索引列上使用过滤条件才会生成相应的索引路径,全表扫描将不会使用索引,因此使用indexscan hint、indexonlyscan hint或gsi hint将不会使用。 indexonlyscan只有输出列仅包含索引列才会使用,否则指定时hint不会被使用。 gsi只有查询能够下推至全局二级索引时才会使用,否则不会被使用。 多个表存在等值连接时,仅尝试有等值连接条件的表连接,此时没有关联条件的表之间的路径将不会生成,所以指定相应的leading、join、rows hint将不使用,例如:t1 t2 t3表join,t1和t2, t2和t3有等值连接条件,则t1和t3不会优先连接,leading(t1 t3)不会被使用。 生成stream计划时,如果表的分布列与join列相同,则不会生成redistribute的计划。如果不同,且另一表分布列与join列相同,只能生成redistribute的计划,不会生成broadcast的计划,指定相应的hint则不会被使用。 如果子链接未被提升,则blockname hint不会被使用。 对于skew hint,hint未被使用可能由于: 计划中不需要进行重分布。 hint指定的列包含分布键。 hint指定倾斜信息有误或不完整,如对于join优化未指定值。 倾斜优化的GUC参数处于关闭状态。 父主题: 使用Plan Hint进行调优
  • hotkey特性函数 gs_stat_get_hotkeys_info() 描述:获取本地节点查询的热词信息。 返回值类型:Tuple 示例: 1 2 3 4 5 6 gaussdb=# SELECT * FROM gs_stat_get_hotkeys_info() order by count, hash_value; database_name | schema_name | table_name | key_value | hash_value | count ---------------+-------------+-------------------+-----------+------------+------- regression | public | hotkey_single_col | {22} | 1858004829 | 2 regression | public | hotkey_single_col | {11} | 2011968649 | 2 (2 rows) gs_stat_clean_hotkeys() 描述:清理hotkey缓存,重置hotkey状态信息。 返回值类型:bool,恒为true 示例: 1 2 3 4 5 gaussdb=# SELECT * FROM gs_stat_clean_hotkeys(); gs_stat_clean_hotkeys ----------------------- t (1 row) 父主题: 函数和操作符
  • 参数说明 schema_name 模式名称。 模式名不能和当前数据库里其他的模式重名。 模式名不能和当前数据库的初始用户重名。 模式的名称不能以“pg_”开头。 模式的名称不能以“gs_role_”开头。 取值范围:字符串,要符合标识符命名规范。 AUTHORIZATION user_name 指定模式的所有者。当不指定schema_name时,把user_name当作模式名,此时user_name只能是角色名。 取值范围:已存在的用户名/角色名。 WITH BLOCKCHAIN 指定模式的防篡改属性。防篡改模式下的普通行存表为防篡改用户表。 创建防篡改模式,需设置GUC参数enable_ledger为on,该参数默认值为off,级别为SIGHUP。 schema_element 在模式里创建对象的SQL语句。目前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE TABLE PARTITION、CREATE SEQUENCE、CREATE TRIGGER、GRANT子句。 子命令所创建的对象都被AUTHORIZATION子句指定的用户所拥有。 如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 --创建一个角色role1。 gaussdb=# CREATE ROLE role1 IDENTIFIED BY '********'; -- 为用户role1创建一个同名schema,子命令创建的表films和winners的拥有者为role1。 gaussdb=# CREATE SCHEMA AUTHORIZATION role1 CREATE TABLE films (title text, release date, awards text[]) CREATE VIEW winners AS SELECT title, release FROM films WHERE awards IS NOT NULL; --删除schema。 gaussdb=# DROP SCHEMA role1 CASCADE; --删除用户。 gaussdb=# DROP USER role1 CASCADE;
  • 语法格式 根据指定的名称创建模式。 1 2 CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [WITH BLOCKCHAIN] [ schema_element [ ... ] ]; 根据用户名创建模式。 1 CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ];
  • 注意事项 当分配的句柄并非环境句柄时,如果SQLAllocHandle返回的值为SQL_ERROR,则它会将OutputHandlePtr的值设置为SQL_NULL_HDBC、SQL_NULL_HSTMT或SQL_NULL_HDESC。之后,通过调用带有适当参数的SQLGetDiagRec,其中HandleType和Handle被设置为IntputHandle的值,可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。
  • 参数 表1 SQLAllocHandle参数 关键字 参数说明 HandleType 由SQLAllocHandle分配的句柄类型。必须为下列值之一: SQL_HANDLE_ENV(环境句柄) SQL_HANDLE_DBC(连接句柄) SQL_HANDLE_STMT(语句句柄) SQL_HANDLE_DESC(描述句柄) 申请句柄顺序为,先申请环境句柄,再申请连接句柄,最后申请语句句柄。后申请的句柄依赖它前面申请的句柄。 InputHandle 将要分配的新句柄的类型。InputHandle参数用于指定创建句柄的父句柄,以建立句柄之间的层次关系。不同类型的句柄有不同的层次关系,InputHandle参数用于指定这种关系。 如果HandleType为SQL_HANDLE_ENV,则该值为SQL_NULL_HANDLE,表示没有父句柄。 如果HandleType为SQL_HANDLE_DBC,则它一定是一个环境句柄,表示该连接句柄是在该环境下创建的。 如果HandleType为SQL_HANDLE_STMT或SQL_HANDLE_DESC,则它一定是一个连接句柄,表示该语句句柄是在该连接下创建的。 OutputHandlePtr 输出参数:OutputHandlePtr是一个指向SQLHANDLE类型的指针,用于返回分配的新句柄。
共100000条