华为云用户手册

  • PG_DEPEND PG_DEPEND系统表记录数据库对象之间的依赖关系。这个信息允许DROP命令找出哪些其它对象必须由DROP CASCADE删除,或者是在DROP RESTRICT的情况下避免删除。 这个表的功能类似PG_SHDEPEND,用于记录那些在数据库集群之间共享的对象之间的依赖性关系。 表1 PG_DEPEND字段 名称 类型 引用 描述 classid oid PG_CLASS.oid 有依赖对象所在系统表的OID。 objid oid 任意OID属性 指定的依赖对象的OID。 objsubid integer - 对于表字段,这个是该属性的字段数(objid和classid引用表本身)。对于所有其它对象类型,目前这个字段是0。 refclassid oid PG_CLASS.oid 被引用对象所在的系统表的OID。 refobjid oid 任意OID属性 指定的被引用对象的OID。 refobjsubid integer - 对于表字段,这个是该字段的字段号(refobjid和refclassid引用表本身)。对于所有其它对象类型,目前这个字段是0。 deptype "char" - 一个定义这个依赖关系特定语义的代码。 在所有情况下,一个PG_DEPEND记录表示被引用的对象不能在有依赖的对象被删除前删除。不过,这里还有几种由deptype定义的情况: DEPENDENCY_NORMAL (n):独立创建的对象之间的一般关系。有依赖的对象可以在不影响被引用对象的情况下删除。被引用对象只有在声明了CASCADE的情况下删除,这时有依赖的对象也被删除。例子:一个表字段对其数据类型有一般依赖关系。 DEPENDENCY_AUTO (a):有依赖对象可以和被引用对象分别删除,并且如果删除了被引用对象则应该被自动删除(不管是RESTRICT或CASCADE模式)。例子:一个表上面的命名约束是在该表上的自动依赖关系,因此如果删除了表,它也会被删除。 DEPENDENCY_INTERNAL (i):有依赖的对象是作为被引用对象的一部分创建的,实际上只是它的内部实现的一部分。 DROP有依赖对象是不能直接允许的(将告诉用户发出一条删除被引用对象的DROP)。一个对被引用对象的DROP将传播到有依赖对象,不管是否声明了CASCADE。例子:一个创建来强制外键约束的触发器在该约束的PG_CONSTRAINT记录上是标记为内部依赖的。 DEPENDENCY_EXTENSION (e):依赖对象是被依赖对象extension的一个成员(EXTENSION相关功能详见《实验室特性说明》)。依赖对象只可以通过在被依赖对象上DROP EXTENSION删除。函数上这个依赖类型和内部依赖一样动作,但是它为了清晰和简化gs_dump保持分开。 DEPENDENCY_PIN (p):没有依赖对象;这种类型的记录标志着系统本身依赖于被引用对象,因此这个对象绝不能被删除。这种类型的记录只有在initdb的时候创建。有依赖对象的字段里是零。 父主题: 系统表
  • STREAMING_REAPER_STATUS STREAMING_REAPER_STATUS系统表存储流引擎reaper线程的状态信息。由于规格变更,当前版本已经不再支持本特性,请不要使用。 表1 STREAMING_REAPER_STATUS字段 名称 类型 描述 id integer CONTVIEW对象唯一的标识符,不可重复。 contquery_name name CONTVIEW对象的名称。 gather_interval text CONTVIEW对象设置的gather_interval参数值(自动聚合特定时间前历史数据的时间参数)。 gather_completion_time text CONTVIEW对象最近一次的GATHER(历史数据聚合)的完成时间。 父主题: 系统表
  • 示例 集群有3个CN,cn_5001、cn_5002、cn_5003,均处于正常工作状态。 cn_5001发生故障且满足剔除时间要求后,需要将cn_5001从集群中剔除,执行SQL在cn_5002和cn5003节点上刷新pgxc_node系统表中cn_5001对应记录的nodeis_active为false: ALTER COORDINATOR cn_5001 SET False WITH (cn_5002,cn_5003); cn_5001故障解除后,为了在集群中加回cn_5001,执行SQL在cn_5002和cn5003节点上刷新pgxc_node系统表中cn_5001对应记录的nodeis_active为true: ALTER COORDINATOR cn_5001 SET True WITH (cn_5002,cn_5003);
  • 参数说明 nodename 节点名,对应在pgxc_node系统表的一行记录,指定后将修改记录中的nodeis_active字段值。 取值范围:字符串,只支持CN,并且要保证该节点名在pgxc_node系统表中有对应的记录。 status pgxc_node系统表中nodeis_acitve字段的更新值。 取值范围: - FALSE - TRUE nodename1[, nodename2, nodename3 ...] 该SQL执行的节点范围,ALTER COORDINATOR执行时会自动下发到范围内的所有节点,需要包含当前执行节点。 取值范围:字符串,只支持CN,要保证该节点名在pgxc_node系统表中有对应的记录,并且节点状态正常,否则SQL执行失败。
  • 简化输入 简化输入到 CS V日志文件,可以通过如下操作: 设置log_filename和log_rotation_age,为日志文件提供一个一致的、可预测的命名方案。通过日志文件名,预测一个独立的日志文件完成并进入准备导入状态的时间。 将log_rotation_size设为0来终止基于尺寸的日志回滚,因为基于尺寸的日志回滚让预测日志文件名变得非常的困难。 将log_truncate_on_rotation设为on以便区分在同一日志文件中旧的日志数据和新的日志数据。
  • csvlog定义 以“逗号分隔值” 即CSV(Comma Separated Value)的形式发出日志。 以下是简单的用来存储CSV形式日志输出的表定义: 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 CREATE TABLE postgres_log ( log_time timestamp(3) with time zone, node_name text, user_name text, database_name text, process_id bigint, connection_from text, "session_id" text, session_line_num bigint, command_tag text, session_start_time timestamp with time zone, virtual_transaction_id text, transaction_id bigint, query_id bigint, module text, error_severity text, sql_state_code text, message text, detail text, hint text, internal_query text, internal_query_pos integer, context text, query text, query_pos integer, location text, application_name text ); 详细说明请参见表1。 表1 csvlog字段含义表 字段名 字段含义 字段名 字段含义 log_time 毫秒级的时间戳 module 日志所属模块 node_name 节点名称 error_severity ERRORSTATE代码 user_name 用户名 sql_state_code SQLSTATE代码 database_name 数据库名 message 错误消息 process_id 进程ID detail 详细错误消息 connection_from 客户主机:端口号 hint 提示 session_id 会话ID internal_query 内部查询(查询那些导致错误的信息,如果有的话) session_line_num 每个会话的行数 internal_query_pos 内部查询指针 command_tag 命令标签 context 环境 session_start_time 会话开始时间 query 错误发生位置的字符统计 virtual_transaction_id 常规事务 query_pos 错误发生位置指针 transaction_id 事务ID location 在 GaussDB 源代码中错误的位置(如果log_error_verbosity的值设为verbose ) query_id 查询ID application_name 应用名称 使用COPY FROM命令将日志文件导入这个表: 1 COPY postgres_log FROM '/opt/data/pg_log/logfile.csv' WITH csv; 此处的日志名“logfile.csv”要换成实际生成的日志的名称。
  • GLOBAL_COMM_SEND_STREAM GLOBAL_COMM_SEND_STREAM视图展示所有DN上所有的TCP代理通信库发送流状态。 表1 GLOBAL_COMM_SEND_STREAM字段 名称 类型 描述 node_name text 节点名称。 local_tid bigint 使用此通信流的线程ID。 remote_name text 连接对端节点名称。 remote_tid bigint 连接对端线程ID。 idx integer 通信对端DN在本DN内的标识编号。 sid integer 通信流在物理连接中的标识编号。 tcp_sock integer 通信流所使用的tcp通信socket。 state text 通信流当前的状态。 query_id bigint 通信流对应的debug_query_id编号。 pn_id integer 通信流所执行查询的plan_node_id编号。 send_smp integer 通信流所执行查询send端的smpid编号。 recv_smp integer 通信流所执行查询recv端的smpid编号。 send_bytes bigint 通信流发送的数据总量(单位:Byte)。 time bigint 通信流当前生命周期使用时长(单位:毫秒)。 speed bigint 通信流的平均发送速率(单位:Byte/s)。 quota bigint 通信流当前的通信配额值(单位:Byte)。 wait_quota bigint 通信流等待quota值产生的额外时间开销(单位:毫秒)。 父主题: Comm
  • PG_WORKLOAD_GROUP PG_WORKLOAD_GROUP系统表提供了数据库负载组的信息。 表1 PG_WORKLOAD_GROUP字段 名称 类型 描述 oid oid 行标识符(隐含字段,必须明确选择)。 workload_gpname name 负载组名称。 respool_oid oid 绑定到的资源池的id。 act_statements integer 负载组内最大的活跃语句数。 父主题: 系统表
  • 示例 character存储类型转换。对一个目标列定义为character(20)的语句,下面的语句显示存储值的长度正确: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 openGauss=# CREATE SCHEMA tpcds; openGauss=# CREATE TABLE tpcds.value_storage_t1 ( VS_COL1 CHARACTER(20) )DISTRIBUTE BY HASH (VS_COL1); openGauss=# INSERT INTO tpcds.value_storage_t1 VALUES('abcdef'); openGauss=# SELECT VS_COL1, octet_length(VS_COL1) FROM tpcds.value_storage_t1; vs_col1 | octet_length ----------------------+-------------- abcdef | 20 (1 row) ) openGauss=# DROP TABLE tpcds.value_storage_t1; openGauss=# DROP SCHEMA tpcds; 这里真正发生的事情是两个unknown文本缺省解析成text,这样就允许||操作符解析成text连接。然后操作符的text结果转换成bpchar("空白填充的字符型", character类型内部名称)以匹配目标字段类型。不过,从text到bpchar的转换是二进制兼容的,这样的转换是隐含的并且实际上不做任何函数调用。最后,在系统表里找到长度转换函数bpchar(bpchar, integer, Boolean) 并且应用于该操作符的结果和存储的字段长。这个类型相关的函数执行所需的长度检查和额外的空白填充。
  • 值存储数据类型解析 查找与目标字段准确的匹配。 试着将表达式直接转换成目标类型。如果已知这两种类型之间存在一个已注册的转换函数,那么直接调用该转换函数即可。如果表达式是一个未知类型文本,该文本字符串的内容将交给目标类型的输入转换过程。 检查目标类型是否有长度转换。长度转换是一个从某类型到自身的转换。如果在pg_cast表里面找到一个,那么在存储到目标字段之前先在表达式上应用。这样的转换函数总是接受一个额外的类型为integer的参数,它接收目标字段的atttypmod值(实际上是其声明长度,atttypmod的解释随不同的数据类型而不同),并且它可能接受一个Boolean类型的第三个参数,表示转换是显式的还是隐式的。转换函数负责施加那些长度相关的语义,比如长度检查或者截断。
  • ADM_SYNONYMS ADM_SYNONYMS视图显示数据库中所有同义词的信息。需要有系统管理员权限才可以访问。该视图同时存在于PG_CATA LOG 和SYS Schema下。 表1 ADM_SYNONYMS字段 名称 类型 描述 owner text 同义词的所有者。 schema_name text 同义词所属模式名。 synonym_name text 同义词的名称。 table_owner text 关联对象的所有者。尽管该列称为table_owner,但它拥有的该关联对象不一定是表,可以是任何数据库通用对象,例如视图、存储过程、同义词等。 table_name text 关联对象名。尽管该列称为table_name,但此关联对象不一定是表,可以是任何数据库通用对象,例如视图、存储过程、同义词等。 table_schema_name text 关联对象所属模式名。尽管该列称为table_schema_name,但此schema下的该关联对象不一定是表,可以是任何数据库通用对象,例如视图、存储过程、同义词等。 父主题: 系统视图
  • 示例 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 --创建表空间。 openGauss=# CREATE TABLESPACE ds_location1 RELATIVE LOCATION 'test_tablespace/test_tablespace_1'; --创建用户joe。 openGauss=# CREATE ROLE joe IDENTIFIED BY '********'; --创建用户jay。 openGauss=# CREATE ROLE jay IDENTIFIED BY '********'; --创建表空间,且所有者指定为用户joe。 openGauss=# CREATE TABLESPACE ds_location2 OWNER joe RELATIVE LOCATION 'test_tablespace/test_tablespace_2'; --把表空间ds_location1重命名为ds_location3。 openGauss=# ALTER TABLESPACE ds_location1 RENAME TO ds_location3; --改变表空间ds_location2的所有者。 openGauss=# ALTER TABLESPACE ds_location2 OWNER TO jay; --删除表空间。 openGauss=# DROP TABLESPACE ds_location2; openGauss=# DROP TABLESPACE ds_location3; --删除用户。 openGauss=# DROP ROLE joe; openGauss=# DROP ROLE jay;
  • 语法格式 1 2 3 CREATE TABLESPACE tablespace_name [ OWNER user_name ] [ RELATIVE ] LOCATION 'directory' [ MAXSIZE 'space_size' ] [with_option_clause]; 其中普通表空间的with_option_clause为: 1 2 3 WITH ( {filesystem= { 'general'| "general" | general} | random_page_cost = { 'value ' | value } | seq_page_cost = { 'value ' | value }}[,...])
  • 注意事项 系统管理员或者继承了内置角色gs_role_tablespace权限的用户可以创建表空间。 不允许在一个事务块内部执行CREATE TABLESPACE。 执行CREATE TABLESPACE失败,如果内部创建目录(文件)操作成功了就会产生残留的目录(文件),重新创建时需要用户手动清理表空间指定的目录下残留的内容。如果在创建过程中涉及到数据目录下的表空间软连接残留,需要先将软连接的残留文件删除,再重新执行OM相关操作。 CREATE TABLESPACE不支持两阶段事务,如果部分节点执行失败,不支持回滚。 创建表空间前的准备工作参考下述参数说明。 在公有云场景下一般不建议用户使用自定义的表空间。 原因:用户自定义表空间通常配合主存(即默认表空间所在的存储设备,如磁盘)以外的其它存储介质使用,以隔离不同业务可以使用的I/O资源,而在公有云场景下,存储设备都是采用标准化的配置,无其它可用的存储介质,自定义表空间使用不当不利于系统长稳运行以及影响整体性能,因此建议使用默认表空间即可。
  • 示例 --创建一个普通表。 openGauss=# CREATE TABLE my_table (c1 int, c2 int); --创建增量物化视图。 openGauss=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table; --基表写入数据。 openGauss=# INSERT INTO my_table VALUES(1,1),(2,2); --对增量物化视图my_imv进行增量刷新。 openGauss=# REFRESH INCREMENTAL MATERIALIZED VIEW my_imv; --删除增量物化视图。 openGauss=# DROP MATERIALIZED VIEW my_imv; --删除表my_table。 openGauss=# DROP TABLE my_table;
  • PG_DATABASE PG_DATABASE系统表存储关于可用数据库的信息。 表1 PG_DATABASE字段 名称 类型 描述 oid oid 行标识符(隐含字段,必须明确选择)。 datname name 数据库名称。 datdba oid 数据库所有人,通常为其创建者。 encoding integer 数据库的字符编码方式。 datcollate name 数据库使用的排序顺序。 datctype name 数据库使用的字符分类。 datistemplate boolean 是否允许作为模板数据库。 true:表示允许。 false:表示不允许。 datallowconn boolean 这个字段用于保护template0数据库不被更改。 true:表示用户可以连接到这个数据库。 false:表示没有用户可以连接到这个数据库。 datconnlimit integer 该数据库上允许的最大并发连接数,-1表示无限制。 datlastsysoid oid 数据库里最后一个系统OID 。 datfrozenxid xid32 用于跟踪该数据库是否需要为了防止事务ID重叠而进行清理。当前版本该字段已经废弃使用,为保持前向兼容,保留此字段,新增datfrozenxid64用于记录此信息。 dattablespace oid 数据库的缺省表空间。 datcompatibility name 数据库兼容模式。当前支持四种兼容模式:PG、ORA、MYSQL、TD。 datacl aclitem[] 访问权限。 datfrozenxid64 xid 用于跟踪该数据库是否需要为了防止事务ID重叠而进行清理。 datminmxid xid 该数据库中所有在这之前的多事务ID已经被一个事务ID替换。用于跟踪该数据库是否需要为了防止事务ID重叠或者允许收缩pg_clog而进行清理。它是此数据库中所有表的PG_CLASS中relminmxid的最小值。 父主题: 系统表
  • PG_GET_SENDERS_CATCHUP_TIME PG_GET_SENDERS_CATCHUP_TIME视图显示DN上当前活跃的主备发送线程的追赶信息。 表1 PG_GET_SENDERS_CATCHUP_TIME字段 名称 类型 描述 pid bigint 当前sender的线程ID。 lwpid integer 当前sender的lwpid。 local_role text 本地的角色。 peer_role text 对端的角色。 state text 当前sender的复制状态。 type text 当前sender的类型。 catchup_start timestamp with time zone catchup启动的时间。 catchup_end timestamp with time zone catchup结束的时间。 父主题: 系统视图
  • PG_LOCKS PG_LOCKS视图显示各打开事务所持有的锁的信息。 表1 PG_LOCKS字段 名称 类型 引用 描述 locktype text - 被锁定对象的类型:relation、extend、page、tuple、transactionid、virtualxid、object、userlock、advisory。 database oid PG_DATABASE.oid 被锁定对象所在数据库的OID。 如果被锁定的对象是共享对象,则OID为0。 如果被锁定的对象是一个事务,则OID为NULL。 relation oid PG_CLASS.oid 关系的OID,如果锁定的对象不是关系,也不是关系的一部分,则为NULL。 page integer - 关系内部的页面编号,如果对象不是关系页或者不是行页,则为NULL。 tuple smallint - 页面里边的行编号,如果对象不是行,则为NULL。 bucket integer - 哈希桶编号。 virtualxid text - 虚拟事务的id,如果对象不是一个虚拟事务,则为NULL。 transactionid xid - 事务的ID,如果对象不是一个事务,则为NULL。 classid oid PG_CLASS.oid 包含该对象的系统表的OID,如果对象不是普通的数据库对象,则为NULL。 objid oid - 对象在其系统表内的OID,如果对象不是普通的数据库对象,则为NULL。 objsubid smallint - 对于表的一个字段,这是字段编号;对于其他对象类型,这个字段是零;如果这个对象不是普通数据库对象,则为NULL。 virtualtransaction text - 持有此锁或者在等待此锁的虚拟事务的ID。 pid bigint - 持有或者等待这个锁的服务器逻辑线程的ID。如果锁是被一个预备事务持有的,则为NULL。 sessionid bigint - 持有或者等待这个锁的会话的ID。 mode text - 这个线程持有的或者是期望的锁模式。 granted boolean - 如果锁是持有锁,则为TRUE。 如果锁是等待锁,则为FALSE。 fastpath boolean - 如果通过fast-path获得锁,则为TRUE;如果通过主要的锁表获得,则为FALSE。 locktag text - 会话等待锁信息,可通过locktag_decode()函数解析。 global_sessionid text - 全局会话ID。 父主题: 系统视图
  • 存储过程支持自治事务 自治事务可以在存储过程中定义,标识符为PRAGMA AUTONOMOUS_TRANSACTION,其余语法与创建存储过程语法相同,示例如下。 --建表 create table t2(a int, b int); insert into t2 values(1,2); select * from t2; --创建包含自治事务的存储过程 CREATE OR REPLACE PROCEDURE autonomous_4(a int, b int) AS DECLARE num3 int := a; num4 int := b; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN insert into t2 values(num3, num4); dbe_output.print_line('just use call.'); END; / --创建调用自治事务存储过程的普通存储过程 CREATE OR REPLACE PROCEDURE autonomous_5(a int, b int) AS DECLARE BEGIN dbe_output.print_line('just no use call.'); insert into t2 values(666, 666); autonomous_4(a,b); rollback; END; / --调用普通存储过程 select autonomous_5(11,22); --查看表结果 select * from t2 order by a; 上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。 父主题: 自治事务
  • PG_LANGUAGE PG_LANGUAGE系统表登记编程语言,用户可以用这些语言或接口写函数或者存储过程。 表1 PG_LANGUAGE字段 名称 类型 引用 描述 oid oid - 行标识符(隐含字段;必须明确选择)。 lanname name - 语言的名称。 lanowner oid PG_AUTHID.oid 语言的所有者。 lanispl boolean - true:表示用户定义的语言。 false:表示内部语言,比如SQL。 目前,gs_dump仍然使用该字段判断哪种语言需要转储,但是这些可能在将来被其它机制取代。 lanpltrusted boolean - true:这是可信语言,意味着系统相信它不会被授予任何正常SQL执行环境之外的权限。 false:这是不可信语言。只有初始用户可以用不可信语言创建函数。 lanplcallfoid oid PG_PROC.oid 对于非内部语言,这是指向该语言处理器的引用,语言处理器是一个特殊函数, 负责执行以某种语言写的所有函数。 laninline oid PG_PROC.oid 这个字段引用一个负责执行“inline”匿名代码块的函数(DO块)。如果不支持内联块则为零。 lanvalidator oid PG_PROC.oid 这个字段引用一个语言校验器函数,它负责检查新创建的函数的语法和有效性。如果没有提供校验器,则为零。 lanacl aclitem[] - 访问权限。 父主题: 系统表
  • STAT_SYS_INDEXES 显示pg_catalog、information_schema以及pg_toast模式中所有系统表的索引状态信息。 表1 STAT_SYS_INDEXES字段 名称 类型 描述 relid oid 该索引的表的OID。 indexrelid oid 索引的OID。 schemaname name 索引的模式名。 relname name 索引的表名。 indexrelname name 索引名。 idx_scan bigint 索引上开始的索引扫描数。 idx_tup_read bigint 通过索引上扫描返回的索引项数。 idx_tup_fetch bigint 通过使用索引的简单索引扫描抓取的活表行数。 父主题: Object
  • 优化说明 此优化的核心就是消除子查询。分析业务场景发现a.ca_address_sk不为null,那么从SQL语义出发,可以等价改写SQL为: 1 2 3 4 5 select count(*) from customer_address_001 a4, customer_address_001 a where a4.ca_address_sk = a.ca_address_sk group by a.ca_address_sk; 为了保证改写的等效性,在customer_address_001. ca_address_sk加了not null约束。
  • 示例 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 --创建源表及触发表 openGauss=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); openGauss=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); --创建触发器函数 openGauss=# CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END $$ LANGUAGE plpgsql; openGauss=# CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS $$ DECLARE BEGIN UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; openGauss=# CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS $$ DECLARE BEGIN DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; --创建INSERT触发器 openGauss=# CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func(); --创建UPDATE触发器 openGauss=# CREATE TRIGGER update_trigger AFTER UPDATE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_update_func(); --创建DELETE触发器 openGauss=# CREATE TRIGGER delete_trigger BEFORE DELETE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_delete_func(); --执行INSERT触发事件并检查触发结果 openGauss=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); openGauss=# SELECT * FROM test_trigger_src_tbl; openGauss=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 --执行UPDATE触发事件并检查触发结果 openGauss=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100; openGauss=# SELECT * FROM test_trigger_src_tbl; openGauss=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效 --执行DELETE触发事件并检查触发结果 openGauss=# DELETE FROM test_trigger_src_tbl WHERE id1=100; openGauss=# SELECT * FROM test_trigger_src_tbl; openGauss=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效 --修改触发器 openGauss=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; --禁用insert_trigger触发器 openGauss=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; --禁用当前表上所有触发器 openGauss=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; --删除触发器 openGauss=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl; openGauss=# DROP TRIGGER update_trigger ON test_trigger_src_tbl; openGauss=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl;
  • 参数说明 CONSTRAINT 可选项,指定此参数将创建约束触发器,即触发器作为约束来使用。除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同。 约束触发器必须是AFTER ROW触发器。 name 触发器名称,该名称不能限定模式,因为触发器自动继承其所在表的模式,且同一个表的触发器不能重名。 对于约束触发器,使用SET CONSTRAINTS修改触发器行为时也使用此名称。 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 BEFORE 触发器函数是在触发事件发生前执行。 AFTER 触发器函数是在触发事件发生后执行,约束触发器只能指定为AFTER。 INSTEAD OF 触发器函数直接替代触发事件。 event 启动触发器的事件,取值范围包括:INSERT、UPDATE、DELETE或TRUNCATE,也可以通过OR同时指定多个触发事件。 对于UPDATE事件类型,可以使用下面语法指定列: UPDATE OF column_name1 [, column_name2 ... ] 表示只有这些列作为UPDATE语句的目标列时,才会启动触发器,但是INSTEAD OF UPDATE类型不支持指定列信息。如果UPDATE OF指定的列包含生成列,当生成列依赖的列是UPDATE语句的目标列时,也会启动触发器。 table_name 需要创建触发器的表名称。 取值范围:数据库中已经存在的表名称。 referenced_table_name 约束引用的另一个表的名称。 只能为约束触发器指定,常见于外键约束。由于当前不支持外键,因此不建议使用。 取值范围:数据库中已经存在的表名称。 DEFERRABLE | NOT DEFERRABLE 约束触发器的启动时机,仅作用于约束触发器。这两个关键字设置该约束是否可推迟。 详细介绍请参见CREATE TABLE。 INITIALLY IMMEDIATE | INITIALLY DEFERRED 如果约束是可推迟的,则这个子句声明检查约束的缺省时间,仅作用于约束触发器。 详细介绍请参见CREATE TABLE。 FOR EACH ROW | FOR EACH STATEMENT 触发器的触发频率。 FOR EACH ROW是指该触发器是受触发事件影响的每一行触发一次。 FOR EACH STATEMENT是指该触发器是每个SQL语句只触发一次。 未指定时默认值为FOR EACH STATEMENT。约束触发器只能指定为FOR EACH ROW。 condition 决定是否实际执行触发器函数的条件表达式。当指定WHEN时,只有在条件返回true时才会调用该函数。 在FOR EACH ROW触发器中,WHEN条件可以通过分别写入OLD.column_name或NEW.column_name来引用旧行或新行值的列。INSERT触发器不能引用OLD和DELETE触发器不能引用NEW。 INSTEAD OF触发器不支持WHEN条件。 WHEN表达式不能包含子查询。 对于约束触发器,WHEN条件的评估不会延迟,而是在执行更新操作后立即发生。 如果条件返回值不为true,则触发器不会排队等待延迟执行。 function_name 用户定义的函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。 arguments 执行触发器时要提供给函数的可选的以逗号分隔的参数列表。参数是文字字符串常量,简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。 请检查触发器函数的实现语言的描述,以了解如何在函数内访问这些参数。 关于触发器种类: INSTEAD OF的触发器必须标记为FOR EACH ROW,并且只能在视图上定义。 BEFORE和AFTER触发器作用在视图上时,只能标记为FOR EACH STATEMENT。 TRUNCATE类型触发器仅限FOR EACH STATEMENT。 表1 表和视图上支持的触发器种类: 触发时机 触发事件 行级 语句级 BEFORE INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 AFTER INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 INSTEAD OF INSERT/UPDATE/DELETE 视图 不支持 TRUNCATE 不支持 不支持 表2 plpgsql类型触发器函数特殊变量: 变量名 变量含义 NEW INSERT及UPDATE操作涉及tuple信息中的新值,对DELETE为空。 OLD UPDATE及DELETE操作涉及tuple信息中的旧值,对INSERT为空。 TG_NAME 触发器名称。 TG_WHEN 触发器触发时机(BEFORE/AFTER/INSTEAD OF)。 TG_LEVEL 触发频率(ROW/STATEMENT)。 TG_OP 触发操作(INSERT/UPDATE/DELETE/TRUNCATE)。 TG_RELID 触发器所在表OID。 TG_RELNAME 触发器所在表名(已废弃,现用TG_TABLE_NAME替代)。 TG_TABLE_NAME 触发器所在表名。 TG_TABLE_SCHEMA 触发器所在表的SCHEMA信息。 TG_NARGS 触发器函数参数个数。 TG_ARGV[] 触发器函数参数列表。
  • 语法格式 1 2 3 4 5 6 7 CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM referenced_table_name ] { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } } [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( condition ) ] EXECUTE PROCEDURE function_name ( arguments ); 其中event包含以下几种: 1 2 3 4 INSERT UPDATE [ OF column_name [, ... ] ] DELETE TRUNCATE
  • 注意事项 当前仅支持在普通行存表上创建触发器,不支持在临时表、unlogged表等类型表上创建触发器。 如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。 触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。 当触发器满足如下条件时,触发语句能和触发器一起下推到DN执行并提升触发器执行性能: 开关enable_trigger_shipping和enable_fast_query_shipping开启。 源表触发器使用的触发器函数为plpgsql类型(推荐类型)。 源表与触发表分布键的类型、数量完全相同,均为行存表,且所属相同的nodegroup。 原INSERT/UPDATE/DELETE语句条件中包含所有分布键与NEW/OLD等值比较表达式。 原INSERT/UPDATE/DELETE语句在没有触发器的情况下原本就能query shipping。 源表上只有INSERT BEFORE FOR EACH ROW/INSERT AFTER FOR EACH ROW/UPDATE BEFORE FOR EACH ROW/UPDATE AFTER FOR EACH ROW/DELETE BEFORE FOR EACH ROW/DELETE AFTER FOR EACH ROW六类触发器,且所有触发器都可下推。 INSERT ON DUPLICATE KEY UPDATE语句无法触发触发器。 执行触发器语句时,是使用触发器创建者的身份进行权限判断的。 执行创建触发器操作的用户需要拥有指定表的TRIGGER权限。
  • MY_SEQUEN CES MY_SEQUENCES视图显示当前用户的序列信息。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 MY_SEQUENCES字段 名称 类型 描述 sequence_owner name 序列所有者。 sequence_name name 序列的名称。 min_value int16 序列最小值。 max_value int16 序列最大值。 increment_by int16 序列的增量。 cycle_flag character(1) 表示序列是否是循环序列,取值: Y表示是循环序列。 N表示不是循环序列。 last_number int16 上一序列的值。 cache_size int16 序列磁盘缓存大小。 父主题: 系统视图
  • Wait Classes by Total Wait Time Wait Classes by Total Wait Time列名称及描述如下表所示。 表1 Wait Classes by Total Wait Time报表主要内容 列名称 描述 Type Wait Event类别名称: STATUS。 LWLOCK_EVENT。 LOCK_EVENT。 IO_EVENT。 Waits Wait次数。 Total Wait Time(us) 总Wait时间(微秒)。 Avg Wait Time(us) 平均Wait时间(微秒)。 父主题: WDR报告信息介绍
  • 示例 openGauss=# DROP TABLE IF EXISTS customers; openGauss=# CREATE TABLE customers(id int,name varchar); openGauss=# INSERT INTO customers VALUES(1,'ab'); openGauss=# DECLARE my_id integer; BEGIN select id into my_id from customers limit 1; -- 赋值 END; / openGauss=# DECLARE type id_list is varray(6) of customers.id%type; id_arr id_list; BEGIN select id bulk collect into id_arr from customers order by id DESC limit 20; -- 批量赋值 END; / BULK COLLECT INTO 只支持批量赋值给数组。合理使用LIMIT字段避免操作过量数据导致性能下降。
  • 场景二:常规数据倾斜巡检 在库中表个数少于1W的场景,直接使用倾斜视图查询当前库内所有表的数据倾斜情况。 1 SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC; 在库中表个数非常多(至少大于1W)的场景,因PGXC_GET_TABLE_SKEWNESS涉及全库查并计算非常全面的倾斜字段,所以可能会花费比较长的时间(小时级),建议参考PGXC_GET_TABLE_SKEWNESS视图定义,直接使用table_distribution()函数自定义输出,减少输出列进行计算优化,例如: 1 2 3 4 5 6 SELECT schemaname,tablename,max(dnsize) AS maxsize, min(dnsize) AS minsize FROM pg_catalog.pg_class c INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = 'H' GROUP BY schemaname,tablename;
共100000条