华为云用户手册

  • 参数说明 @queryblock请参见指定Hint所处于的查询块Queryblock,可省略,表示在当前查询块生效。 broadcast、redistribute和local_roundrobin表示数据分布方法。 no表示hint的stream方式不使用。 table_list为进行stream操作的单表或多表,多个表之间使用空格分隔。例如:broadcast(t1),broadcast(t1 t2)。
  • PGXC_SLICE PGXC_SLICE表是针对range范围分布和list分布创建的系统表,用来记录分布具体信息,当前不支持range interval自动扩展分片,不过在系统表中预留。集中式只能查询该表定义。 表1 PGXC_SLICE字段 名称 类型 描述 relname name 表名或者分片名,通过type区分。 type "char" 't':relname是表名。 's':relname是分片的名字。 strategy "char" 'r':为range分布表。 'l':为list分布表。 后续interval分片会扩展该值。 relid oid 该tuple隶属的分布表oid。 referenceoid oid 所参考分布表的oid,用于slice reference建表语法。 sindex integer 当为list分布表时,表示当前boundary在某个分片内的位置。 interval text[] 预留字段。 transitboundary text[] 预留字段。 transitno integer 预留字段。 nodeoid oid 当relname为分片名时,表示该分片的数据存放在哪一个DN上,nodeoid表示这个DN的oid。 boundaries text[] 当relname为分片名时,对应该分片的边界值。 specified boolean 当前分片对应的DN是否是用户在DDL中显示指定的。 sliceorder integer 用户定义分片的顺序。 父主题: 其他系统表
  • 接口介绍 高级功能包DBE_XMLDOM用于访问XMLType对象,实现DOM(Document Object Model),用于访问HTML和XML DOCUMENTS API。高级功能包DBE_XMLDOM支持的所有类型请参见表1,DBE_XMLDOM支持的所有接口请参见表2。 当在数据库的字符集设置为SQL_ASCII的情况下使用DBE_XMLDOM高级包,传入超出ASCII范围的字符时,会产生报错信息。 表1 DBE_XMLDOM数据类型说明 类型名称 描述 DOMATTR 实现DOM Attribute接口。 DOMDOCUMENT 实现DOM Document接口。 DOMELEMENT 实现DOM Element接口。 DOMNAMEDNODEMAP 实现DOM Named Node Map接口。 DOMNODELIST 实现DOM Node List接口。 DOMNODE 实现DOM Node接口。 DOMTEXT 实现DOM Text接口。 表2 DBE_XMLDOM接口参数说明 接口名称 描述 DBE_XMLDOM.APPENDCHILD 将newchild node添加到parent(n)节点最后面,并返回新添加的Node节点。 DBE_XMLDOM.CREATEELEMENT 创建指定名称的DOMELEMENT对象。 DBE_XMLDOM.CREATETEXTNODE 创建DOMTEXT节点。 DBE_XMLDOM.FREEDOCUMENT 释放DOMDOCUMENT节点相关资源。 DBE_XMLDOM.FREEELEMENT 释放DOMELEMENT节点相关资源。 DBE_XMLDOM.FREENODE 释放DOMNODE节点相关资源。 DBE_XMLDOM.FREENODELIST 释放DOMNODELIST节点相关资源。 DBE_XMLDOM.GETATTRIBUTE 按名称返回DOMELEMENT属性的值。 DBE_XMLDOM.GETATTRIBUTES 将DOMNODE节点属性值作为map返回。 DBE_XMLDOM.GETCHILDNODES 将节点下的若干子节点转换成节点列表。 DBE_XMLDOM.GETCHILDRENBYTAGNAME 按名称返回DOMELEMENT的子节点。 DBE_XMLDOM.GETDOCUMENTELEMENT 返回指定DOCUMENT的首个子节点。 DBE_XMLDOM.GETFIRSTCHILD 返回第一个子节点。 DBE_XMLDOM.GETLASTCHILD 返回最后一个子节点。 DBE_XMLDOM.GETLENGTH 获取给定节点中的节点个数。 DBE_XMLDOM.GETLOCALNAME 检索节点的本地名称。 DBE_XMLDOM.GETNAMEDITEM 检索由名称指定的节点。 DBE_XMLDOM.GETNEXTSIBLING 返回该节点的下一个节点。 DBE_XMLDOM.GETNODENAME 返回节点名称。 DBE_XMLDOM.GETNODETYPE 返回节点类型。 DBE_XMLDOM.GETNODEVALUE 此函数用于获取节点的值,具体取决于其类型。 DBE_XMLDOM.GETPARENTNODE 检索此节点的父节点。 DBE_XMLDOM.GETTAGNAME 返回指定DOMELEMENT的标签名称。 DBE_XMLDOM.HASCHILDNODES 检查DOMNODE对象是否拥有任一子节点。 DBE_XMLDOM.IMPORTNODE 复制节点并为该节点指定所属文档。 DBE_XMLDOM.ISNULL 检测节点是否为空。 DBE_XMLDOM.ITEM 返回映射中与索引参数对应的项。 DBE_XMLDOM.MAKEELEMENT 将DOMNODE对象转换为DOMELEMENT类型。 DBE_XMLDOM.MAKENODE 将节点强制转换为DOMNODE类型。 DBE_XMLDOM.NEWDOMDOCUMENT 返回新的DOMDOCUMENT对象。 DBE_XMLDOM.SETATTRIBUTE 按名称设置DOMELEMENT属性的值。 DBE_XMLDOM.SETCHARSET 设置DOMDOCUMENT的CHATSET字符集。 DBE_XMLDOM.SETDOCTYPE 设置DOMDOCUMENT的外部DTD。 DBE_XMLDOM.SETNODEVALUE 此函数用于向DOMNODE对象中设置节点的值。 DBE_XMLDOM.WRITETOBUFFER 将 XML 节点写入指定缓冲区。 DBE_XMLDOM.WRITETOCLOB 将 XML 节点写入指定CLOB。 DBE_XMLDOM.WRITETOFILE 将 XML 节点写入指定文件。 DBE_XMLDOM.GETSESSIONTREENUM 显示当前session中所有类型的dom树的数量。 DBE_XMLDOM.GETDOCTREESINFO 显示document类型的dom树的内存占用、节点数量等统计信息。 DBE_XMLDOM.GETDETAILDOCTREEINFO 显示特定的document变量的各类型节点数量。 DBE_XMLDOM.GETELEMENTSBYTAGNAME 返回匹配TAGNAME的DOMNODELIST节点列表。
  • ADM_SCHEDULER_JOBS ADM_SCHEDULER_JOBS视图显示数据库中所有DBE_SCHEDULER定时任务的信息。默认只有系统管理员权限才可以访问,普通用户需要授权才可以访问。该视图同时存在于PG_CATA LOG 和SYS Schema下。 表1 ADM_SCHEDULER_JOBS字段 名称 类型 描述 owner name 定时任务所有者。 job_name text 定时任务名。 job_subname character varying(128) 暂不支持,值为NULL。 job_style text 定时任务行为模式。创建时指定,仅支持指定为“REGULAR”,不指定时为NULL。 job_creator name 定时任务创建者。 client_id character varying(65) 暂不支持,值为NULL。 global_uid character varying(33) 暂不支持,值为NULL。 program_owner character varying(4000) 定时任务引用的程序的所有者。 program_name text 定时任务引用的程序的名称。 job_type character varying(16) 定时任务内联程序类型,可用类型为: PLSQL_BLOCK:匿名存储过程块。 STORED_PROCEDURE:保存的存储过程。 EXTERNAL_SCRIPT:外部脚本。 job_action text 定时任务的程序内容。 number_of_arguments text 定时任务的参数个数。 schedule_owner character varying(4000) 暂不支持,值为NULL。 schedule_name text 定时任务引用的调度的名称。 schedule_type character varying(12) 暂不支持,值为NULL。 start_date timestamp without time zone 定时任务的起始时间。 repeat_interval text 定时任务的任务周期。 event_queue_owner character varying(128) 暂不支持,值为NULL。 event_queue_name character varying(128) 暂不支持,值为NULL。 event_queue_agent character varying(523) 暂不支持,值为NULL。 event_condition character varying(4000) 暂不支持,值为NULL。 event_rule character varying(261) 暂不支持,值为NULL。 file_watcher_owner character varying(261) 暂不支持,值为NULL。 file_watcher_name character varying(261) 暂不支持,值为NULL。 end_date timestamp without time zone 定时任务的失效时间。 job_class text 定时任务所属的定时任务类的名称。 enabled boolean 定时任务的启用状态。 auto_drop text 定时任务的自动删除功能状态。 restart_on_recovery character varying(5) 暂不支持,值为NULL。 restart_on_failure character varying(5) 暂不支持,值为NULL。 state "char" 定时任务的状态。 job_priority numeric 暂不支持,值为NULL。 run_count numeric 暂不支持,值为NULL。 uptime_run_count numeric 暂不支持,值为NULL。 max_runs numeric 暂不支持,值为NULL。 failure_count smallint 定时任务失败次数统计。 uptime_failure_count numeric 暂不支持,值为NULL。 max_failures numeric 定时任务标记为破坏之前允许失败的最大次数。 retry_count numeric 暂不支持,值为NULL。 last_start_date timestamp without time zone 定时任务上次拉起时间。 last_run_duration interval day to second(6) 定时任务上次执行的时长。 next_run_date timestamp without time zone 定时任务下次执行时间。 schedule_limit interval day to second(0) 暂不支持,值为NULL。 max_run_duration interval day to second(0) 暂不支持,值为NULL。 logging_level character varying(11) 暂不支持,值为NULL。 store_output character varying(5) 是否存储所有定时任务的输出信息。 stop_on_window_close character varying(5) 暂不支持,值为NULL。 instance_stickiness character varying(5) 暂不支持,值为NULL。 raise_events character varying(4000) 暂不支持,值为NULL。 system character varying(5) 暂不支持,值为NULL。 job_weight numeric 暂不支持,值为NULL。 nls_env character varying(4000) 暂不支持,值为NULL。 source character varying(128) 暂不支持,值为NULL。 number_of_destinations numeric 暂不支持,值为NULL。 destination_owner character varying(261) 暂不支持,值为NULL。 destination text 定时任务目标名称。 credential_owner character varying(128) 暂不支持,值为NULL。 credential_name text 定时任务的证书名称。 instance_id oid 当前数据库的OID。 deferred_drop character varying(5) 暂不支持,值为NULL。 allow_runs_in_restricted_mode character varying(5) 暂不支持,值为NULL。 comments text 定时任务的备注。 flags numeric 暂不支持,值为NULL。 restartable character varying(5) 暂不支持,值为NULL。 has_constraints character varying(5) 暂不支持,值为NULL。 connect_credential_owner character varying(128) 暂不支持,值为NULL。 connect_credential_name character varying(128) 暂不支持,值为NULL。 fail_on_script_error character varying(5) 暂不支持,值为NULL。 父主题: 其他系统视图
  • ecpg组件介绍 ecpg支持平台 表1 ecpg支持平台 操作系统 平台 EulerOS V2.0SP5 x86_64位 EulerOS V2.0SP9 ARM64位 Kylin V10 x86_64位 Kylin V10 ARM64位 ecpg组件 ecpg:用于对嵌入式SQL-C进行预处理的可执行二进制文件。 libecpg:为ecpg提供连接、执行SQL、事务等实现的动态库,包括libecpg.so、libecpg.so.6和libecpg.so.6.4,在C语言程序编译执行时通过“-lecpg”参数引用。 libpgtypes:ecpg提供的用于实现数值、日期、时间戳、区间类型数据操作运算的动态库,包括libpgtypes.so、libecpg.so.6和libecpg.so.6.4,在C语言程序编译执行时通过“-lpgtypes”参数引用。 ecpg组件的获取路径 ecpg二进制获取路径:$GAUSSHOME/bin ecpg依赖动态库路径:$GAUSSHOME/lib ecpg所需头文件路径:$GAUSSHOME/include/ecpg 父主题: 基于ecpg开发
  • 表连接方式 Nested Loop 嵌套循环,适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。 (Sonic) Hash Join 哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。 Merge Join 归并连接,通常情况下执行性能差于哈希连接。如果源数据已经被排序过,在执行归并连接时,并不需要再排序,此时归并连接的性能优于哈希连接。
  • 分区剪枝相关信息 Iterations 分区迭代算子对一级分区的迭代次数。如果显示PART则为动态剪枝场景。 例如:Iterations: 4表示迭代算子需要遍历4个一级分区。Iterations: PART表示遍历一级分区个数需要由分区键上的参数条件决定。 Selected Partitions 一级分区剪枝的结果,m..n表示m到n号分区被剪枝选中,多个不连续的分区由逗号连接。 例如:Selected Partitions: 2..4,7 表示2、3、4、7四个分区被选中。 Sub Iterations 分区迭代算子对二级分区的迭代次数。如果显示PART则为动态剪枝场景。 例如:Sub Iterations: 4表示迭代算子需要遍历4个二级分区。Iterations: PART表示遍历二级分区个数需要由分区键上的参数条件决定。 Selected Subpartitions 二级分区被剪枝的结果,由一级分区序号:二级分区序号的格式展示。 例如:Selected Subpartitions: 2:1 3:2 表示第二个一级分区的1号二级分区和第三个一级分区的2号二级分区被选中。Selected Subpartitions: ALL表示所有二级分区均被选中。
  • 运算符 Sort 对结果集进行排序。 Filter EXPLAIN输出显示WHERE子句当作一个"filter"条件附属于顺序扫描计划节点。这意味着规划节点为它扫描的每一行检查该条件,并且只输出符合条件的行。预计的输出行数降低了,因为有WHERE子句。不过,扫描仍将必须访问所有 10000 行,因此开销没有降低,实际上它还增加了一些(确切的说,通过10000 * cpu_operator_cost)以反映检查WHERE条件的额外CPU时间。 Limit LIMIT限定了执行结果的输出记录数。如果增加了LIMIT,那么不是所有的行都会被检索到。 Append 合并子操作的结果。 Aggregate 将查询行产生的结果进行组合。可以是GROUPBY、UNION、SELECT DISTINCT子句等函数的组合。 BitmapAnd 位图的AND操作,通过该操作组成匹配更复杂条件的位图。 BitmapOr 位图的OR操作,通过该操作组成匹配更复杂条件的位图。 Gather 将并行线程的数据汇总。 Group 对行进行分组,以进行GROUP BY操作。 GroupAggregate 聚合GROUP BY操作的预排序行。 Hash 对查询行进行散列操作,以供父查询使用。通常用于执行JOIN操作。 HashAggregate 使用哈希表聚合GROUP BY的结果行。 Merge Append 以保留排序顺序的方式对子查询结果进行组合,可用于组合表分区中已排序的行。 ProjectSet 对返回的结果集执行函数。 Recursive Union 对递归函数的所有步骤进行并集操作。 SetOp 集合运算,如INTERSECT或EXCEPT。 Unique 从有序的结果集中删除重复项。 HashSetOp 一种用于 INTERSECT 或 EXCEPT 等集合操作的策略,它使用 Append 来避免预排序的输入。 LockRows 锁定有问题的行以阻止其他查询写入,但允许读。 Materialize 将子查询的结果存储在内存里,以方便父查询快速访问获取。 Result 在不进行扫描的情况下返回一个值。 WindowAgg 窗口聚合函数,一般由OVER语句触发。 Merge 归并操作。 StartWith Operator 层次查询算子,用于执行递归查询操作。 Rownum 对查询结果的行编号进行条件过滤。通常出现在rownum子句里。 Index Cond 索引扫描条件。 Unpivot 转置算子。
  • 表访问方式 Seq Scan 全表顺序扫描。 Index Scan 索引扫描,优化器决定使用两步的规划:最底层的规划节点访问一个索引,找出匹配索引条件的行的位置,然后上层规划节点真实地从表中抓取出那些行。独立地抓取数据行比顺序地读取它们的开销高很多,但是因为并非所有表的页面都被访问了,这么做实际上仍然比一次顺序扫描开销要少。使用两层规划的原因是,上层规划节点在读取索引标识出来的行位置之前,会先将它们按照物理位置排序,这样可以最小化独立抓取的开销。 如果在WHERE里面使用的好几个字段上都有索引,那么优化器可能会使用索引的AND或OR的组合。但是这么做要求访问两个索引,因此与只使用一个索引,而把另外一个条件只当作过滤器相比,这个方法未必是更优。 索引扫描可以分为以下几类,它们之间的差异在于索引的排序机制。 Bitmap Index Scan 使用位图索引抓取数据页。 Index Scan using index_name 使用简单索引搜索,该方式按照索引键的顺序在索引表中抓取数据。该方式最常用于在大数据量表中只抓取少量数据的情况,或者通过ORDER BY条件匹配索引顺序的查询,以减少排序时间。 Index-Only Scan 当需要的所有信息都包含在索引中时,仅索引扫描便可获取所有数据,不需要引用表。 Bitmap Heap Scan 从其他操作创建的位图中读取页面,过滤掉不符合条件的行。位图堆扫描可避免随机I/O,加快读取速度。 TID Scan 通过TupleID扫描表。 Index Ctid Scan 通过Ctid上的索引对表进行扫描。 CTE Scan CTE对子查询的操作进行评估并将查询结果临时存储,相当于一个临时表。CTE Scan算子对该临时表进行扫描。 Foreign Scan 从远程数据源读取数据。 Function Scan 获取函数返回的结果集,将它们作为从表中读取的行并返回。 Sample Scan 查询并返回采样数据。 Subquery Scan 读取子查询的结果。 Values Scan 作为VALUES命令的一部分读取常量。 WorkTable Scan 工作表扫描。在操作中间阶段读取,通常是使用WITH RECURSIVE声明的递归操作。
  • 返回值 SQL_SUC CES S:表示调用正确。 SQL_SUCCESS_WITH_INFO:表示会有一些警告信息。 SQL_NEED_DATA:表示在执行SQL语句前没有提供足够的参数。 SQL_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 SQL_NO_DATA:表示SQL语句不返回结果集。 SQL_INVALID_HANDLE:表示调用无效句柄。其他API的返回值同理。 SQL_STILL_EXECUTING:表示语句正在执行。
  • 功能描述 Outline是描述执行计划的重要手段,也是计划固化的持久化表示。Outline存储在数据库中,需要在不同版本之间兼容,可以指导优化器生成指定计划。内核在生成执行计划的同时,可以生成Outline。同时优化器能够使用Outline对计划进行控制,Outline是计划管理的核心前提能力。 Outline Hint是优化器为了完全复现某一计划而生成的一组hint信息,以BEGIN_OUTLINE_DATA开始,并以END_OUTLINE_DATA结束。Outline Hint可以通过explain(outline on)获得。使用获得的Outline Hint能够对计划进行控制。
  • 特性约束 使用之前需要设置set explain_perf_mode = pretty选项。 Outline用于计划的复现还原,目前Outline可以控制同一条SQL的如下方面: 查询重写。 每层subquery的物理算子: a)扫描方式 b)连接方法 c)连接顺序 d)bitmap扫描的索引表 e)参数化路径 f)连接的内表物化 每层subquery的agg方法。 any子链接提升的额外处理:hashed或者material。 smp计划数据的传输方式。 目前内核的bitmapscan、indexscan、index Hint指定优化器在扫描相关表时,使用指定的索引产生索引扫描路径,具体的索引条件由优化器根据代价生成。 对于复杂多表连接的SQL,outline固定计划还原时,性能优于遗传算法。 当有Outline Hint时,对于在BEGIN OUTLINE和END OUTLINE包含以外的hint,若为控制计划生成的hint则全部失效处理(2,3,4点所提及的hint),若非控制计划生成的hint则保留,如wlmrule慢SQL管控规则的hint。
  • 参数说明 @version_num:Outline的版本。不指定默认为1.0.0,当前仅支持1.0.0,为后续版本Outline行为控制做预留。 BEGIN_OUTLINE_DATA/END_OUTLINE_DATA:生成的Outline Hint,在使用时需要放在两者之间。 BEGIN_OUTLINE_DATA和END_OUTLINE_DATA必须成对使用。 当同时使用BEGIN_OUTLINE_DATA和END_OUTLINE_DATA时,只有两者之间的hint会生效。
  • GLOBAL_STAT_USER_FUNCTIONS 显示数据库各节点的用户自定义函数的统计信息(不同节点下的统计信息不进行汇总求和),如表1所示。 表1 GLOBAL_STAT_USER_FUNCTIONS字段 名称 类型 描述 node_name name 节点名称。 funcid oid 函数的id。 schemaname name 此函数所在Schema的名称。 funcname name 用户自定义函数的名称。 calls bigint 该函数被调用的次数。 total_time double precision 调用此函数花费的总时间,包含调用其它函数的时间(单位:毫秒)。 self_time double precision 调用此函数本身花费的时间,不包含调用其它函数的时间(单位:毫秒)。 父主题: Object
  • PG_REPLICATION_SLOTS PG_REPLICATION_SLOTS视图显示复制槽的信息。 表1 PG_REPLICATION_SLOTS字段 名称 类型 描述 slot_name text 复制槽的名称。 plugin text 逻辑复制槽对应的输出插件名称。 slot_type text 复制槽的类型。 physical:物理复制槽。 logical:逻辑复制槽。 datoid oid 复制槽所在的数据库OID。 database name 复制槽所在的数据库名称。 active boolean 复制槽是否为激活状态。 t(true):表示是。 f(false):表示不是。 xmin xid 数据库需要为复制槽保留的最早事务的事务号。 catalog_xmin xid 数据库需要为逻辑复制槽保留的最早的涉及系统表的事务的事务号。 restart_lsn text 复制槽需要的最早xlog的物理位置。 dummy_standby boolean 预留参数。 confirmed_flush text 逻辑复制槽专用,客户端确认接收到的日志位置。 confirmed_csn xid 逻辑复制槽专用,客户端确认接收到的日志中最后一个事务对应的 CS N。 示例: gaussdb=# SELECT * FROM pg_replication_slots; slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn | dummy_standby | confirmed_flush | confirmed_csn -----------+----------------+-----------+--------+----------+--------+------+--------------+-------------+---------------+-----------------+--------------- dn_6002 | | physical | 0 | | t | | | 0/3622B528 | f | | dn_6003 | | physical | 0 | | t | | | 0/3622B528 | f | | slot_lsn | mppdb_decoding | logical | 131072 | db_test | f | | 66658 | 0/36252350 | f | 0/362523D0 | slot_test | mppdb_decoding | logical | 131072 | db_test | f | | 66658 | 0/36251718 | f | | 10025527 (4 rows) 在DN上执行查询,LSN序逻辑复制槽的confirmed_csn查询结果为空,CSN序逻辑复制槽的confirmed_flush查询结果为空。 父主题: 其他系统视图
  • 宿主变量 本节详细介绍如何在C语言程序和嵌入式SQL程序之间使用宿主变量传递数据。在嵌入式SQL-C程序中,将C语言作为宿主语言,将EXEC SQL [Command]语句认为是宿主语言的嵌入式SQL,因此将C语言程序中用于嵌入式SQL语句的变量称为宿主变量。 概述 声明段 检索查询 类型映射 处理字符串 使用非初级类型的宿主变量 访问特殊数据类型 处理非初级SQL数据类型 父主题: 基于ecpg开发
  • ADM_ARGUMENTS ADM_ARGUMENTS视图显示所有存储过程或函数的参数信息。默认只有系统管理员权限才可以访问,普通用户需要授权才可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 ADM_ARGUMENTS字段 名称 类型 描述 owner character varying(128) 函数或存储过程的所有者。 object_name character varying(128) 函数或存储过程的名称。 package_name character varying(128) 包名。 object_id oid 函数或存储过程的OID。 overload character varying(40) 表示该函数是该名称的第n个重载函数。 subprogram_id numeric 包中函数或存储过程的位置。 argument_name character varying(128) 参数名称。 position numeric 该参数在参数列表中的位置,函数返回值的位置默认为0。 sequence numeric 定义参数的顺序,从1开始,返回类型在前,然后是每个参数。 data_level numeric 复合类型参数的嵌套深度,此列的值始终为0,因为每个参数现只显示一行。 data_type character varying(64) 参数的数据类型。 defaulted character varying(1) 参数是否有默认值: Y:表示有默认值。 N:表示没有默认值。 default_value text 暂不支持,值为NULL。 default_length numeric 暂不支持,值为NULL。 in_out character varying(9) 参数出入属性: IN:表示入参。 OUT:表示出参。 IN_OUT:表示出入参。 VARIADIC:表示VARIADIC参数。 data_length numeric 暂不支持,值为NULL。 data_precision numeric 暂不支持,值为NULL。 data_scale numeric 暂不支持,值为NULL。 radix numeric 数字的参数基数,smallint、integer、bigint、numeric、float为10,其余值为NULL。 character_set_name character varying(44) 暂不支持,值为NULL。 type_owner character varying(128) 数据类型所有者。 type_name character varying(128) 参数类型名,仅显示自定义类型。 type_subname character varying(128) 暂不支持,值为NULL。 type_link character varying(128) 暂不支持,值为NULL。 type_object_type character varying(7) 由type_owner、type_name和type_subname列描述的类型的类型: TABLE:表示参数为表类型。 VIEW:表示参数为视图类型。 其余值为NULL。 pls_type character varying(128) 对于数字类型参数,为参数的PL/SQL类型的名称,否则为空。 char_length numeric 暂不支持,值为NULL。 char_used character varying(1) 暂不支持,varchar,nvarchar2,bpchar,char类型值为B,其余值为NULL。 origin_con_id character varying(256) 暂不支持,值为0。 父主题: 其他系统视图
  • 接口介绍 高级功能包DBE_FILE支持的所有接口请参见表2。 表2 DBE_FILE 接口名称 描述 DBE_FILE.OPEN/DBE_FILE.FOPEN 根据指定的目录和文件名打开一个文件,返回对应的文件句柄或者封装了文件句柄的DBE_FILE.FILE_TYPE类型对象。 DBE_FILE.IS_CLOSE 检测一个文件句柄是否关闭。 DBE_FILE.IS_OPEN 检测一个文件句柄是否打开。 DBE_FILE.READ_LINE 从一个打开的文件中读取一行指定长度的数据。 DBE_FILE.WRITE 将数据写入到一个打开的文件的缓冲区中。 DBE_FILE.NEW_LINE 将一个或者多个行终结符写入到一个打开的文件的缓冲区中。 DBE_FILE.WRITE_LINE 将数据写入到一个打开的文件的缓冲区中,并自动追加一个行终结符。 DBE_FILE.FORMAT_WRITE 将数据按指定格式写入到一个打开的文件的缓冲区中。 DBE_FILE.GET_RAW 从一个打开的文件中读取指定字节数的RAW类型数据。 DBE_FILE.PUT_RAW 将RAW类型数据写入到一个打开的文件的缓冲区中。 DBE_FILE.FLUSH 将缓存区中的数据写入到物理文件中。 DBE_FILE.CLOSE 关闭一个打开的文件句柄。 DBE_FILE.CLOSE_ALL 关闭一个会话中打开的所有的文件句柄。 DBE_FILE.REMOVE 根据指定的目录和文件名删除一个磁盘文件,操作的时候需要有充分的权限。 DBE_FILE.RENAME 重命名一个磁盘文件,类似UNIX的mv指令。 DBE_FILE.COPY 复制一个连续区域的内容到一个新创建的文件中,如果忽略了start_line和end_line会复制整个文件。 DBE_FILE.GET_ATTR 读取并返回一个磁盘文件的属性。 DBE_FILE.SEEK 根据用户指定的字节数向前或者向后调整文件指针的位置。 DBE_FILE.GET_POS 以字节为单位返回文件当前的偏移量。 DBE_FILE.FOPEN_NCHAR 以NCHAR模式根据指定的目录和文件名打开一个文件。 DBE_FILE.WRITE_NCHAR 将NVARCHAR2类型的数据写入到一个打开的NCHAR模式文件缓冲区中。 DBE_FILE.WRITE_LINE_NCHAR 将NVARCHAR2类型的数据写入到一个打开的NCHAR模式文件缓冲区中,并自动追加一个行终结符。 DBE_FILE.FORMAT_WRITE_NCHAR 将NVARCHAR2类型的数据按指定格式写入到一个打开的NCHAR模式文件缓冲区中。 DBE_FILE.READ_LINE_NCHAR 从一个打开的NCHAR模式文件中读取一行指定长度的数据。 DBE_FILE.OPEN/DBE_FILE.FOPEN 函数DBE_FILE.OPEN用来打开一个文件,可以指定文件每行的最大字节数,一个会话内最多可以同时打开50个文件。该函数返回一个INTEGER类型的文件句柄。函数DBE_FILE.FOPEN功能和DBE_FILE.OPEN类似,返回一个DBE_FILE.FILE_TYPE类型的对象。 DBE_FILE.OPEN和DBE_FILE.FOPEN函数原型为: 1 2 3 4 5 6 7 8 9 10 11 12 13 DBE_FILE.OPEN( dir IN TEXT, file_name IN TEXT, open_mode IN TEXT, max_line_size IN INTEGER DEFAULT 1024) RETURN INTEGER; DBE_FILE.FOPEN( dir IN TEXT, file_name IN TEXT, open_mode IN TEXT, max_line_size IN INTEGER DEFAULT 1024) RETURN DBE_FILE.FILE_TYPE; 表3 DBE_FILE.OPEN/DBE_FILE.FOPEN接口参数说明 参数 类型 入参/出参 是否可以为空 描述 dir text IN 否 文件的目录位置,这个字符串是一个目录对象名。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包读写safe_data_path指定文件路径下的文件。 file_name text IN 否 文件名,包含扩展(文件类型),不包括路径名。如果文件名中包含路径,在OPEN中会被忽略,在UNIX系统中,文件名不能以/.结尾。 open_mode text IN 否 指定文件的打开模式,包含: r:read text w:write text a:append text rb:read byte wb:write byte ab:append byte 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 max_line_size integer IN 是 每行的最大字节数,包含换行符(最小值是1,最大值是32767)。如果没有指定或指定该参数为空,会使用默认值1024。 DBE_FILE.IS_CLOSE 函数DBE_FILE.IS_CLOSE用于检测一个文件句柄是否已经关闭,返回布尔值,异常情况是INVALID_FILEHANDLE。 DBE_FILE.IS_CLOSE函数原型为: 1 2 3 4 5 6 7 DBE_FILE.IS_CLOSE( file IN INTEGER) RETURN BOOLEAN; DBE_FILE.IS_CLOSE( file IN DBE_FILE.FILE_TYPE) RETURN BOOLEAN; 表4 DBE_FILE.IS_CLOSE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 是 待检测的文件句柄或DBE_FILE.FILE_TYPE类型的对象,为空时DBE_FILE.IS_CLOSE接口返回空。 DBE_FILE.IS_OPEN 函数DBE_FILE.IS_OPEN用于检测一个文件句柄是否已经打开,返回布尔值,异常情况是INVALID_FILEHANDLE。 DBE_FILE.IS_OPEN函数原型为: 1 2 3 4 5 6 7 DBE_FILE.IS_OPEN( file IN INTEGER) RETURN BOOLEAN; DBE_FILE.IS_OPEN( file IN DBE_FILE.FILE_TYPE) RETURN BOOLEAN; 表5 DBE_FILE.IS_OPEN接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 是 待检测的文件句柄或DBE_FILE.FILE_TYPE类型的对象,为空时DBE_FILE.IS_OPEN接口返回false。 DBE_FILE.READ_LINE 函数DBE_FILE.READ_LINE从一个打开的文件读取数据,并把读取的结果存放到buffer中。读取的时候会读取到行尾,但不包含行终结符,或者读取到文件末尾,或者读取到len参数指定的大小。读取的长度不能超过OPEN的时候指定的max_line_size。 DBE_FILE.READ_LINE存储过程原型为: 1 2 3 4 5 6 7 8 9 10 11 DBE_FILE.READ_LINE( file IN INTEGER, buffer OUT TEXT, len IN INTEGER DEFAULT NULL) RETURN TEXT; DBE_FILE.READ_LINE( file IN DBE_FILE.FILE_TYPE, buffer OUT TEXT, len IN INTEGER DEFAULT NULL) RETURN TEXT; 表6 DBE_FILE.READ_LINE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象,文件必须以读模式打开,否则会抛出INVALID_OPERATION的异常。 buffer text OUT 否 接收数据的buffer。 len integer IN 是 从文件中读取的字节数,默认值为NULL。如果是NULL,会使用max_line_size来指定大小。 DBE_FILE.WRITE 函数DBE_FILE.WRITE用于向文件对应的缓冲区中写入buffer中的数据,文件必须以写模式打开,这个操作不会写入行终结符。 DBE_FILE.WRITE函数原型为: 1 2 3 4 5 6 7 8 9 DBE_FILE.WRITE( file IN INTEGER, buffer IN TEXT) RETURN BOOLEAN; DBE_FILE.WRITE( file IN DBE_FILE.FILE_TYPE, buffer IN TEXT) RETURN VOID; 表7 DBE_FILE.WRITE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象,要写入的文件必须以写模式打开,这个操作不会写入行终结符。 buffer text IN 是 写入文件的文本数据。每行的累计写入长度不能大于或等于OPEN或FOPEN时指定或默认的max_line_size,否则会在刷新到文件时报错,该参数为空时接口会直接返回。 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 DBE_FILE.NEW_LINE 函数DBE_FILE.NEW_LINE用于向文件对应的缓冲区中写入一个或者多个行终结符,行终结符和平台相关。 DBE_FILE.NEW_LINE函数原型为: 1 2 3 4 5 6 7 8 9 DBE_FILE.NEW_LINE( file IN INTEGER, line_nums IN INTEGER DEFAULT 1) RETURN BOOLEAN; DBE_FILE.NEW_LINE( file IN DBE_FILE.FILE_TYPE, line_nums IN INTEGER DEFAULT 1) RETURN VOID; 表8 DBE_FILE.NEW_LINE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 line_nums integer IN 是 写入到文件中的行终结符的数量,默认值为1,指定为空时不写入行终结符。 DBE_FILE.WRITE_LINE 函数DBE_FILE.WRITE_LINE用于向文件对应的缓冲区中写入buffer中的数据,文件必须以写模式打开,这个操作会自动追加行终结符。 DBE_FILE.WRITE_LINE函数原型为: 1 2 3 4 5 6 7 8 9 10 11 DBE_FILE.WRITE_LINE( file IN INTEGER, buffer IN TEXT, flush IN BOOLEAN DEFAULT FALSE) RETURN BOOLEAN; DBE_FILE.WRITE_LINE( file IN DBE_FILE.FILE_TYPE, buffer IN TEXT, flush IN BOOLEAN DEFAULT FALSE) RETURN VOID; 表9 DBE_FILE.WRITE_LINE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 buffer text IN 是 要写入文件的文本数据,每行的长度(包含换行符)不能大于OPEN或FOPEN时指定或默认的max_line_size,否则会在刷新到文件时报错。 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 flush boolean IN 是 在WRITE_LINE后是否要将文件对应缓冲区中的数据刷到磁盘,默认值或者该参数为空时为FALSE。 DBE_FILE.FORMAT_WRITE 函数DBE_FILE.FORMAT_WRITE将格式化数据写入到一个打开的文件对应的缓冲区中,是允许格式化的DBE_FILE.WRITE接口。 DBE_FILE.FORMAT_WRITE函数原型为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 DBE_FILE.FORMAT_WRITE( file IN INTEGER, format IN TEXT, arg1 IN TEXT DEFAULT NULL, . . . arg6 IN TEXT DEFAULT NULL) RETURN BOOLEAN; DBE_FILE.FORMAT_WRITE( file IN DBE_FILE.FILE_TYPE, format IN TEXT, arg1 IN TEXT DEFAULT NULL, . . . arg6 IN TEXT DEFAULT NULL) RETURN VOID; 表10 DBE_FILE.FORMAT_WRITE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 format text IN 是 格式化的字符串,包含文本和格式符\n和%s。若指定为空时,则不写入任何数据。 [arg1. . .arg6] text IN 是 1到6个可选的参数串,参数和格式化字符的位置是一一对应的,如果存在格式化字符而没有提供参数或者参数为空,会使用空串来替代%s。 DBE_FILE.GET_RAW 函数DBE_FILE.GET_RAW从一个打开的文件读取RAW类型数据,并把读取的结果存放到buffer中,从r中返回。 DBE_FILE.GET_RAW存储过程原型为: 1 2 3 4 5 6 7 8 9 10 11 DBE_FILE.GET_RAW( file IN INTEGER, r OUT RAW, length IN INTEGER DEFAULT NULL) RETURN RAW; DBE_FILE.GET_RAW( file IN DBE_FILE.FILE_TYPE, r OUT RAW, length IN INTEGER DEFAULT NULL) RETURN BOOLEAN; 表11 DBE_FILE.GET_RAW接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file INTEGER或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 r RAW OUT 否 接收RAW类型数据的buffer。 length INTEGER IN 是 从文件中读取的字节数,默认值为NULL,如果是NULL,会使用RAW类型最大长度来指定大小。 DBE_FILE.PUT_RAW 函数DBE_FILE.PUT_RAW用于向文件对应的缓冲区中写入RAW类型数据。 DBE_FILE.PUT_RAW函数原型为: 1 2 3 4 5 6 7 8 9 10 11 DBE_FILE.PUT_RAW ( file IN INTEGER, r IN RAW, flush IN BOOLEAN DEFAULT FALSE) RETURN BOOLEAN; DBE_FILE.PUT_RAW ( file IN DBE_FILE.FILE_TYPE, r IN RAW, flush IN BOOLEAN DEFAULT FALSE) RETURN VOID; 表12 DBE_FILE.PUT_RAW接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file INTEGER或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 r RAW IN 否 写入文件的RAW类型数据。 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 flush BOOLEAN IN 是 在PUT_RAW后是否要刷到磁盘,不指定或指定为空时采用FALSE。 DBE_FILE.FLUSH 函数DBE_FILE.FLUSH将缓冲区中的数据写入到物理文件中,缓存中的数据必须要有一个行终结符。该函数可以将缓冲区的数据及时写入到对应的物理文件中。 DBE_FILE.FLUSH函数原型为: 1 2 3 4 5 6 7 DBE_FILE.FLUSH( file IN INTEGER) RETURN VOID; DBE_FILE.FLUSH( file IN DBE_FILE.FILE_TYPE) RETURN VOID; 表13 DBE_FILE.FLUSH接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file INTEGER或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 DBE_FILE.CLOSE 函数DBE_FILE.CLOSE用于关闭一个打开的文件句柄,当调用这个函数的时候,如果还有等待写入的缓存的数据,可能会收到异常信息,正常关闭返回TRUE。 DBE_FILE.CLOSE函数原型为: 1 2 3 4 5 6 7 DBE_FILE.CLOSE( file IN INTEGER) RETURN BOOLEAN; DBE_FILE.CLOSE( file IN DBE_FILE.FILE_TYPE) RETURN BOOLEAN; 表14 DBE_FILE.CLOSE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file integer或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 DBE_FILE.CLOSE_ALL 函数DBE_FILE.CLOSE_ALL关闭一个会话中打开的所有的文件句柄,可用于紧急的清理操作。 DBE_FILE.CLOSE_ALL函数原型为: 1 2 DBE_FILE.CLOSE_ALL() RETRUN VOID; DBE_FILE.REMOVE 函数DBE_FILE.REMOVE删除一个磁盘文件,使用的时候需要有充分的权限。 DBE_FILE.REMOVE函数原型为: 1 2 3 4 DBE_FILE.REMOVE( dir IN TEXT, file_name IN TEXT) RETURN VOID; 表15 DBE_FILE.REMOVE接口参数说明 参数 类型 入参/出参 是否可以为空 描述 dir TEXT IN 否 文件的目录位置,这个字符串是一个目录对象名。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包操作safe_data_path指定文件路径下的文件。 file_name TEXT IN 否 文件名。 DBE_FILE.RENAME 函数DBE_FILE.RENAME重命名一个磁盘文件,类似Unix的mv指令。 DBE_FILE.RENAME函数原型为: 1 2 3 4 5 6 7 DBE_FILE.RENAME( src_dir IN TEXT, src_file_name IN TEXT, dest_dir IN TEXT, dest_file_name IN TEXT, overwrite IN BOOLEAN DEFAULT FALSE) RETURN VOID; 表16 DBE_FILE.RENAME接口参数说明 参数 类型 入参/出参 是否可以为空 描述 src_dir TEXT IN 否 源文件的目录位置(大小写敏感)。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包操作safe_data_path指定文件路径下的文件。 src_file_name TEXT IN 否 要进行命名的源文件。 dest_dir TEXT IN 否 目的目录位置(大小写敏感)。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包操作safe_data_path指定文件路径下的文件。 dest_file_name text IN 否 新的文件名。 overwrite boolean IN 是 是否重写,参数指定为空或者不指定时表示不重写。在不重写的情况下,如果目的目录下已存在同名文件会报错。 DBE_FILE.COPY 函数DBE_FILE.COPY复制一个连续区域的内容到一个新创建的文件中,如果忽略了start_line和end_line会复制整个文件。 DBE_FILE.COPY函数原型为: 1 2 3 4 5 6 7 8 DBE_FILE.COPY( src_dir IN TEXT, src_file_name IN TEXT, dest_dir IN TEXT, dest_file_name IN TEXT, start_line IN INTEGER DEFAULT 1, end_line IN INTEGER DEFAULT NULL) RETURN VOID; 表17 DBE_FILE.COPY接口参数说明 参数 类型 入参/出参 是否可以为空 描述 src_dir TEXT IN 否 源文件所在的目录。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包操作safe_data_path指定文件路径下的文件。 src_file_name TEXT IN 否 要复制的源文件名。 dest_dir TEXT IN 否 目的文件所在的目录。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包操作safe_data_path指定文件路径下的文件。 dest_file_name TEXT IN 否 目的文件名。 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 start_line TEXT IN 否 复制开始的行号,默认为1。 end_line TEXT IN 是 复制结束的行号,默认为NULL,如果是NULL,则指定到文件尾。 DBE_FILE.GET_ATTR 函数DBE_FILE.GET_ATTR读取并返回一个磁盘文件的属性。 DBE_FILE.GET_ATTR存储过程原型为: 1 2 3 4 5 6 7 DBE_FILE.GET_ATTR( location IN TEXT, filename IN TEXT, fexists OUT BOOLEAN, file_length OUT BIGINT, block_size OUT INTEGER) RETURN RECORD; 表18 DBE_FILE.GET_ATTR接口参数说明 参数 类型 入参/出参 是否可以为空 描述 location TEXT IN 否 文件所在的目录。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包操作safe_data_path指定文件路径下的文件。 filename TEXT IN 否 文件名。 fexists boolean OUT 否 文件是否存在。 file_length BIGINT OUT 否 文件的字节长度,如果文件不存在返回NULL。 block_size INTEGE OUT 否 文件系统的块大小(单位字节),如果文件不存在返回NULL。 DBE_FILE.SEEK 函数DBE_FILE.SEEK根据用户指定的字节数向前或者向后调整文件指针的位置。 DBE_FILE.SEEK函数原型为: 1 2 3 4 5 6 7 8 9 10 11 DBE_FILE.SEEK( file IN INTEGER, absolute_start IN BIGINT DEFAULT NULL, relative_start IN BIGINT DEFAULT NULL) RETURN VOID; DBE_FILE.SEEK( file IN DBE_FILE.FILE_TYPE, absolute_start IN BIGINT DEFAULT NULL, relative_start IN BIGINT DEFAULT NULL) RETURN VOID; 表19 DBE_FILE.SEEK接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file INTEGER或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 absolute_start BIGINT IN 是 文件偏移的绝对位置,默认值为NULL。 relative_start BIGINT IN 是 文件偏移的相对位置。如果值是正数,向前偏移;如果是负数,向后偏移;默认值为NULL。如果和absolute_start参数同时指定,以absolute_start参数为准。 DBE_FILE.GET_POS 函数DBE_FILE.GET_POS以字节为单位返回文件当前的偏移量。 DBE_FILE.FGETPOS函数原型为: 1 2 3 4 5 6 7 DBE_FILE.GET_POS( file IN INTEGER) RETURN BIGINT; DBE_FILE.GET_POS( file IN DBE_FILE.FILE_TYPE) RETURN BIGINT; 表20 DBE_FILE.GET_POS接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file INTEGER或dbe_file.file_type IN 否 通过OPEN打开的文件句柄或者FOPEN打开的DBE_FILE.FILE_TYPE类型的对象。 DBE_FILE.FOPEN_NCHAR 函数DBE_FILE.FOPEN_NCHAR用来打开一个文件,可以指定文件每行的最大字节数,一个会话内最多可以同时打开50个文件。该函数返回一个封装了文件句柄的DBE_FILE.FILE_TYPE类型对象。该函数以国家字符集模式打开文件以进行输入或输出。 DBE_FILE.FOPEN_NCHAR函数原型为: 1 2 3 4 5 6 DBE_FILE.FOPEN_NCHAR( dir IN TEXT, file_name IN TEXT, open_mode IN TEXT, max_line_size IN INTEGER DEFAULT 1024) RETURN DBE_FILE.FILE_TYPE; 表21 DBE_FILE.FOPEN_NCHAR接口参数说明 参数 类型 入参/出参 是否可以为空 描述 dir TEXT IN 否 文件的目录位置,这个字符串是一个目录对象名。 说明: 文件目录的位置,需要添加到系统表PG_DIRECTORY中,如果传入的路径和PG_DIRECTORY中的路径不匹配,会报路径不存在的错误。 在打开guc参数safe_data_path时,用户只能通过高级包读写safe_data_path指定文件路径下的文件。 file_name TEXT IN 否 文件名,包含扩展(文件类型),不包括路径名。如果文件名中包含路径,在FOPEN_NCHAR中会被忽略,在Unix系统中,文件名不能以/.结尾。 open_mode TEXT IN 否 指定文件的打开模式,包含: r:read text w:write text a:append text rb:read byte wb:write byte ab:append byte 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 max_line_size integer IN 是 每行的最大字节数,包含换行符(最小值是1,最大值是32767)。如果没有指定或指定该参数为空,会使用默认值1024。 DBE_FILE.WRITE_NCHAR 函数DBE_FILE.WRITE_NCHAR用于向文件的缓冲区中写入buffer中的数据,文件必须以国家字符集模式和写模式打开,这个操作不会写入行终结符。文本字符串将以UTF-8字符集格式写入。 DBE_FILE.WRITE_NCHAR函数原型为: 1 2 3 4 DBE_FILE.WRITE_NCHAR( file IN DBE_FILE.FILE_TYPE, buffer IN NVARCHAR2) RETURN VOID; 表22 DBE_FILE.WRITE_NCHAR接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file dbe_file.file_type IN 否 通过FOPEN_NCHAR打开的DBE_FILE.FILE_TYPE类型的对象,要写入的文件必须以写模式打开,这个操作不会写入行终结符。 buffer NVARCHAR2 IN 是 写入文件的文本数据。每行的累计写入长度不能大于或等于FOPEN_NCHAR时指定或默认的max_line_size,否则会在刷新到文件时报错。 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 DBE_FILE.WRITE_LINE_NCHAR 函数DBE_FILE.WRITE_LINE_NCHAR用于向文件的缓冲区中写入buffer中的数据,文件必须以国家字符集模式和写模式打开,这个操作会自动追加行终结符。文本字符串将以UTF8字符集格式写入。 DBE_FILE.WRITE_LINE_NCHAR函数原型为: 1 2 3 4 DBE_FILE.WRITE_LINE_NCHAR( file IN DBE_FILE.FILE_TYPE, buffer IN NVARCHAR2) RETURN VOID; 表23 DBE_FILE.WRITE_LINE_NCHAR接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file dbe_file.file_type IN 否 通过FOPEN_NCHAR打开的DBE_FILE.FILE_TYPE类型的对象。 buffer NVARCHAR2 IN 是 要写入文件的文本数据,每行的长度(包含换行符)不能大于FOPEN_NCHAR时指定或默认的max_line_size,否则会在刷新到文件时报错。 说明: 对于写操作,会检测写入文件类型,如果为elf类型文件,会报错退出。 DBE_FILE.FORMAT_WRITE_NCHAR 函数DBE_FILE.FORMAT_WRITE_NCHAR将格式化数据写入到一个打开的文件的缓冲区中,是允许格式化的DBE_FILE.WRITE_NCHAR接口。 DBE_FILE.FORMAT_WRITE_NCHAR函数原型为: 1 2 3 4 5 6 7 DBE_FILE.FORMAT_WRITE_NCHAR( file IN DBE_FILE.FILE_TYPE, format IN NVARCHAR2, arg1 IN NVARCHAR2 DEFAULT NULL, . . . arg5 IN NVARCHAR2 DEFAULT NULL) RETURN VOID; 表24 DBE_FILE.FORMAT_WRITE_NCHAR接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file dbe_file.file_type IN 否 通过FOPEN_NCHAR打开的DBE_FILE.FILE_TYPE类型的对象。 format NVARCHAR2 IN 是 格式化的字符串,包含文本和格式符\n和%s。 [arg1. . .arg5] NVARCHAR2 IN 是 1到5个可选的参数串,参数和格式化字符的位置是一一对应的,如果存在格式化字符而没有提供参数,会使用空串来替代%s。 DBE_FILE.READ_LINE_NCHAR 函数DBE_FILE.READ_LINE_NCHAR从一个打开的文件读取数据,并把读取的结果存放到buffer中。读取的时候会读取到行尾,但不包含行终结符,或者读取到文件末尾,或者读取到len参数指定的大小。读取的长度不能超过FOPEN_NCHAR的时候指定的max_line_size。 DBE_FILE.READ_LINE_NCHAR存储过程原型为: 1 2 3 4 5 DBE_FILE.READ_LINE_NCHAR( file IN DBE_FILE.FILE_TYPE, buffer OUT NVARCHAR2, len IN INTEGER DEFAULT NULL) RETURN NVARCHAR2; 表25 DBE_FILE.READ_LINE_NCHAR接口参数说明 参数 类型 入参/出参 是否可以为空 描述 file dbe_file.file_type IN 否 通过FOPEN_NCHAR打开的DBE_FILE.FILE_TYPE类型的对象,文件必须以读模式打开,否则会抛出INVALID_OPERATION的异常。 buffer NVARCHAR2 OUT 否 接收数据的buffer。 len INTEGER IN 是 从文件中读取的字节数,默认值为NULL。如果是NULL,会使用max_line_size来指定大小。
  • 注意事项 DBE_FILE要求以DBE_FILE.FOPEN打开的文件是以数据库字符集编码,如果打开的文件未按预期的字符集编码,在使用DBE_FILE.READ_LINE读取文件时,会发生编码校验错误;DBE_FILE要求以DBE_FILE.FOPEN_NCHAR打开的文件是以UTF-8字符集编码,如果打开的文件未按预期的字符集编码,在使用DBE_FILE.READ_LINE_NCHAR读取文件时,会发生编码校验错误。 当使用DBE_OUTPUT.PUT_LINE打印DBE_FILE.READ_LINE_NCHAR接口得到的结果时,需要确保UTF-8字符集编码能够转换成当前数据库字符集编码,满足上述条件后可以正常输出结果。DBE_OUTPUT.PRINT_LINE不支持该功能。 DBE_FILE要求客户端字符集编码与数据库字符集编码保持一致。 当数据库字符集编码为ASCII编码,客户端字符集编码为支持中文的编码,且在客户端调用DBE_FILE.WRITE_NCHAR或DBE_FILE.WRITE_LINE_NCHAR接口写入中文相关内容时,若输入的内容为UTF-8编码格式,无法保证写入的内容按UTF-8格式编码。这可能会导致后续使用DBE_FILE.READ_LINE_NCHAR时报错。
  • 数据类型介绍 DBE_FILE.FILE_TYPE DBE_FILE.FILE_TYPE类型定义了DBE_FILE包中文件的表示方式,DBE_FILE.FILE_TYPE中的字段是DBE_FILE包的私有字段,请不要直接修改DBE_FILE.FILE_TYPE类型对象中字段的值。 1 2 3 4 5 CREATE TYPE DBE_FILE.FILE_TYPE AS( id INTEGER, datatype INTEGER, byte_mode BOOLEAN ); 表1 DBE_FILE.FILE_TYPE字段说明 参数 描述 id 文件句柄。 datatype 表明文件是CHAR文件还是NCHAR文件或者二进制文件,目前支持CHAR文件和NCHAR文件。CHAR文件返回1,NCHAR文件返回2。 byte_mode 表明文件是以二进制模式打开(TRUE)还是以文本模式打开(FALSE)。
  • DBE_PLDEBUGGER.finish 执行存储过程中当前的SQL直到下一个断点触发或执行到上层栈的下一行,如表1所示。 表1 finish入参和返回值列表 名称 类型 描述 funcoid OUT oid 函数id。 funcname OUT text 函数名。 lineno OUT integer 当前调试运行的下一行行号。 query OUT text 当前调试的下一行函数源码。 父主题: DBE_PLDEBUGGER Schema
  • 示例 重命名索引。 --创建test1表并为其创建索引。 gaussdb=# CREATE TABLE test1(col1 INT, col2 INT); gaussdb=# CREATE INDEX aa ON test1(col1); --将索引aa重命名为idx_test1_col1。 gaussdb=# ALTER INDEX aa RENAME TO idx_test1_col1; --查询test1表上的索引信息。 gaussdb=# SELECT tablename,indexname,tablespace FROM pg_indexes WHERE tablename = 'test1'; tablename | indexname | tablespace -----------+----------------+------------ test1 | idx_test1_col1 | (1 row) 修改索引所属表空间。 --创建表空间tbs_index1。 gaussdb=# CREATE TABLESPACE tbs_index1 RELATIVE LOCATION 'tablespace1/tbs_index1'; --修改索引idx_test1_col1的所属表空间为tbs_index1。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 SET TABLESPACE tbs_index1; --查询test1表上的索引信息。 gaussdb=# SELECT tablename,indexname,tablespace FROM pg_indexes WHERE tablename = 'test1'; tablename | indexname | tablespace -----------+----------------+------------ test1 | idx_test1_col1 | tbs_index1 (1 row) 修改与重置索引存储参数。 --查看索引idx_test1_col1详细信息。 gaussdb=# \di idx_test1_col1 List of relations Schema | Name | Type | Owner | Table | Storage --------+----------------+-------+-------+-------+--------- public | idx_test1_col1 | index | omm | test1 | {storage_type=USTORE} (1 row) --修改索引idx_test1_col1 的填充因子。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 SET (FILLFACTOR = 70); --查看索引idx_test1_col1详细信息。 gaussdb=# \di idx_test1_col1 List of relations Schema | Name | Type | Owner | Table | Storage --------+----------------+-------+-------+-------+----------------- public | idx_test1_col1 | index | omm | test1 | {storage_type=USTORE,fillfactor=70} (1 row) --重置索引idx_test1_col1 的存储参数。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 RESET (FILLFACTOR); --查看索引idx_test1_col1详细信息。 gaussdb=# \di idx_test1_col1 List of relations Schema | Name | Type | Owner | Table | Storage --------+----------------+-------+-------+-------+--------- public | idx_test1_col1 | index | omm | test1 | {storage_type=USTORE} (1 row) 修改索引可用性和可见性。 --设置索引idx_test1_col1不可用。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 UNUSABLE; --查看索引idx_test1_col1的可用性。 gaussdb=# SELECT indisusable FROM pg_index WHERE indexrelid = 'idx_test1_col1'::regclass; indisusable ------------- f (1 row) --重建索引idx_test1_col1。 gaussdb=# ALTER INDEX idx_test1_col1 REBUILD; --查看索引idx_test1_col1的可用性。 gaussdb=# SELECT indisusable FROM pg_index WHERE indexrelid = 'idx_test1_col1'::regclass; indisusable ------------- t (1 row) --设置索引idx_test1_col1不可见。 gaussdb=# ALTER INDEX idx_test1_col1 INVISIBLE; --查询索引idx_test1_col1可见行,字段indexdef返回值中有"INVISIBLE"字样。 gaussdb=# SELECT * FROM pg_indexes WHERE tablename = 'test1'; schemaname | tablename | indexname | tablespace | indexdef ------------+-----------+----------------+------------+--------------------------------------------------------------------------------------------------------------------- public | test1 | idx_test1_col1 | tbs_index1 | CREATE INDEX idx_test1_col1 ON test1 USING ubtree (col1) WITH (storage_type=USTORE) TABLESPACE tbs_index1 INVISIBLE (1 row) --设置索引idx_test1_col1可见。 gaussdb=# ALTER INDEX idx_test1_col1 VISIBLE; --查询索引idx_test1_col1可见行,字段indexdef返回值中无"INVISIBLE"字样。 gaussdb=# SELECT * FROM pg_indexes WHERE tablename = 'test1'; schemaname | tablename | indexname | tablespace | indexdef ------------+-----------+----------------+------------+----------------------------------------------------------------------------------------------------------- public | test1 | idx_test1_col1 | tbs_index1 | CREATE INDEX idx_test1_col1 ON test1 USING ubtree (col1) WITH (storage_type=USTORE) TABLESPACE tbs_index1 (1 row) --删除。 gaussdb=# DROP INDEX idx_test1_col1; gaussdb=# DROP TABLE test1; gaussdb=# DROP TABLESPACE tbs_index1; 重命名索引分区。 --创建分区表test2。 gaussdb=# CREATE TABLE test2(col1 int, col2 int) PARTITION BY RANGE (col1)( PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (200) ); --创建分区索引。 gaussdb=# CREATE INDEX idx_test2_col1 ON test2(col1) LOCAL( PARTITION p1, PARTITION p2 ); --重命名索引分区。 gaussdb=# ALTER INDEX idx_test2_col1 RENAME PARTITION p1 TO p1_test2_idx; gaussdb=# ALTER INDEX idx_test2_col1 RENAME PARTITION p2 TO p2_test2_idx; --查询索引idx_test2_col1分区的名称。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_test2_col1'::regclass; relname -------------- p1_test2_idx p2_test2_idx (2 rows) 修改索引分区的所属表空间。 --创建表空间tbs_index2与tbs_index3。 gaussdb=# CREATE TABLESPACE tbs_index2 RELATIVE LOCATION 'tablespace1/tbs_index2'; gaussdb=# CREATE TABLESPACE tbs_index3 RELATIVE LOCATION 'tablespace1/tbs_index3'; --修改索引idx_test2_col1分区的所属表空间。 gaussdb=# ALTER INDEX idx_test2_col1 MOVE PARTITION p1_test2_idx TABLESPACE tbs_index2; gaussdb=# ALTER INDEX idx_test2_col1 MOVE PARTITION p2_test2_idx TABLESPACE tbs_index3; --查询索引idx_test2_col1分区的所属表空间。 gaussdb=# SELECT t1.relname index_name, t2.spcname tablespace_name FROM pg_partition t1, pg_tablespace t2 WHERE t1.parentid = 'idx_test2_col1'::regclass AND t1.reltablespace = t2.oid; index_name | tablespace_name --------------+----------------- p1_test2_idx | tbs_index2 p2_test2_idx | tbs_index3 (2 rows) --删除。 gaussdb=# DROP INDEX idx_test2_col1; gaussdb=# DROP TABLE test2; gaussdb=# DROP TABLESPACE tbs_index2; gaussdb=# DROP TABLESPACE tbs_index3;
  • 语法格式 重命名表索引的名称。 ALTER INDEX [ IF EXISTS ] index_name RENAME TO new_name; 修改表索引的所属空间。 ALTER INDEX [ IF EXISTS ] index_name SET TABLESPACE tablespace_name; 修改表索引的存储参数。 ALTER INDEX [ IF EXISTS ] index_name SET ( {storage_parameter = value} [, ... ] ); 重置表索引的存储参数。 ALTER INDEX [ IF EXISTS ] index_name RESET ( storage_parameter [, ... ] ) ; 设置表索引或索引分区不可用。 ALTER INDEX [ IF EXISTS ] index_name [ MODIFY PARTITION index_partition_name ] UNUSABLE; 重建表索引或索引分区。 ALTER INDEX index_name REBUILD [ PARTITION index_partition_name ]; 重命名索引分区。 ALTER INDEX [ IF EXISTS ] index_name RENAME PARTITION index_partition_name TO new_index_partition_name; 修改索引分区的所属表空间。 ALTER INDEX [ IF EXISTS ] index_name MOVE PARTITION index_partition_name TABLESPACE new_tablespace; 设置分布式全局二级索引就绪。 ALTER INDEX [ IF EXISTS ] index_name GSIVALID; 集中式不支持分布式全局二级索引,因此不支持该语法。
  • 参数说明 index_name 要修改的索引名称。 IF EXISTS 如果指定的索引不存在,则发出一个notice而不是error。 RENAME TO new_name 只改变索引的名称。对存储的数据没有影响。 new_name 新的索引名。 取值范围:字符串,且符合标识符命名规范。 SET TABLESPACE tablespace_name 改变索引的表空间为指定表空间,并且把索引相关的数据文件移动到新的表空间里。 tablespace_name 表空间的名称。 取值范围:已存在的表空间。 SET ( {storage_parameter = value} [, ... ] ) 改变索引的一个或多个索引方法特定的存储参数。需要注意的是索引内容不会被这个命令立即修改,根据参数的不同,可能需要使用REINDEX重建索引来获得期望的效果。 storage_parameter 索引方法特定的参数名。ACTIVE_PAGES表示索引的页面数量,可能比实际的物理文件页面少,可以用于优化器调优。目前只对ustore的分区表local索引生效,且会被vacuum、analyze更新(包括auto vacuum)。不建议用户手动设置该参数。 value 索引方法特定的存储参数的新值。根据参数的不同,这可能是一个数字或单词。 RESET ( { storage_parameter } [, ...] ) 重置索引的一个或多个索引方法特定的存储参数为缺省值。与SET一样,可能需要使用REINDEX来完全更新索引。 [ MODIFY PARTITION index_partition_name ] UNUSABLE 用于设置表或者索引分区上的索引不可用。 当指定的索引为唯一索引时,后续对表的插入和更新行为,会受到GUC参数enable_unique_checking_of_unusable_index的控制 REBUILD [ PARTITION index_partition_name ] 用于重建表或者索引分区上的索引。重建索引时,若索引带有lpi_parallel_method选项,取值为PARTITION且表的parallel_workers选项大于0时,不支持对该索引并行重建;无该选项或选项取值为AUTO时,并行重建时会默认走页面级并行重建索引。详见LPI_PARALLEL_METHOD。 RENAME PARTITION index_partition_name TO new_index_partition_name 用于重命名索引分区。 MOVE PARTITION index_partition_name TABLESPACE new_tablespace 用于修改索引分区的所属表空间。 new_index_partition_name 新索引分区名。 index_partition_name 索引分区名。 new_tablespace 新表空间。 GSIVALID 用于CREATE GLOBAL INDEX CONCURRENTLY功能内部调用,修改分布式全局二级索引状态。集中式不支持分布式全局二级索引,因此不支持该语法。 GSIUSABLE 用于VACUUM FULL功能内部调用,修改分布式全局二级索引状态。集中式不支持分布式全局二级索引,因此不支持该语法。 VISIBLE 用于设置索引状态为可见。 INVISIBLE 用于设置索引状态为不可见。
  • 什么是MVCC? 答:MVCC,即Muti-Version Concurrency Control(多版本并发控制)。MVCC是数据库并发控制协议的一种,写事务不会立即修改元组内容,每次操作都会在旧的版本之上创建新的版本,并且会保留旧的版本。当某个事务要读取数据时,数据库系统会从所有版本中选取出符合该事务隔离级别要求的版本。 MVCC的主要优点是:读数据的锁请求和写数据的锁请求不冲突,可以实现读不阻塞写,写不阻塞读。 父主题: FAQ
  • bgwriter_flush_after 参数说明:设置background writer线程刷脏页个数超过设定的阈值时,告知操作系统将文件缓存中的数据页面异步刷盘。 GaussDB 中,磁盘页大小为8kB。 参数类型:整型 参数单位:页面(8kB) 取值范围:0 ~ 256(0表示关闭异步刷盘功能)。 默认值:512kB(即64个页面) 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。可以设置页面的数量或字节的大小,例如,取值64或512kB,表示background writer线程连续写64个磁盘页,即64*8=512kB磁盘空间后会进行异步刷盘。gs_guc不支持以页面数量为参数单位进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改。
  • backend_flush_after 参数说明:设置backend线程刷脏页个数超过设定的阈值时,告知操作系统将文件缓存中的数据页面异步刷盘。GaussDB中,磁盘页大小为8kB。该参数可在PDB级别设置。 参数类型:整型 参数单位:页面(8kB) 取值范围:0 ~ 256(0表示关闭异步刷盘功能)。 默认值:0。在PDB场景内,若未设置该参数,则继承来自全局的设置。 设置方式:该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。可以设置页面的数量或字节的大小,例如,取值64或512kB,表示backend线程连续写64个磁盘页,即64*8=512kB磁盘空间后会进行异步刷盘。gs_guc不支持以页面数量为参数单位进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改。
  • checkpoint_flush_after 参数说明:设置checkpointer线程刷脏页个数超过设定的阈值时,告知操作系统将文件缓存中的数据页面异步刷盘。GaussDB中,磁盘页大小为8kB。 参数类型:整型 参数单位:页面(8kB) 取值范围:0 ~ 256(0表示关闭异步刷盘功能)。 默认值:256kB(即32个页面) 设置方式:该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。可以设置页面的数量或字节的大小,例如,取值32或256kB,表示checkpointer线程连续写32个磁盘页,即32*8=256kB磁盘空间后会进行异步刷盘。gs_guc不支持以页面数量为参数单位进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改。
  • 示例 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 --step1 创建表和存储过程 gaussdb=# DROP TABLE IF EXISTS t1; gaussdb=# CREATE TABLE t1 (i int); gaussdb=# CREATE OR REPLACE PROCEDURE p1() AS sql_stmt varchar2(200); result number; BEGIN for i in 1..1000 loop insert into t1 values(1); end loop; sql_stmt := 'select count(*) from t1'; EXECUTE IMMEDIATE sql_stmt into result; END; / gaussdb=# CREATE OR REPLACE PROCEDURE p2() AS BEGIN p1(); END; / gaussdb=# CREATE OR REPLACE PROCEDURE p3() AS BEGIN p2(); END; / --step2 调用plprofiler接口对存储过程进行profiling gaussdb=# SELECT dbe_profiler.pl_start_profiling('123'); gaussdb=# CALL p3(); --step3 查询相关profiling信息 --查询dbe_profiler.pl_profiling_functions表查看此次profiling涉及的存储过程 gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_functions ORDER BY run_id, funcoid; run_id | funcoid | schema | funcname | total_occur | total_time ---------------------+---------+--------+----------+-------------+------------ 140300887521024_123 | 16770 | public | p1() | 1 | 54217 140300887521024_123 | 16771 | public | p2() | 1 | 54941 140300887521024_123 | 16772 | public | p3() | 1 | 55758 (3 rows) --查询dbe_profiler.pl_profiling_details表查看存过内每条语句的执行时间细节 gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_details WHERE funcoid = 16770 ORDER BY run_id, funcoid, line#; run_id | funcoid | line# | source | cmd_type | total_occur | total_time | max_time | min_time ---------------------+---------+-------+---------------------------------------------+------------+-------------+------------+----------+---------- 140300887521024_123 | 16770 | 1 | DECLARE | | 0 | 0 | 0 | 0 140300887521024_123 | 16770 | 2 | sql_stmt varchar2(200); | | 0 | 0 | 0 | 0 140300887521024_123 | 16770 | 3 | result number; | | 0 | 0 | 0 | 0 140300887521024_123 | 16770 | 4 | begin | | 0 | 0 | 0 | 0 140300887521024_123 | 16770 | 5 | for i in 1..1000 loop | FORI | 1 | 52496 | 52496 | 52496 140300887521024_123 | 16770 | 6 | insert into t1 values(1); | EXECSQL | 1000 | 51970 | 2115 | 47 140300887521024_123 | 16770 | 7 | end loop; | | 0 | 0 | 0 | 0 140300887521024_123 | 16770 | 8 | sql_stmt := 'select count(*) from t1'; | ASSIGN | 1 | 446 | 446 | 446 140300887521024_123 | 16770 | 9 | EXECUTE IMMEDIATE sql_stmt into result; | DYNEXECUTE | 1 | 1271 | 1271 | 1271 140300887521024_123 | 16770 | 10 | end | | 0 | 0 | 0 | 0 (10 rows) --查询dbe_profiler.pl_profiling_callgraph表查看调用栈信息和对应每个存过执行的整体时间(total_time、self_time对应调用栈栈顶存储过程的总时间和自身执行时间) gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_callgraph ORDER BY run_id, stack; run_id | stack | self_time ---------------------+---------------------------------------------------------------------------+----------- 140300887521024_123 | {"public.p3() oid=16772"} | 817 140300887521024_123 | {"public.p3() oid=16772","public.p2() oid=16771"} | 724 140300887521024_123 | {"public.p3() oid=16772","public.p2() oid=16771","public.p1() oid=16770"} | 54217 (3 rows) --查询dbe_profiler.pl_profiling_trackinfo表查看存储过程每个阶段的执行时间 gaussdb=# SELECT step_name, loops_count FROM dbe_profiler.pl_profiling_trackinfo WHERE funcoid=16770; step_name | loops_count --------------+------------- init | 1 package | 1 spictx | 1 compile | 1 exec_context | 1 execute | 1 exec_cursor | 1 cleanup | 1 finsh | 1 (9 rows) --step4 删除系统表数据 gaussdb=# SELECT dbe_profiler.pl_clear_profiling(''); gaussdb=# SELECT step_name, loops_count FROM dbe_profiler.pl_profiling_trackinfo WHERE funcoid=16770; step_name | loops_count -----------+------------- (0 rows) gaussdb=# DROP TABLE t1; --step5 profiling包含自治事务的存储过程。 --建表 gaussdb=# CREATE TABLE t2(a int, b int); --创建包含自治事务的存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous(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; / --创建调用自治事务存储过程的普通存储过程 gaussdb=# CREATE OR REPLACE PROCEDURE autonomous_1(a int, b int) AS DECLARE BEGIN dbe_output.print_line('just no use call.'); insert into t2 values(666, 666); autonomous(a,b); END; / gaussdb=# SELECT dbe_profiler.pl_start_profiling ('100'); gaussdb=# CALL autonomous(11,22); --查询表信息 gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_functions ORDER BY run_id, funcoid; run_id | funcoid | schema | funcname | total_occur | total_time --------+---------+--------+----------+-------------+------------ (0 rows) gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_details ORDER BY run_id, funcoid, line#; run_id | funcoid | line# | source | cmd_type | total_occur | total_time | max_time | min_time --------+---------+-------+--------+----------+-------------+------------+----------+---------- (0 rows) gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_callgraph ORDER BY run_id, stack; run_id | stack | self_time --------+-------+----------- (0 rows) gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_trackinfo ORDER BY run_id, funcoid; run_id | funcoid | step_name | loops_count | max_time | min_time | avg_time | total_time --------+---------+-----------+-------------+----------+----------+----------+------------ (0 rows) gaussdb=# SELECT dbe_profiler.pl_start_profiling ('101'); gaussdb=# CALL autonomous_1(11,22); gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_functions ORDER BY run_id, funcoid; run_id | funcoid | schema | funcname | total_occur | total_time ---------------------+---------+------------+----------------+-------------+------------ 140421237831424_101 | 10422 | dbe_output | print_line() | 1 | 758 140421237831424_101 | 16771 | public | autonomous_1() | 1 | 23855 (2 rows) gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_details ORDER BY run_id, funcoid, line#; run_id | funcoid | line# | source | cmd_type | total_occur | total_time | max_time | min_time ---------------------+---------+-------+---------------------------------------------+----------+-------------+------------+----------+---------- 140421237831424_101 | 10422 | 1 | | | 0 | 0 | 0 | 0 140421237831424_101 | 10422 | 2 | BEGIN | | 0 | 0 | 0 | 0 140421237831424_101 | 10422 | 3 | PKG_UTIL.io_print(format, true); | PERFORM | 1 | 754 | 754 | 754 140421237831424_101 | 10422 | 4 | END; | | 0 | 0 | 0 | 0 140421237831424_101 | 10422 | 5 | | | 0 | 0 | 0 | 0 140421237831424_101 | 16771 | 1 | | | 0 | 0 | 0 | 0 140421237831424_101 | 16771 | 2 | DECLARE | | 0 | 0 | 0 | 0 140421237831424_101 | 16771 | 3 | BEGIN | | 0 | 0 | 0 | 0 140421237831424_101 | 16771 | 4 | dbe_output.print_line('just no use call.'); | PERFORM | 1 | 2435 | 2435 | 2435 140421237831424_101 | 16771 | 5 | insert into t2 values(666, 666); | EXECSQL | 1 | 602 | 602 | 602 140421237831424_101 | 16771 | 6 | autonomous(a,b); | PERFORM | 1 | 20813 | 20813 | 20813 140421237831424_101 | 16771 | 7 | END | | 0 | 0 | 0 | 0 (12 rows) gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_callgraph ORDER BY run_id, stack; run_id | stack | self_time ---------------------+-------------------------------------------------------------------------+----------- 140421237831424_101 | {"public.autonomous_1() oid=16771"} | 23097 140421237831424_101 | {"public.autonomous_1() oid=16771","dbe_output.print_line() oid=10422"} | 758 (2 rows) gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_trackinfo ORDER BY run_id, funcoid; run_id | funcoid | step_name | loops_count | max_time | min_time | avg_time | total_time ---------------------+---------+--------------+-------------+----------+----------+----------+------------ 140421237831424_101 | 10422 | init | 1 | 0 | 0 | 0 | 0 140421237831424_101 | 10422 | package | 1 | 9 | 9 | 9 | 9 140421237831424_101 | 10422 | spictx | 1 | 1 | 1 | 1 | 1 140421237831424_101 | 10422 | compile | 1 | 383 | 383 | 383 | 383 140421237831424_101 | 10422 | exec_context | 1 | 1 | 1 | 1 | 1 140421237831424_101 | 10422 | execute | 1 | 1301 | 1301 | 1301 | 1301 140421237831424_101 | 10422 | exec_cursor | 1 | 3 | 3 | 3 | 3 140421237831424_101 | 10422 | cleanup | 1 | 11 | 11 | 11 | 11 140421237831424_101 | 10422 | finsh | 1 | 0 | 0 | 0 | 0 140421237831424_101 | 16771 | init | 1 | 0 | 0 | 0 | 0 140421237831424_101 | 16771 | package | 1 | 103 | 103 | 103 | 103 140421237831424_101 | 16771 | spictx | 1 | 1 | 1 | 1 | 1 140421237831424_101 | 16771 | compile | 1 | 1869 | 1869 | 1869 | 1869 140421237831424_101 | 16771 | exec_context | 1 | 3 | 3 | 3 | 3 140421237831424_101 | 16771 | execute | 1 | 24011 | 24011 | 24011 | 24011 140421237831424_101 | 16771 | exec_cursor | 1 | 1 | 1 | 1 | 1 140421237831424_101 | 16771 | cleanup | 1 | 16 | 16 | 16 | 16 140421237831424_101 | 16771 | finsh | 1 | 1 | 1 | 1 | 1 (18 rows) gaussdb=# SELECT dbe_profiler.pl_clear_profiling(''); gaussdb=# SELECT * FROM dbe_profiler.pl_profiling_functions; run_id | funcoid | schema | funcname | total_occur | total_time --------+---------+--------+----------+-------------+------------ (0 rows) gaussdb=# DROP TABLE t2;
  • 概述 在PL/SQL函数和存储过程中查找性能问题可能会很困难。在系统或扩展视图中唯一可见的是从客户端发送的查询。在调用存储过程的情况下,这只是最外层的存储过程调用。plprofiler扩展可用于快速识别最耗时的存储过程,然后向下查看其中的单个语句耗时情况。 使用此工具,可以在会话中先创建存储过程及相关表信息,然后调用plprofiler接口对存储过程进行profiling,再执行存储过程,此时存储过程分析数据已生成。可以通过查询系统表去获取数据。表5 DBE_PROFILER.PL_PROFILING_FUNCTIONS可以查看此次profiling涉及的存储过程。 表6 DBE_PROFILER.PL_PROFILING_DETAILS查看存储过程内每条语句的执行时间细节。表7 DBE_PROFILER.PL_PROFILING_CALLGRAPH查看调用栈信息和对应每个存储过程执行的整体时间。表8 DBE_PROFILER.PL_PROFILING_TRACKINFO查看存储过程每个阶段的执行时间。可以通过接口DBE_PROFILER.PL_CLEAR_PROFILING去删除某次或所有profiling后储存在系统表里的数据。 dbe_profiler工具的原理是在执行pl_start_profiling后,系统会初始化内存以准备记录数据,然后对后续执行的存储过程进行打桩,在关键点记录详细信息,并将这些信息记录在内存中,等待事务提交之后才会将内存中的数据写入四张系统表。在事务中执行dbe_profiler工具时须注意,在事务执行阶段,由于事务未提交,所以内存中的数据不会写入系统表中,只有在执行commit后才会将数据写入系统表。同理,执行rollback后,会将所有数据进行清理。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全