华为云用户手册

  • 注释信息函数 col_description(table_oid, column_number) 描述:获取一个表字段的注释 返回类型:text 备注:col_description返回一个表中字段的注释,通过表OID和字段号来声明。 obj_description(object_oid, catalog_name) 描述:获取一个数据库对象的注释 返回类型:text 备注:带有两个参数的obj_description返回一个数据库对象的注释,该对象是通过其OID和其所属的系统表名称声明。比如,obj_description(123456,'pg_class')将返回OID为123456的表的注释。只带一个参数的obj_description只要求对象OID。 obj_description不能用于表字段,因为字段没有自己的OID。 obj_description(object_oid) 描述:获取一个数据库对象的注释 返回类型:text shobj_description(object_oid, catalog_name) 描述:获取一个共享数据库对象的注释 返回类型:text 备注:shobj_description和obj_description差不多,不同之处仅在于前者用于共享对象。一些系统表是通用于集群中所有数据库的全局表,因此这些表的注释也是全局存储的。
  • 模式可见性查询函数 每个函数执行检查数据库对象类型的可见性。对于函数和操作符,如果在前面的搜索路径中没有相同的对象名称和参数的数据类型,则此对象是可见的。对于操作符类,则要同时考虑名称和相关索引的访问方法。 所有这些函数都需要使用OID来标识要需要检查的对象。如果用户想通过名称测试对象,则使用OID别名类型(regclass、regtype、regprocedure、regoperator、regconfig或regdictionary)将会很方便。 比如,如果一个表所在的模式在搜索路径中,并且在前面的搜索路径中没有同名的表,则这个表是可见的。它等效于表可以不带明确模式修饰进行引用。比如,要列出所有可见表的名称: 1 openGauss=# SELECT relname FROM pg_class WHERE pg_table_is_visible(oid); pg_collation_is_visible(collation_oid) 描述:该排序是否在搜索路径中可见。 返回类型:Boolean pg_conversion_is_visible(conversion_oid) 描述:该转换是否在搜索路径中可见。 返回类型:Boolean pg_function_is_visible(function_oid) 描述:该函数是否在搜索路径中可见。 返回类型:Boolean pg_opclass_is_visible(opclass_oid) 描述:该操作符类是否在搜索路径中可见。 返回类型:Boolean pg_operator_is_visible(operator_oid) 描述:该操作符是否在搜索路径中可见。 返回类型:Boolean pg_opfamily_is_visible(opclass_oid) 描述:该操作符族是否在搜索路径中可见。 返回类型:Boolean pg_table_is_visible(table_oid) 描述:该表是否在搜索路径中可见。 返回类型:Boolean pg_ts_config_is_visible(config_oid) 描述:该文本检索配置是否在搜索路径中可见。 返回类型:Boolean pg_ts_dict_is_visible(dict_oid) 描述:该文本检索词典是否在搜索路径中可见。 返回类型:Boolean pg_ts_parser_is_visible(parser_oid) 描述:该文本搜索解析是否在搜索路径中可见。 返回类型:Boolean pg_ts_template_is_visible(template_oid) 描述:该文本检索模板是否在搜索路径中可见。 返回类型:Boolean pg_type_is_visible(type_oid) 描述:该类型(或域)是否在搜索路径中可见。 返回类型:Boolean
  • 访问权限查询函数 DDL类权限ALTER、DROP、COMMENT、INDEX、VACUUM属于所有者固有的权限,隐式拥有。 以下访问权限查询函数仅表示用户是否具有某对象上的某种对象权限,即返回记录在系统表acl字段中的对象权限拥有情况。 has_any_column_privilege(user, table, privilege) 描述:指定用户是否有访问表任何列的权限。 表2 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或id。 table text,oid 表 表名称或表id。 privilege text 权限 SELECT:允许对指定表任何列执行SELECT语句。 INSERT:允许对指定表任何列执行INSERT语句。 UPDATE:允许对指定表任何列任意字段执行UPDATE语句。 REFEREN CES :允许创建一个外键约束。 COMMENT:允许对指定表任何列执行COMMENT语句。 返回类型:Boolean has_any_column_privilege(table, privilege) 描述:当前用户是否有访问表任何列的权限,合法参数类型见表2。 返回类型:Boolean 备注:has_any_column_privilege检查用户是否以特定方式访问表的任何列。其参数可能与has_table_privilege类似,除了访问权限类型必须是SELECT、INSERT、UPDATE或REFERENCES的一些组合。 拥有表的表级别权限则隐含的拥有该表每列的列级权限,因此如果与has_table_privilege参数相同,has_any_column_privilege总是返回true。但是如果授予至少一列的列级权限也返回成功。 has_column_privilege(user, table, column, privilege) 描述:指定用户是否有访问列的权限。 表3 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或者id。 table text,oid 表名 表的名字或id。 column text,smallint 列名 列的名字或属性号。 privilege text 权限 SELECT:允许对表的指定列执行SELECT语句。 INSERT:允许对表的指定列执行INSERT语句。 UPDATE:允许对表的指定列执行UPDATE语句。 REFERENCES:允许创建一个外键约束。 COMMENT:允许对表的指定列执行COMMENT语句。 返回类型:Boolean has_column_privilege(table, column, privilege) 描述:当前用户是否有访问列的权限,合法参数类型见表3。 返回类型:Boolean 备注:has_column_privilege检查用户是否以特定方式访问一列。其参数类似于has_table_privilege,可以通过列名或属性号添加列。想要的访问权限类型必须是SELECT、INSERT、UPDATE或REFERENCES的一些组合。 拥有表的表级别权限则隐含的拥有该表每列的列级权限。 has_cek_privilege(user, cek, privilege) 描述:指定用户是否有访问列加密密钥CEK的权限。 表4 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或id。 cek text,oid 列加密密钥 列加密密钥名称或id。 privilege text 权限 USAGE:允许使用指定列加密密钥。 DROP:允许删除指定列加密密钥。 返回类型:Boolean has_cmk_privilege(user, cmk, privilege) 描述:指定用户是否有访问客户端加密主密钥CMK的权限。 表5 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或id。 cmk text,oid 客户端加密主密钥 客户端加密主密钥名称或id。 privilege text 权限 USAGE:允许使用指定客户端加密主密钥。 DROP:允许删除指定客户端加密主密钥。 返回类型:Boolean has_database_privilege(user, database, privilege) 描述:指定用户是否有访问数据库的权限。 表6 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或id。 database text,oid 数据库 数据库名字或id。 privilege text 权限 CREATE:对于数据库,允许在数据库里创建新的模式。 TEMPORARY:允许在使用数据库的时候创建临时表。 TEMP:允许在使用数据库的时候创建临时表。 CONNECT:允许用户连接到指定的数据库。 ALTER:允许用户修改指定对象的属性。 DROP:允许用户删除指定的对象。 COMMENT:允许用户定义或修改指定对象的注释。 返回类型:Boolean has_database_privilege(database, privilege) 描述:当前用户是否有访问数据库的权限,合法参数类型见表6。 返回类型:Boolean 备注:has_database_privilege检查用户是否能以在特定方式访问数据库。其参数类似has_table_privilege。访问权限类型必须是CREATE、CONNECT、TEMPORARY或TEMP(等价于TEMPORARY)的一些组合。 has_directory_privilege(user, directory, privilege) 表7 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或id。 directory text,oid 目录 目录名字或者oid。 privilege text 权限 READ:允许对该目录进行读操作。 WRITE:允许对该目录进行写操作。 描述:指定用户是否有访问directory的权限。 返回类型:Boolean has_directory_privilege(directory, privilege) 描述:当前用户是否有访问directory的权限,合法参数类型见表7。 返回类型:Boolean has_foreign_data_wrapper_privilege(user, fdw, privilege) 表8 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或者id。 fdw text,oid 外部数据封装器 外部数据封装器名字或id。 privilege text 权限 USAGE:允许访问外部数据封装器。 描述:指定用户是否有访问外部数据封装器的权限。 返回类型:Boolean has_foreign_data_wrapper_privilege(fdw, privilege) 描述:当前用户是否有访问外部数据封装器的权限,合法参数类型见表8。 返回类型:Boolean 备注:has_foreign_data_wrapper_privilege检查用户是否能以特定方式访问外部数据封装器。其参数类似has_table_privilege。访问权限类型必须是USAGE。 has_function_privilege(user, function, privilege) 表9 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或者id function text,oid 函数 函数名称或id privilege text 权限 EXECUTE:允许使用指定的函数,以及利用这些函数实现的操作符。 ALTER:允许用户修改指定对象的属性。 DROP:允许用户删除指定的对象。 COMMENT:允许用户定义或修改指定对象的注释。 描述:指定用户是否有访问函数的权限。 返回类型:Boolean has_function_privilege(function, privilege) 描述:当前用户是否有访问函数的权限。合法参数类型见表9。 返回类型:Boolean 备注:has_function_privilege检查一个用户是否能以指定方式访问一个函数。其参数类似has_table_privilege。使用文本字符而不是OID声明一个函数时,允许输入的类型和regprocedure数据类型一样(请参考对象标识符类型)。访问权限类型必须是EXECUTE。 has_language_privilege(user, language, privilege) 表10 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或id。 language text,oid 语言 语言名称或id。 privilege text 权限 USAG:对于过程语言,允许用户在创建函数的时候指定过程语言。 描述:指定用户是否有访问语言的权限。 返回类型:Boolean has_language_privilege(language, privilege) 描述:当前用户是否有访问语言的权限。合法参数类型见表10。 返回类型:Boolean 备注:has_language_privilege检查用户是否能以特定方式访问一个过程语言。其参数类似has_table_privilege。访问权限类型必须是USAGE。 has_nodegroup_privilege(user, nodegroup, privilege) 描述:检查用户是否有集群节点访问权限。 返回类型:Boolean 表11 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 已存在用户名称或id。 nodegroup text,oid 集群节点 已存在的集群节点。 privilege text 权限 USAGE:对于子集群,对包含在指定模式中的对象有访问权限时,USAGE允许访问指定子集群下的表对象。 CREATE:对于子集群,允许在子集群中创建表对象。 COMPUTE:针对计算子集群,允许用户在具有compute权限的计算子集群上进行弹性计算。 ALTER:允许用户修改指定对象的属性。 DROP:允许用户删除指定的对象。 has_nodegroup_privilege(nodegroup, privilege) 描述:检查用户是否有集群节点访问权限。 返回类型:Boolean has_schema_privilege(user, schema, privilege) 描述:指定用户是否有访问模式的权限。 返回类型:Boolean has_schema_privilege(schema, privilege) 描述:当前用户是否有访问模式的权限。 返回类型:Boolean 备注:has_schema_privilege检查用户是否能以特定方式访问一个模式。其参数类似has_table_privilege。访问权限类型必须是CREATE、USAGE、ALTER、DROP或COMMENT的一些组合。 has_sequence_privilege(user, sequence, privilege) 描述:指定用户是否有访问序列的权限。 返回类型:Boolean 表12 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 已存在用户名称或id。 sequence text,oid 序列 已存在序列名称或id。 privilege text 权限 USAGE:对于序列,USAGE允许使用nextval函数。 SELECT:允许创建序列。 UPDATE:允许执行UPDATE语句。 ALTER:允许用户修改指定对象的属性。 DROP:允许用户删除指定的对象。 COMMENT:允许用户定义或修改指定对象的注释。 has_sequence_privilege(sequence, privilege) 描述:指定当前用户是否有访问序列的权限。 返回类型:Boolean has_server_privilege(user, server, privilege) 描述:指定用户是否有访问外部服务的权限。 返回类型:Boolean has_server_privilege(server, privilege) 描述:当前用户是否有访问外部服务的权限。 返回类型:Boolean 备注:has_server_privilege检查用户是否能以指定方式访问一个外部服务器。其参数类似has_table_privilege。访问权限类型必须是USAGE、ALTER、DROP或COMMENT之一的值。 has_table_privilege(user, table, privilege) 描述:指定用户是否有访问表的权限。 返回类型:Boolean has_table_privilege(table, privilege) 描述:当前用户是否有访问表的权限。 返回类型:Boolean 备注:has_table_privilege检查用户是否以特定方式访问表。用户可以通过名称或OID(pg_authid.oid)来指定,public表明PUBLIC伪角色,或如果缺省该参数,则使用current_user。该表可以通过名称或者OID声明。如果用名称声明,则在必要时可以用模式进行修饰。如果使用文本字符串来声明所希望的权限类型,这个文本字符串必须是SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCESTRIGGER、ALTER、DROP、COMMENT、INDEX或VACUUM之一的值。可以给权限类型添加WITH GRANT OPTION,用来测试权限是否拥有授权选项。也可以用逗号分隔列出的多个权限类型,如果拥有任何所列出的权限,则结果便为true。 示例: 1 2 3 4 5 6 7 8 9 10 11 openGauss=# SELECT has_table_privilege('tpcds.web_site', 'select'); has_table_privilege --------------------- t (1 row) openGauss=# SELECT has_table_privilege('omm', 'tpcds.web_site', 'select,INSERT WITH GRANT OPTION '); has_table_privilege --------------------- t (1 row) has_tablespace_privilege(user, tablespace, privilege) 描述:指定用户是否有访问表空间的权限。 返回类型:Boolean has_tablespace_privilege(tablespace, privilege) 描述:当前用户是否有访问表空间的权限。 返回类型:Boolean 备注:has_tablespace_privilege检查用户是否能以特定方式访问一个表空间。其参数类似has_table_privilege。访问权限类型必须是CREATE、ALTER、DROP或COMMENT之一的值。 pg_has_role(user, role, privilege) 描述:指定用户是否有角色的权限。 返回类型:Boolean pg_has_role(role, privilege) 描述:当前用户是否有角色的权限。 返回类型:Boolean 备注:pg_has_role检查用户是否能以特定方式访问一个角色。其参数类似has_table_privilege,除了public不能用做用户名。访问权限类型必须是MEMBER或USAGE的一些组合。 MEMBER表示的是角色中的直接或间接成员关系(也就是SET ROLE的权限),而USAGE表示无需通过SET ROLE也直接拥有角色的使用权限。 has_any_privilege(user, privilege) 描述:指定用户是否有某项ANY权限,若同时查询多个权限,只要具有其中一个则返回true。 返回类型:Boolean 表13 参数类型说明 参数名 合法入参类型 描述 取值范围 user name 用户 已存在的用户名。 privilege text ANY权限 可选取值: CREATE ANY TABLE [WITH ADMIN OPTION] ALTER ANY TABLE [WITH ADMIN OPTION] DROP ANY TABLE [WITH ADMIN OPTION] SELECT ANY TABLE [WITH ADMIN OPTION] INSERT ANY TABLE [WITH ADMIN OPTION] UPDATE ANY TABLE [WITH ADMIN OPTION] DELETE ANY TABLE [WITH ADMIN OPTION] CREATE ANY SEQUENCE [WITH ADMIN OPTION] CREATE ANY INDEX [WITH ADMIN OPTION] CREATE ANY FUNCTION [WITH ADMIN OPTION] EXECUTE ANY FUNCTION [WITH ADMIN OPTION] CREATE ANY PACKAGE [WITH ADMIN OPTION] EXECUTE ANY PACKAGE [WITH ADMIN OPTION] CREATE ANY TYPE [WITH ADMIN OPTION]
  • 会话信息函数 current_catalog 描述:当前数据库的名称(在标准SQL中称"catalog")。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# SELECT current_catalog; current_database ------------------ postgres (1 row) current_database() 描述:当前数据库的名称。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# SELECT current_database(); current_database ------------------ postgres (1 row) current_query() 描述:由客户端提交的当前执行语句(可能包含多个声明)。 返回值类型:text 示例: 1 2 3 4 5 openGauss=# SELECT current_query(); current_query ------------------------- SELECT current_query(); (1 row) current_schema[()] 描述:当前模式的名称。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# SELECT current_schema(); current_schema ---------------- public (1 row) 备注:current_schema返回在搜索路径中第一个顺位有效的模式名。(如果搜索路径为空则返回NULL,没有有效的模式名也返回NULL)。如果创建表或者其他命名对象时没有声明目标模式,则将使用这些对象的模式。 current_schemas(Boolean) 描述:搜索路径中的模式名称。 返回值类型:name[] 示例: 1 2 3 4 5 openGauss=# SELECT current_schemas(true); current_schemas --------------------- {pg_catalog,public} (1 row) 备注: current_schemas(Boolean)返回搜索路径中所有模式名称的数组。布尔选项决定像pg_catalog这样隐含包含的系统模式是否包含在返回的搜索路径中。 搜索路径可以通过运行时设置更改。命令是: 1 SET search_path TO schema [, schema, ...] current_user 描述:当前执行环境下的用户名。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# SELECT current_user; current_user -------------- omm (1 row) 备注:current_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过SET ROLE改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。 definer_current_user 描述:当前执行环境下的用户名。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# SELECT definer_current_user(); definer_current_user ---------------------- omm (1 row) 备注:大多数情况下definer_current_user和current_user结果相同,但在存储过程中执行该函数会返回定义当前存储过程的用户名。 pg_current_sessionid() 描述:当前执行环境下的会话ID。 返回值类型:text 示例: 1 2 3 4 5 openGauss=# SELECT pg_current_sessionid(); pg_current_sessionid ---------------------------- 1579228402.140190434944768 (1 row) 备注:pg_current_sessionid()是用于获取当前执行环境下的会话ID。其组成结构为:时间戳.会话ID,当线程池模式开启(enable_thread_pool=on)时,会话ID为SessionID;而线程池模式关闭时,会话ID实际为线程ID。 pg_current_sessid 描述:当前执行环境下的会话ID。 返回值类型:text 示例: openGauss=# select pg_current_sessid(); pg_current_sessid ------------------- 140308875015936 (1 row) 备注:在线程池模式下获得当前会话的会话ID,非线程池模式下获得当前会话对应的后台线程ID。 pg_current_userid 描述:当前用户ID。 返回值类型:text 示例: openGauss=# SELECT pg_current_userid(); pg_current_userid ------------------- 10 (1 row) tablespace_oid_name() 描述:根据表空间oid,查找表空间名称。 返回值类型:text 示例: 1 2 3 4 5 openGauss=# select tablespace_oid_name(1663); tablespace_oid_name --------------------- pg_default (1 row) inet_client_addr() 描述:连接的远端地址。inet_client_addr返回当前客户端的IP地址。 此函数只有在远程连接模式下有效。 返回值类型:inet 示例: 1 2 3 4 5 openGauss=# SELECT inet_client_addr(); inet_client_addr ------------------ 10.10.0.50 (1 row) inet_client_port() 描述:连接的远端端口。inet_client_port返回当前客户端的端口号。 此函数只有在远程连接模式下有效。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT inet_client_port(); inet_client_port ------------------ 33143 (1 row) inet_server_addr() 描述:连接的本地地址。inet_server_addr返回服务器接收当前连接用的IP地址。 此函数只有在远程连接模式下有效。 返回值类型:inet 示例: 1 2 3 4 5 openGauss=# SELECT inet_server_addr(); inet_server_addr ------------------ 10.10.0.13 (1 row) inet_server_port() 描述:连接的本地端口。inet_server_port返回接收当前连接的端口号。如果是通过Unix-domain socket连接的,则所有这些函数都返回NULL。 此函数只有在远程连接模式下有效。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT inet_server_port(); inet_server_port ------------------ 8000 (1 row) pg_backend_pid() 描述:当前会话连接的服务进程的进程ID。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT pg_backend_pid(); pg_backend_pid ----------------- 140229352617744 (1 row) pg_conf_load_time() 描述:配置加载时间。pg_conf_load_time返回最后加载服务器配置文件的时间戳。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 openGauss=# SELECT pg_conf_load_time(); pg_conf_load_time ------------------------------ 2017-09-01 16:05:23.89868+08 (1 row) pg_my_temp_schema() 描述:会话的临时模式的OID,不存在则为0。 返回值类型:oid 示例: 1 2 3 4 5 openGauss=# SELECT pg_my_temp_schema(); pg_my_temp_schema ------------------- 0 (1 row) 备注:pg_my_temp_schema返回当前会话中临时模式的OID,如果不存在(没有创建临时表)的话则返回0。如果给定的OID是其它会话中临时模式的OID,pg_is_other_temp_schema则返回true。 pg_is_other_temp_schema(oid) 描述:是否为另一个会话的临时模式。 返回值类型:Boolean 示例: 1 2 3 4 5 openGauss=# SELECT pg_is_other_temp_schema(25356); pg_is_other_temp_schema ------------------------- f (1 row) pg_listening_channels() 描述:会话正在侦听的信道名称。 返回值类型:setof text 示例: 1 2 3 4 openGauss=# SELECT pg_listening_channels(); pg_listening_channels ----------------------- (0 rows) 备注:pg_listening_channels返回当前会话正在侦听的一组信道名称。 pg_postmaster_start_time() 描述:服务器启动时间。pg_postmaster_start_time返回服务器启动时的timestamp with time zone。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 openGauss=# SELECT pg_postmaster_start_time(); pg_postmaster_start_time ------------------------------ 2017-08-30 16:02:54.99854+08 (1 row) sessionid2pid() 描述:从sessionid中得到pid信息(如: pv_session_stat中sessid列)。 返回值类型:int8 示例: 1 2 3 4 5 6 openGauss=# select sessionid2pid(sessid::cstring) from pv_session_stat limit 2; sessionid2pid ----------------- 139973107902208 139973107902208 (2 rows) session_context( 'namespace' , 'parameter') 描述:获取并返回指定namespace下参数parameter的值。 返回值类型:VARCHAR 示例: 1 2 3 4 5 openGauss=# SELECT session_context('USERENV', 'CURRENT_SCHEMA'); session_context ------------- public (1 row) 根据当前所在的实际schema而变化。 备注:目前仅支持SESSION_CONTEXT('USERENV', 'CURRENT_SCHEMA') 和SESSION_CONTEXT('USERENV', 'CURRENT_USER')两种格式。 pg_trigger_depth() 描述:触发器的嵌套层次。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT pg_trigger_depth(); pg_trigger_depth ------------------ 0 (1 row) opengauss_version() 描述:引用的openGauss内核版本信息。 返回值类型:text 示例: 1 2 3 4 5 openGauss=# SELECT opengauss_version(); opengauss_version ------------------- 2.0.0 (1 row) gs_deployment() 描述:当前系统的部署形态信息,对于分布式系统来说返回的是“Distribute”。 返回值类型:text 示例: 1 2 3 4 5 openGauss=# select gs_deployment(); gs_deployment --------------- Distribute (1 row) session_user 描述:会话用户名。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# SELECT session_user; session_user -------------- omm (1 row) 备注:session_user通常是连接当前数据库的初始用户,不过系统管理员可以用SET SESSION AUTHORIZATION修改这个设置。 user 描述:等价于current_user。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# SELECT user; current_user -------------- omm (1 row) get_shard_oids_byname 描述:输入node的名字返回node的oid。 返回值类型:oid 示例: 1 2 3 4 5 openGauss=# select get_shard_oids_byname('datanode1'); get_shard_oids_byname ----------------------- {16385} (1 row) getpgusername() 描述:获取数据库用户名。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# select getpgusername(); getpgusername --------------- GaussDB _userna (1 row) getdatabaseencoding() 描述:获取数据库编码方式。 返回值类型:name 示例: 1 2 3 4 5 openGauss=# select getdatabaseencoding(); getdatabaseencoding --------------------- SQL_ASCII (1 row) version() 描述:版本信息。version返回一个描述服务器版本信息的字符串。 返回值类型:text 示例: 1 2 3 4 5 openGauss=# SELECT version(); version ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- openGauss 2.0.0 (GaussDBl VxxxRxxxCxx build f521c606) compiled at 2021-09-16 14:55:22 commit 2935 last mr 6385 release (1 row)
  • 优化说明 通常优化器总会选择最优的执行计划,但是众所周知代价估算,尤其是中间结果集的代价估算一般会有比较大的偏差,这种比较大的偏差就可能会导致agg的计算方式出现比较大的偏差,这时候就需要通过best_agg_plan进行agg计算模型的干预。 一般来说,当agg汇聚的收敛度很小时,即结果集的个数在agg之后并没有明显变少时(经验上以5倍为临界点),选择redistribute+hashagg执行方式,否则选择hashagg+redistribute+hashagg执行方式。
  • gds.conf参数说明 表1 gds.conf配置说明 属性 说明 取值范围 name 标识名。 - ip 侦听ip地址。 IP需为合法IP地址。 IP的默认值:127.0.0.1 port 侦听端口号。 取值范围:1024~65535,正整数。 默认值:8098。 data_dir 数据文件目录。 - err_dir 错误日志文件目录。 默认值:数据文件目录 log_file 日志文件路径。 - host 设置允许连接到GDS的主机IP地址(参数为CIDR格式,仅支持linux系统)。 - recursive 是否递归数据文件目录。 取值范围: true:递归 。 false:不递归。 默认值:false。 daemon 是否以DAEMON(后台)模式运行。 取值范围: true:以DAEMON模式运行。 false:不以DAEMON模式运行。 默认值:false。 parallel 导入工作线程并发数目。 取值范围:0~32,正整数。 默认值:1。
  • 背景信息 GDS支持在x86/ARM平台如下的操作系统中安装:EulerOS 2.5/2.8。 GDS的版本需与集群版本保持一致,否则可能会出现导入导出失败或导入导出进程停止响应等情况。 因此请勿使用历史版本的GDS进行导入。数据库版本升级后,请按照操作步骤中的办法下载新版本的GDS进行安装配置和启动。在导入导出开始时,GaussDB也会进行两端的版本一致性检测,不一致时会打屏显示报错信息并终止对应操作。 GDS的版本号的查看办法为:在GDS工具的解压目录下执行如下命令。 gds -V 数据库版本的查看办法为:连接数据库后,执行如下SQL命令查看。 1 SELECT version();
  • 注意事项 当enable_access_server_directory=off时,只允许初始用户删除directory对象;当enable_access_server_directory=on时,具有SYSADMIN权限的用户、directory对象的属主、被授予了该directory的DROP权限的用户或者继承了内置角色gs_role_directory_drop权限的用户可以删除directory对象。
  • 操作步骤 创建一个名为thesaurus_astro的TZ词典。 以一个简单的天文学词典thesaurus_astro为例,其中定义了两组天文短语及其同义词如下: 1 2 supernovae stars : sn crab nebulae : crab 执行如下语句创建TZ词典: 1 2 3 4 5 6 openGauss=# CREATE TEXT SEARCH DICTIONARY thesaurus_astro ( TEMPLATE = thesaurus, DictFile = thesaurus_astro, Dictionary = pg_catalog.english_stem, FILEPATH = 'file:///home/dicts/' ); 其中,词典定义文件全名为thesaurus_astro.ths,所在目录为当前连接CN节点的/home/dicts/下 。子词典pg_catalog.english_stem是预定义的Snowball类型的英语词干词典,用于规范化输入词,子词典自身相关配置(例如停用词等)不在此处显示。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 创建词典后,将其绑定到对应文本搜索配置中需要处理的token类型上: 1 2 3 openGauss=# ALTER TEXT SEARCH CONFIGURATION russian ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_astro, english_stem; 使用TZ词典。 测试TZ词典。 ts_lexize函数对于测试TZ词典作用不大,因为该函数是按照单个token处理输入。可以使用plainto_tsquery、to_tsvector、to_tsquery函数测试TZ词典,这些函数能够将输入分解成多个token(to_tsquery函数需要将输入加上引号)。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 openGauss=# SELECT plainto_tsquery('russian','supernova star'); plainto_tsquery ----------------- 'sn' (1 row) openGauss=# SELECT to_tsvector('russian','supernova star'); to_tsvector ------------- 'sn':1 (1 row) openGauss=# SELECT to_tsquery('russian','''supernova star'''); to_tsquery ------------ 'sn' (1 row) 其中,supernova star匹配了词典thesaurus_astro定义中的supernovae stars,这是因为在thesaurus_astro词典定义中指定了Snowball类型的子词典english_stem,该词典移除了e和s。 如果同时需要索引原始短语,只要将其同时放置在词典定义文件中对应定义的右侧即可,如下: 1 2 3 4 5 6 7 8 9 10 11 supernovae stars : sn supernovae stars openGauss=# ALTER TEXT SEARCH DICTIONARY thesaurus_astro ( DictFile = thesaurus_astro, FILEPATH = 'file:///home/dicts/'); openGauss=# SELECT plainto_tsquery('russian','supernova star'); plainto_tsquery ----------------------------- 'sn' & 'supernova' & 'star' (1 row)
  • 注意事项 由于TZ词典需要识别短语,所以在处理过程中必须保存当前状态并与解析器进行交互,以决定是否处理下一个token或是结束当前识别。此外,TZ词典配置时需谨慎,如果设置TZ词典仅处理asciiword类型的token,则类似one 7的分类词典定义将不会生效,因为uint类型的token不会传给TZ词典处理。 在索引期间要用到分类词典,因此分类词典参数中的任何变化都要求重新索引。对于其他大多数类型的词典来说,类似添加或删除停用词这种修改并不需要强制重新索引。
  • 用户权限设置 给用户直接授予某对象的权限,请使用GRANT。 将Schema中的表或者视图对象授权给其他用户或角色时,需要将表或视图所属Schema的USAGE权限同时授予该用户或角色。否则用户或角色将只能看到这些对象的名称,并不能实际进行对象访问。 例如,下面示例将Schema tpcds的权限赋给用户joe后,将表tpcds.web_returns的select权限赋给用户joe。 1 2 openGauss=# GRANT USAGE ON SCHEMA tpcds TO joe; openGauss=# GRANT SELECT ON TABLE tpcds.web_returns to joe; 给用户指定角色,使用户继承角色所拥有的对象权限。 创建角色。 新建一个角色lily,同时给角色指定系统权限CREATEDB: 1 openGauss=# CREATE ROLE lily WITH CREATEDB PASSWORD "xxxxxxxxxxx"; 给角色赋予对象权限,请使用GRANT。 例如,将模式tpcds的权限赋给角色lily后,将表tpcds.web_returns的select权限赋给角色lily。 1 2 openGauss=# GRANT USAGE ON SCHEMA tpcds TO lily; openGauss=# GRANT SELECT ON TABLE tpcds.web_returns to lily; 将角色的权限赋予用户。 1 openGauss=# GRANT lily to joe; 当将角色的权限赋予用户时,角色的属性并不会传递到用户。 回收用户权限,请使用REVOKE。 父主题: 管理用户及权限
  • 数字操作函数 abs(x) 描述:绝对值。 返回值类型:和输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT abs(-17.4); abs ------ 17.4 (1 row) acos(x) 描述:反余弦。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT acos(-1); acos ------------------ 3.14159265358979 (1 row) asin(x) 描述:反正弦。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT asin(0.5); asin ------------------ .523598775598299 (1 row) atan(x) 描述:反正切。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT atan(1); atan ------------------ .785398163397448 (1 row) atan2(y, x) 描述:y/x的反正切。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT atan2(2, 1); atan2 ------------------ 1.10714871779409 (1 row) bitand(integer, integer) 描述:计算两个数字与运算(&)的结果。 返回值类型:bigint类型数字。 示例: 1 2 3 4 5 openGauss=# SELECT bitand(127, 63); bitand -------- 63 (1 row) cbrt(dp) 描述:立方根。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT cbrt(27.0); cbrt ------ 3 (1 row) ceil(x) 描述:不小于参数的最小的整数。 返回值类型:整数。 示例: 1 2 3 4 5 openGauss=# SELECT ceil(-42.8); ceil ------ -42 (1 row) ceiling(dp or numeric) 描述:不小于参数的最小整数(ceil的别名)。 返回值类型:与输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT ceiling(-95.3); ceiling --------- -95 (1 row) cos(x) 描述:余弦。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT cos(-3.1415927); cos ------------------- -.999999999999999 (1 row) cot(x) 描述:余切。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT cot(1); cot ------------------ .642092615934331 (1 row) degrees(dp) 描述:把弧度转为角度。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT degrees(0.5); degrees ------------------ 28.6478897565412 (1 row) div(y numeric, x numeric) 描述:y除以x的商的整数部分。 返回值类型:numeric 示例: 1 2 3 4 5 openGauss=# SELECT div(9,4); div ----- 2 (1 row) exp(x) 描述:自然指数。 返回值类型:与输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT exp(1.0); exp -------------------- 2.7182818284590452 (1 row) floor(x) 描述:不大于参数的最大整数。 返回值类型:与输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT floor(-42.8); floor ------- -43 (1 row) int1(in) 描述:将传入的text参数转换为int1类型值并返回。 返回值类型:int1 示例: 1 2 3 4 5 6 7 8 9 10 openGauss=# select int1('123'); int1 ------ 123 (1 row) openGauss=# select int1('a'); int1 ------ 0 (1 row) int2(in) 描述:将传入参数转换为int2类型值并返回。支持的入参类型包括:bigint,float4,float8,int16,integer,numeric,real,text。 返回值类型:int2 示例: 1 2 3 4 5 6 7 8 9 10 openGauss=# select int2('1234'); int2 ------ 1234 (1 row) openGauss=# select int2(25.3); int2 ------ 25 (1 row) int4(in) 描述:将传入参数转换为int4类型值并返回。支持的入参类型包括:bit,boolean,char,duoble precision,int16,numeric,real,smallint,text。 返回值类型:int4 示例: 1 2 3 4 5 6 7 8 9 10 openGauss=# select int4('789'); int4 ------ 789 (1 row) openGauss=# select int4(99.9); int4 ------ 99 (1 row) int8(in) 描述:将传入参数转换为int8类型值并返回。支持的入参类型包括:bit,duoble precision,int16,integer,numeric,oid,real,smallint,text。 返回值类型:int8 示例: 1 2 3 4 5 6 7 8 9 10 openGauss=# select int8('789'); int8 ------ 789 (1 row) openGauss=# select int8(99.9); int8 ------ 99 (1 row) float4(in) 描述:将传入参数转换为float4类型值并返回。支持的入参类型包括:bigint,duoble precision,int16, integer, numeric,smallint,text。 返回值类型:float4 示例: 1 2 3 4 5 6 7 8 9 10 11 openGauss=# select float4('789'); float4 -------- 789 (1 row) openGauss=# select float4(99.9); float4 -------- 99.9 (1 row) float8(in) 描述:将传入参数转换为float8类型值并返回。支持的入参类型包括:bigint,int16, integer, numeric,real,smallint,text。 返回值类型:float8 示例: 1 2 3 4 5 6 7 8 9 10 11 openGauss=# select float8('789'); float8 -------- 789 (1 row) openGauss=# select float8(99.9); float8 -------- 99.9 (1 row) int16(in) 描述:将传入参数转换为int16类型值并返回。支持的入参类型包括:bigint,boolean, double precision, integer,numeric,oid,real,smallint,tinyint。 返回值类型:int16 示例: 1 2 3 4 5 6 7 8 9 10 11 openGauss=# select int16('789'); int16 -------- 789 (1 row) openGauss=# select int16(99.9); int16 -------- 99 (1 row) numeric(in) 描述:将传入参数转换为numeric类型值并返回。支持的入参类型包括:bigint,boolean, double precision, int16,integer,money,real,smallint。 返回值类型:numeric 示例: 1 2 3 4 5 6 7 8 9 10 11 openGauss=# select "numeric"('789'); numeric --------- 789 (1 row) openGauss=# select "numeric"(99.9); numeric --------- 99.9 (1 row) oid(in) 描述:将传入参数转换为oid类型值并返回。支持的入参类型包括:bigint,int16。 返回值类型:oid radians(dp) 描述:把角度转为弧度。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT radians(45.0); radians ------------------ .785398163397448 (1 row) random() 描述:0.0到1.0之间的随机数。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT random(); random ------------------ .824823560658842 (1 row) multiply(x double precision or text, y double precision or text) 描述:x和y的乘积。 返回值类型:double precision 示例: 1 2 3 4 5 6 7 8 9 10 openGauss=# SELECT multiply(9.0, '3.0'); multiply ------------------- 27 (1 row) openGauss=# SELECT multiply('9.0', 3.0); multiply ------------------- 27 (1 row) ln(x) 描述:自然对数。 返回值类型:与输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT ln(2.0); ln ------------------- .6931471805599453 (1 row) log(x) 描述:以10为底的对数。 返回值类型:与输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT log(100.0); log -------------------- 2.0000000000000000 (1 row) log(b numeric, x numeric) 描述:以b为底的对数。 返回值类型:numeric 示例: 1 2 3 4 5 openGauss=# SELECT log(2.0, 64.0); log -------------------- 6.0000000000000000 (1 row) mod(x,y) 描述: x/y的余数(模) 如果x是0,则返回y。 返回值类型:与参数类型相同。 示例: 1 2 3 4 5 openGauss=# SELECT mod(9,4); mod ----- 1 (1 row) 1 2 3 4 5 openGauss=# SELECT mod(9,0); mod ----- 9 (1 row) pi() 描述:“π”常量。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT pi(); pi ------------------ 3.14159265358979 (1 row) power(a double precision, b double precision) 描述:a的b次幂。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT power(9.0, 3.0); power ---------------------- 729.0000000000000000 (1 row) round(x) 描述:离输入参数最近的整数。 返回值类型:与输入相同。 示例: 1 2 3 4 5 6 7 8 9 10 11 openGauss=# SELECT round(42.4); round ------- 42 (1 row) openGauss=# SELECT round(42.6); round ------- 43 (1 row) round(v numeric, s int) 描述:保留小数点后s位,s后一位进行四舍五入。 返回值类型:numeric 示例: 1 2 3 4 5 openGauss=# SELECT round(42.4382, 2); round ------- 42.44 (1 row) setseed(dp) 描述:为随后的random()调用设置种子(-1.0到1.0之间,包含)。 返回值类型:void 示例: 1 2 3 4 5 openGauss=# SELECT setseed(0.54823); setseed --------- (1 row) sign(x) 描述:输出此参数的符号。 返回值类型:-1表示负数,0表示0,1表示正数。 示例: 1 2 3 4 5 openGauss=# SELECT sign(-8.4); sign ------ -1 (1 row) sin(x) 描述:正弦。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT sin(1.57079); sin ------------------ .999999999979986 (1 row) sqrt(x) 描述:平方根。 返回值类型:与输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT sqrt(2.0); sqrt ------------------- 1.414213562373095 (1 row) tan(x) 描述:正切。 返回值类型:double precision 示例: 1 2 3 4 5 openGauss=# SELECT tan(20); tan ------------------ 2.23716094422474 (1 row) trunc(x) 描述:截断(取整数部分)。 返回值类型:与输入相同。 示例: 1 2 3 4 5 openGauss=# SELECT trunc(42.8); trunc ------- 42 (1 row) trunc(v numeric, s int) 描述:截断为s位小数。 返回值类型:numeric 示例: 1 2 3 4 5 openGauss=# SELECT trunc(42.4382, 2); trunc ------- 42.43 (1 row) width_bucket(op numeric, b1 numeric, b2 numeric, count int) 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT width_bucket(5.35, 0.024, 10.06, 5); width_bucket -------------- 3 (1 row) width_bucket(op dp, b1 dp, b2 dp, count int) 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 返回值类型:int 示例: 1 2 3 4 5 openGauss=# SELECT width_bucket(5.35, 0.024, 10.06, 5); width_bucket -------------- 3 (1 row) int1abs 描述:返回uint8类型数据的绝对值。 参数:tinyint 返回值类型:tinyint int1and 描述:返回两个uint8类型数据按位与的结果。 参数:tinyint, tinyint 返回值类型:tinyint int1cmp 描述:返回两个uint8类型数据比较的结果,若第一个参数大,则返回1;若第二个参数大,则返回-1;若相等,则返回0。 参数:tinyint, tinyint 返回值类型:integer int1div 描述:返回两个uint8类型数据相除的结果,结果为float8类型。 参数:tinyint, tinyint 返回值类型:tinyint int1eq 描述:比较两个uint8类型数据是否相等。 参数:tinyint, tinyint 返回值类型:boolean int1ge 描述:判断两个uint8类型数据是否第一个参数大于等于第二个参数。 参数:tinyint, tinyint 返回值类型:boolean int1gt 描述:无符号1字节整数做大于运算。 参数:tinyint, tinyint 返回值类型:boolean int1larger 描述:返回无符号一字节整数中较大值。 参数:tinyint, tinyint 返回值类型:tinyint int1le 描述:判断无符号一字节整数是否小于等于。 参数:tinyint, tinyint 返回值类型:boolean int1lt 描述:判断无符号一字节整数是否小于。 参数:tinyint, tinyint 返回值类型:boolean int1smaller 描述:返回两个无符号一字节整数中较小的数。 参数:tinyint, tinyint 返回值类型:tinyint int1inc 描述:无符号一字节整数加一。 参数:tinyint 返回值类型:tinyint int1mi 描述:无符号一字节整数做差运算。 参数:tinyint, tinyint 返回值类型:tinyint int1mod 描述:无符号一字节整数做取余运算。 参数:tinyint, tinyint 返回值类型:tinyint int1mul 描述:无符号一字节整数做乘法运算。 参数:tinyint, tinyint 返回值类型:tinyint int1ne 描述:无符号一字节整数不等于运算。 参数:tinyint, tinyint 返回值类型:boolean int1pl 描述:无符号一字节整数加法。 参数:tinyint, tinyint 返回值类型:tinyint int1um 描述:无符号一字节数去相反数并返回有符号二字节整数。 参数:tinyint 返回值类型:smallint int1xor 描述:无符号一字节整数异或操作。 参数:tinyint, tinyint 返回值类型:tinyint cash_div_int1 描述:对money类型进行除法运算。 参数:money, tinyint 返回值类型:money cash_mul_int1 描述:对money类型进行乘法运算。 参数:money, tinyint 返回值类型:money int1not 描述:无符号一字节整数二进制位翻转。 参数:tinyint 返回值类型:tinyint int1or 描述:无符号一字节整数或运算。 参数:tinyint, tinyint 返回值类型:tinyint int1shl 描述:无符号一字节整数左移指定位数。 参数:tinyint, integer 返回值类型:tinyint int1shr 描述:无符号一字节整数右移指定位数。 参数:tinyint, integer 返回值类型:tinyint
  • 示例 Synonym词典可用于解决语言学相关问题,例如,为避免使单词"Paris"变成"pari",可在Synonym词典文件中定义一行"Paris paris",并将该词典放置在预定义的english_stem词典之前。 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 openGauss=# SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari} (1 row) openGauss=# CREATE TEXT SEARCH DICTIONARY my_synonym ( TEMPLATE = synonym, SYNONYMS = my_synonyms, FILEPATH = 'file:///home/dicts/' ); openGauss=# ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR asciiword WITH my_synonym, english_stem; openGauss=# SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) openGauss=# SELECT * FROM ts_debug('english', 'paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) openGauss=# ALTER TEXT SEARCH DICTIONARY my_synonym ( CASESENSITIVE=true); openGauss=# SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) openGauss=# SELECT * FROM ts_debug('english', 'paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {pari} (1 row) 其中,同义词词典文件全名为my_synonyms.syn,所在目录为当前连接CN节点的/home/dicts/下。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 星号(*)可用于词典文件中的同义词结尾,表示该同义词是一个前缀。在to_tsvector()中该星号将被忽略,但在to_tsquery()中会匹配该前缀并对应输出结果(参照处理查询一节)。 假设词典文件synonym_sample.syn内容如下: 1 2 3 4 5 postgres pgsql postgresql pgsql postgre pgsql gogle googl indices index* 创建并使用词典: 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 28 29 30 31 32 33 34 35 36 37 38 openGauss=# CREATE TEXT SEARCH DICTIONARY syn ( TEMPLATE = synonym, SYNONYMS = synonym_sample ); openGauss=# SELECT ts_lexize('syn','indices'); ts_lexize ----------- {index} (1 row) openGauss=# CREATE TEXT SEARCH CONFIGURATION tst (copy=simple); openGauss=# ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn; openGauss=# SELECT to_tsvector('tst','indices'); to_tsvector ------------- 'index':1 (1 row) openGauss=# SELECT to_tsquery('tst','indices'); to_tsquery ------------ 'index':* (1 row) openGauss=# SELECT 'indexes are very useful'::tsvector; tsvector --------------------------------- 'are' 'indexes' 'useful' 'very' (1 row) openGauss=# SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst','indices'); ?column? ---------- t (1 row)
  • 创建、修改和删除角色 非三权分立时,只有系统管理员和具有CREATEROLE属性的用户才能创建、修改或删除角色。三权分立下,只有初始用户和具有CREATEROLE属性的用户才能创建、修改或删除角色。 要创建角色,请使用CREATE ROLE。 要在现有角色中添加或删除用户,请使用ALTER ROLE。 要删除角色,请使用DROP ROLE。DROP ROLE只会删除角色,并不会删除角色中的成员用户帐户。
  • 内置角色 GaussDB提供了一组默认角色,以gs_role_开头命名。它们提供对特定的、通常需要高权限的操作的访问,可以将这些角色GRANT给数据库内的其他用户或角色,让这些用户能够使用特定的功能。在授予这些角色时应当非常小心,以确保它们被用在需要的地方。表1描述了内置角色允许的权限范围: 表1 内置角色权限描述 角色 权限描述 gs_role_copy_files 具有执行copy … to/from filename 的权限,但需要先打开GUC参数enable_copy_server_files。 gs_role_signal_backend 具有调用函数pg_cancel_backend、pg_terminate_backend和pg_terminate_session来取消或终止其他会话的权限,但不能操作属于初始用户和PERSISTENCE用户的会话。 gs_role_tablespace 具有创建表空间(tablespace)的权限。 gs_role_replication 具有调用逻辑复制相关函数的权限,例如kill_snapshot、pg_create_logical_replication_slot、pg_create_physical_replication_slot、pg_drop_replication_slot、pg_replication_slot_advance、pg_create_physical_replication_slot_extern、pg_logical_slot_get_changes、pg_logical_slot_peek_changes、pg_logical_slot_get_binary_changes、pg_logical_slot_peek_binary_changes。 gs_role_account_lock 具有加解锁用户的权限,但不能加解锁初始用户和PERSISTENCE用户。 gs_role_pldebugger 具有执行dbe_pldebugger下调试函数的权限。 gs_role_directory_create 具有执行创建directory对象的权限,但需要先打开GUC参数enable_access_server_directory。 gs_role_directory_drop 具有执行删除directory对象的权限,但需要先打开GUC参数enable_access_server_directory。 关于内置角色的管理有如下约束: 以gs_role_开头的角色名作为数据库的内置角色保留名,禁止新建以“gs_role_”开头的用户/角色,也禁止将已有的用户/角色重命名为以“gs_role_”开头; 禁止对内置角色的ALTER和DROP操作; 内置角色默认没有 LOG IN权限,不设预置密码; gsql元命令\du和\dg不显示内置角色的相关信息,但若显示指定了pattern为特定内置角色则会显示。 三权分立关闭时,初始用户、具有SYSADMIN权限的用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。三权分立打开时,初始用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。例如: 1 2 GRANT gs_role_signal_backend TO user1; REVOKE gs_role_signal_backend FROM user1;
  • 任务示例 查看gsql的帮助信息。具体执行命令请参见表1。 表1 使用gsql联机帮助 描述 示例 查看版权信息 \copyright 查看GaussDB支持的SQL语句的帮助 查看GaussDB支持的SQL语句的帮助 例如,查看GaussDB支持的所有SQL语句: 1 2 3 4 5 6 openGauss=# \h Available help: ABORT ALTER AGGREGATE ALTER APP WORKLOAD GROUP ... ... 例如,查看CREATE DATABASE命令的参数可使用下面的命令: 1 2 3 4 5 6 7 8 9 10 11 12 13 openGauss=# \help CREATE DATABASE Command: CREATE DATABASE Description: create a new database Syntax: CREATE DATABASE database_name [ [ WITH ] {[ OWNER [=] user_name ]| [ TEMPLATE [=] template ]| [ ENCODING [=] encoding ]| [ LC_COLLATE [=] lc_collate ]| [ LC_CTYPE [=] lc_ctype ]| [ DBCOMPATIBILITY [=] compatibility_type ]| [ TABLESPACE [=] tablespace_name ]| [ CONNECTION LIMIT [=] connlimit ]}[...] ]; 查看gsql命令的帮助 例如,查看gsql支持的命令: 1 2 3 4 5 6 7 openGauss=# \? General \copyright show openGauss usage and distribution terms \g [FILE] or ; execute query (and send results to file or |pipe) \h(\help) [NAME] help on syntax of SQL commands, * for all commands \q quit gsql ... ...
  • 操作步骤 连接数据库时,可以使用如下命令获取帮助信息。 gsql --help 显示如下帮助信息: ...... Usage: gsql [OPTION]... [DBNAME [USERNAME]] General options: -c, --command=COMMAND run only single command (SQL or internal) and exit -d, --dbname=DBNAME database name to connect to (default: "omm") -f, --file=FILENAME execute commands from file, then exit ...... 连接到数据库后,可以使用如下命令获取帮助信息。 help 显示如下帮助信息: You are using gsql, the command-line interface to gaussdb. Type: \copyright for distribution terms \h for help with SQL commands \? for help with gsql commands \g or terminate with semicolon to execute query \q to quit
  • 语法格式 回收空间并更新统计信息,对关键字顺序无要求。 1 2 VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ] [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ]; 仅回收空间,不更新统计信息。 1 VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name ] [ PARTITION ( partition_name ) ]; 回收空间并更新统计信息,且对关键字顺序有要求。 1 2 VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];
  • 注意事项 如果没有参数,VACUUM处理当前数据库里用户拥有相应权限的每个表。如果参数指定了一个表,VACUUM只处理指定的那个表。 要对一个表进行VACUUM操作,通常用户必须是表的所有者或者被授予了指定表VACUUM权限的用户,默认系统管理员有该权限。数据库的所有者允许对数据库中除了共享目录以外的所有表进行VACUUM操作(该限制意味着只有系统管理员才能真正对一个数据库进行VACUUM操作)。VACUUM命令会跳过那些用户没有权限的表进行垃圾回收操作。 VACUUM不能在事务块内执行。 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录之后,对受影响的表执行VACUUM ANALYZE命令是一个很好的习惯。这样将更新系统目录为最近的更改,并且允许查询优化器在规划用户查询时有更好的选择。 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL通常要比单纯的VACUUM收缩更多的表尺寸。FULL选项并不清理索引,所以推荐周期性的运行REINDEX命令。实际上,首先删除所有索引,再运行VACUUM FULL命令,最后重建索引通常是更快的选择。如果执行此命令后所占用物理空间无变化(未减少),请确认是否有其他活跃事务(删除数据事务开始之前开始的事务,并在VACUUM FULL执行前未结束)存在,如果有等其他活跃事务退出进行重试。 VACUUM会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。 如果指定了VERBOSE选项,VACUUM将打印处理过程中的信息,以表明当前正在处理的表。各种有关当前表的统计信息也会打印出来。但是对于列存表执行VACUUM操作,指定了VERBOSE选项,无信息输出。 当含有带括号的选项列表时,选项可以以任何顺序写入。如果没有括号,则选项必须按语法显示的顺序给出。 VACUUM和VACUUM FULL时,会根据参数vacuum_defer_cleanup_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。 VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。 简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。 VACUUM列存表内部执行的操作包括三个:迁移delta表中的数据到主表、VACUUM主表的delta表、VACUUM主表的desc表。该操作不会回收delta表的存储空间,如果要回收delta表的冗余存储空间,需要对该列存表执行VACUUM DELTAMERGE。 时序表VACUUM FULL和时序Compaction功能一致,故时序Compaction功能关闭时才可执行VACUUM FULL命令。 如果没有打开xc_maintenance_mode参数,那么VACUUM FULL会跳过所有系统表。 执行DELETE后立即执行VACUUM FULL命令不会回收空间。执行DELETE后再执行1000个非SELECT事务,或者等待1s后再执行1个事务,之后再执行VACUUM FULL命令空间才会回收。
  • 参数说明 FULL 选择“FULL”清理,这样可以恢复更多的空间,但是需要耗时更多,并且在表上施加了排他锁。 使用FULL参数会导致统计信息丢失,如果需要收集统计信息,请在VACUUM FULL语句中加上analyze关键字。 FREEZE 指定FREEZE相当于执行VACUUM时将vacuum_freeze_min_age参数设为0。 VERBOSE 为每个表打印一份详细的清理工作报告。 ANALYZE | ANALYSE 更新用于优化器的统计信息,以决定执行查询的最有效方法。 table_name 要清理的表的名称(可以有模式修饰)。 取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。 column_name 要分析的具体的字段名称,需要配合analyze选项使用。 取值范围:要分析的具体的字段名称。缺省时为所有字段。 PARTITION COMPACT和PARTITION参数不能同时使用。 partition_name 要清理的表的分区名称。缺省时为所有分区。 DELTAMERGE 只针对列存表,将列存表的delta table中的数据转移到主表存储上。对列存表而言,此操作受enable_delta_store和参数说明中的deltarow_threshold控制。 为了检查列存delta表中的信息,提供下述DFX函数,用于获取某个列存表的delta表中数据存储情况: pgxc_get_delta_info(TEXT),传入参数为列存表名,搜集并显示各个节点上的对应delta表信息,包括当前存活tuple数量、表大小、使用的最大block ID。 get_delta_info(TEXT),传入参数为列存表名,汇总pgxc_get_delta_info得到的结果,返回其delta表整体的当前存活tuple数量、表大小、使用的最大block ID。
  • 示例 1 2 3 4 5 6 7 8 9 --在表tpcds.reason上创建索引 CREATE UNIQUE INDEX ds_reason_index1 ON tpcds.reason(r_reason_sk); --对带索引的表tpcds.reason执行VACUUM操作。 openGauss=# VACUUM (VERBOSE, ANALYZE) tpcds.reason; --删除索引 openGauss=# DROP INDEX ds_reason_index1 CASCADE; openGauss=# DROP TABLE tpcds.reason;
  • 优化建议 vacuum VACUUM不能在事务块内执行。 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录后,对相关表执行VACUUM ANALYZE命令。 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如,一个例子就是在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。 执行VACUUM FULL操作时,建议首先删除相关表上的所有索引,再运行VACUUM FULL命令,最后重建索引。
  • 创建、修改和删除Schema 要创建Schema,请使用CREATE SCHEMA。默认初始用户和系统管理员可以创建Schema,其他用户需要具备数据库的CREATE权限才可以在该数据库中创建Schema,赋权方式请参考GRANT中将数据库的访问权限赋予指定的用户或角色中的语法。 要更改Schema名称或者所有者,请使用ALTER SCHEMA。Schema所有者可以更改Schema。 要删除Schema及其对象,请使用DROP SCHEMA。Schema所有者可以删除Schema。 要在Schema内创建表,请以schema_name.table_name格式创建表。不指定schema_name时,对象默认创建到搜索路径中的第一个Schema内。 要查看Schema所有者,请对系统表PG_NAMESPACE和PG_USER执行如下关联查询。语句中的schema_name请替换为实际要查找的Schema名称。 1 openGauss=# SELECT s.nspname,u.usename AS nspowner FROM pg_namespace s, pg_user u WHERE nspname='schema_name' AND s.nspowner = u.usesysid; 要查看所有Schema的列表,请查询PG_NAMESPACE系统表。 1 openGauss=# SELECT * FROM pg_namespace; 要查看属于某Schema下的表列表,请查询系统视图PG_TABLES。例如,以下查询会返回Schema PG_CATALOG中的表列表。 1 openGauss=# SELECT distinct(tablename),schemaname from pg_tables where schemaname = 'pg_catalog';
  • 搜索路径 搜索路径定义在search_path参数中,参数取值形式为采用逗号分隔的Schema名称列表。如果创建对象时未指定目标Schema,则将该对象会被添加到搜索路径中列出的第一个Schema中。当不同Schema中存在同名的对象时,查询对象未指定Schema的情况下,将从搜索路径中包含该对象的第一个Schema中返回对象。 要查看当前搜索路径,请使用SHOW。 1 2 3 4 5 openGauss=# SHOW SEARCH_PATH; search_path ---------------- "$user",public (1 row) search_path参数的默认值为:"$user",public。$user表示与当前会话用户名同名的Schema名,如果这样的模式不存在,$user将被忽略。所以默认情况下,用户连接数据库后,如果数据库下存在同名Schema,则对象会添加到同名Schema下,否则对象被添加到Public Schema下。 要更改当前会话的默认Schema,请使用SET命令。 执行如下命令将搜索路径设置为myschema、public,首先搜索myschema。 1 2 openGauss=# SET SEARCH_PATH TO myschema, public; SET
  • DDL 【建议】在GaussDB中,建议DDL(建表、comments等)操作统一执行,在批处理作业中尽量避免DDL操作。避免大量并发事务对性能的影响。 【建议】在非日志表(unlogged table)使用完后,立即执行数据清理(truncate)操作。因为在异常场景下,GaussDB不保证非日志表(unlogged table)数据的安全性。 【建议】临时表和非日志表的存储方式建议和基表相同。当基表为行存(列存)表时,临时表和非日志表也推荐创建为行存(列存)表,可以避免行列混合关联带来的高计算代价。 【建议】索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。 【建议】不要使用DROP…CASCADE方式删除对象,除非已经明确对象间的依赖关系,以免误删。
  • 数据加载和卸载 【建议】在insert语句中显式给出插入的字段列表。例如: 1 INSERT INTO task(name,id,comment) VALUES ('task1','100','第100个任务'); 【建议】在批量数据入库之后,或者数据增量达到一定阈值后,建议对表进行analyze操作,防止统计信息不准确而导致的执行计划劣化。 【建议】如果要清理表中的所有数据,建议使用truncate table方式,不要使用delete table方式。delete table方式删除性能差,且不会释放那些已经删除了的数据占用的磁盘空间。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 --删除EMP表中某部门的所有员工,如果该部门中已没有员工,则在DEPT表中删除该部门。 CREATE TABLE hr.staffs_t1 AS TABLE hr.staffs; CREATE TABLE hr.sections_t1 AS TABLE hr.sections; CREATE OR REPLACE PROCEDURE proc_cursor3() AS DECLARE V_DEPTNO NUMBER(4) := 100; BEGIN DELETE FROM hr.staffs WHERE section_ID = V_DEPTNO; --根据游标状态做进一步处理 IF SQL%NOTFOUND THEN DELETE FROM hr.sections_t1 WHERE section_ID = V_DEPTNO; END IF; END; / CALL proc_cursor3(); --删除存储过程和临时表 DROP PROCEDURE proc_cursor3; DROP TABLE hr.staffs_t1; DROP TABLE hr.sections_t1;
  • 在语句中添加单分片执行语法 步骤一设置nodeName参数,通过调用Connection对象的setClientInfo("nodeName","dnx")。 Connection conn = getConnection(); conn.setClientInfo("nodeName","datanode1"); 执行SQL语句,其中包括使用Statement对象的executeQuery(String sql)和execute(String sql)以及PreparedStatement对象的executeQuery()和execute()方法 PreparedStatement pstm = conn.prepareStatement("select * from test"); pstm.execute(); pstm.executeQuery(); Statement stmt=conn.createStatement(); stmt.execute("select * from test"); stmt.executeQuery("select * from test"); 关闭参数,将参数值设置为空串 conn.setClientInfo("nodeName",""); 该功能基于内核单分片执行功能进行的适配,所以使用前请确认使用的数据库内核是否支持单分片执行。 参数开启后一定要手动关闭参数,否则会对其他查询语句的执行产生影响。 参数一旦开启,当前连接所有的语句执行都会受到影响,到指定的dn上面去执行。 3.参数开启后PreparedStatement对象的缓存机制会受到影响,已经缓存的语句会被清空,之后执行的带单分片查询的语句都不在缓存,直到参数关闭后缓存功能恢复。 参数为连接级参数,所以在同一时间只有一个参数会生效,无法通过此接口做到同一时间两条语句到不同的分片上去执行。
  • 执行批处理 用一条预处理语句处理多条相似的数据,数据库只创建一次执行计划,节省了语句的编译和优化时间。可以按如下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 2 Connection conn = DriverManager.getConnection("url","user","password"); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?)"); 针对每条数据都要调用setShort设置参数,以及调用addBatch确认该条设置完毕。 1 2 pstmt.setShort(1, (short)2); pstmt.addBatch(); 调用PreparedStatement的executeBatch方法执行批处理。 1 int[] rowcount = pstmt.executeBatch(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close(); 在实际的批处理过程中,通常不终止批处理程序的执行,否则会降低数据库的性能。因此在批处理程序时,应该关闭自动提交功能,每几行提交一次。关闭自动提交功能的语句为: conn.setAutoCommit(false);
  • 执行普通SQL语句 应用程序通过执行SQL语句来操作数据库的数据(不用传递参数的语句),需要按以下步骤执行: 调用Connection的createStatement方法创建语句对象。 1 2 Connection conn = DriverManager.getConnection("url","user","password"); Statement stmt = conn.createStatement(); 调用Statement的executeUpdate方法执行SQL语句。 1 int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"); 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,事务块中不支持vacuum操作。如果其中有一个语句失败,那么整个请求都将会被回滚。 使用Statement执行多语句时应以“;”作为各语句间的分隔符,存储过程、函数、匿名块不支持多语句执行。当preferQueryMode=simple,语句执行不走解析逻辑,此场景下无法使用";"作为多语句间的分隔符。 “/”可用作创建单个存储过程、函数、匿名块、包体的结束符。当preferQueryMode=simple,语句执行不走解析逻辑,此场景下无法使用"/"作为结束符。 在prepareThreshold=1时,因为preferQueryMode默认模式不对statement进行缓存淘汰,所以statement执行的每条SQL都会缓存语句,可能导致内存膨胀。需要调整preferQueryMode=extendedCacheEverything,对statement进行缓存淘汰。 关闭语句对象。 1 stmt.close();
共100000条