华为云用户手册

  • comm_max_stream 参数说明:TCP代理通信库支持的最大并发数据流数。该参数必须大于业务并发数*每并发平均stream算子数*query_dop的平方。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,最小值为1,最大值为60000。 默认值:1024 不建议该参数值设置过大,因为comm_max_stream会占用内存(占用内存=256byte*comm_max_stream*comm_max_datanode),若并发数据流过大,查询较为复杂及smp过大都会导致内存不足。 如果comm_max_stream参数值较小,进程内存充足,可以适当将comm_max_stream值调大。
  • comm_usable_memory 参数说明:单个DN内TCP代理通信库缓存最大可使用内存。 此参数需根据环境内存及部署方式具体配置,过大会造成OOM,过小会降低TCP代理通信库或SCTP通信库性能。(当前版本SCTP不再使用) 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,最小值为100*1024,最大值为1073741823,默认单位为KB。 默认值:4000MB
  • enable_stateless_pooler_reuse 参数说明:pooler连接池复用切换开关,开启后可对已有的空闲TCP连接进行复用,重启集群生效。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 设置为on/true表示使用pooler复用模式。 设置为off/false表示关闭pooler复用模式。 CN和DN需要同步设置。如果CN设置enable_stateless_pooler_reuse为off,DN设置enable_stateless_pooler_reuse为on会导致集群不能正常通信,因此必须对该参数做CN和DN全局相同的配置,重启集群生效。 默认值:on
  • tcp_keepalives_interval 参数说明:在支持TCP_KEEPINTVL套接字选项的操作系统上,以秒数声明在重新传输之间等待响应的时间。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:0-180,单位为s。 默认值:30 如果操作系统不支持TCP_KEEPINTVL选项,这个参数的值必须为0。 在通过UNIX域套接字进行的连接的操作系统上,这个参数将被忽略。
  • tcp_keepalives_idle 参数说明:在支持TCP_KEEPIDLE套接字选项的系统上,设置发送活跃信号的间隔秒数。不设置发送保持活跃信号,连接就会处于闲置状态。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 如果操作系统不支持TCP_KEEPIDLE选项 ,这个参数的值必须为0。 在通过UNIX域套接字进行的连接的操作系统上,这个参数将被忽略。 取值范围:0-3600,单位为s。 默认值:1min
  • 注意事项 EXPLAIN PLAN不支持在DN上执行。 对于执行错误的SQL语句无法进行计划信息的收集。 PLAN_TABLE中的数据是session级生命周期并且session隔离和用户隔离,用户只能看到当前session、当前用户的数据。 PLAN_TABLE无法与GDS外表进行关联查询。 对于不能下推的查询,无法收集到具体的object信息,object只能收集到REMOTE_QUERY或CTE等信息。详见示例 2。
  • 参数说明 name 查询标签。 取值范围:字符串 EXPLAIN中的PLAN选项表示需要将计划信息存储于PLAN_TABLE中,存储成功将返回“EXPLAIN SUC CES S”。 用户可通过STATEMENT_ID对查询设置标签,输入的标签信息也将存储于PLAN_TABLE中。 用户在执行EXPLAIN PLAN时,如果没有设置STATEMENT_ID,则默认为空值。同时,用户可输入的STATEMENT_ID最大长度为30个字节,超过长度将会产生报错。
  • GLOBAL_STATIO_USER_TABLES GLOBAL_STATIO_USER_TABLES视图显示各节点的命名空间中所有用户关系表的I/O状态信息。 表1 GLOBAL_STATIO_USER_TABLES字段 名称 类型 描述 node_name name 节点名称。 relid oid 表OID。 schemaname name 该表模式名。 relname name 表名。 heap_blks_read bigint 从该表中读取的磁盘块数。 heap_blks_hit bigint 该表缓存命中数。 idx_blks_read bigint 从表中所有索引读取的磁盘块数。 idx_blks_hit bigint 表中所有索引命中缓存数。 toast_blks_read bigint 该表的TOAST表读取的磁盘块数(如果存在)。 toast_blks_hit bigint 该表的TOAST表命中缓冲区数(如果存在)。 tidx_blks_read bigint 该表的TOAST表索引读取的磁盘块数(如果存在)。 tidx_blks_hit bigint 该表的TOAST表索引命中缓冲区数(如果存在)。 父主题: Cache/IO
  • Plan Hint实际调优案例 本节以TPC-DS标准测试的Q24的部分语句为例,在1000X,24DN环境上,说明使用plan hint进行实际调优的过程。示例如下: 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 select avg(netpaid) from (select c_last_name ,c_first_name ,s_store_name ,ca_state ,s_state ,i_color ,i_current_price ,i_manager_id ,i_units ,i_size ,sum(ss_sales_price) netpaid from store_sales ,store_returns ,store ,item ,customer ,customer_address where ss_ticket_number = sr_ticket_number and ss_item_sk = sr_item_sk and ss_customer_sk = c_customer_sk and ss_item_sk = i_item_sk and ss_store_sk = s_store_sk and c_birth_country = upper(ca_country) and s_zip = ca_zip and s_market_id=7 group by c_last_name ,c_first_name ,s_store_name ,ca_state ,s_state ,i_color ,i_current_price ,i_manager_id ,i_units ,i_size); 该语句的初始计划如下,运行时间110s: 该计划中,第10层算子使用broadcast性能较差,由于第11层算子估算行数为2140,比实际行数严重低估。错误行数估算主要来源于第13层算子的行数低估,根因是第13层hashjoin中,使用store_sales的(ss_ticket_number, ss_item_sk)列和store_returns的(sr_ticket_number, sr_item_sk)列进行关联,由于缺少多列相关性的估算导致行数严重低估。 2. 使用如下的rows hint进行调优后,计划如下,运行时间318s: 1 2 select avg(netpaid) from (select /*+rows(store_sales store_returns * 11270)*/ c_last_name ... 时间反而劣化了,原因是第8层hashjoin过慢引起第9层redistribute时间过慢导致,其中第9层redistribute并没有数据倾斜,hashjoin慢的原因是由于第18层redistribute后数据倾斜导致。 3. 经过实际数据查证,customer_address的两个join列的不同值数目较少,使用其进行join容易出现数据倾斜,故把customer_address放到最后进行join。使用如下的hint进行调优后,计划如下,运行时间116s: 1 2 3 4 select avg(netpaid) from (select /*+rows(store_sales store_returns *11270) leading((store_sales store_returns store item customer) customer_address)*/ c_last_name ... 发现时间基本花在了第6层redistribute算子上,需要进一步优化。 4. 由于最后一层redistribute包含倾斜,所以时间较长。为了避免倾斜,需要将item表放在最后join,由于item表的join并不能使行数减少。修改hint如下并执行,计划如下,运行时间120s: 1 2 3 4 select avg(netpaid) from (select /*+rows(store_sales store_returns *11270) leading((customer_address (store_sales store_returns store customer) item)) c_last_name ... 该计划中的redistribute问题并没有解决,因为第22层item表做了broadcast,导致与customer_address表join后的倾斜并没有被消除掉。 5. 增加如下禁止item表做broadcast的hint,使与customer_address join的表做redistribute(也可以进行join表redistribute的hint),计划如下,运行时间105s: 1 2 3 4 5 select avg(netpaid) from (select /*+rows(store_sales store_returns *11270) leading((customer_address (store_sales store_returns store customer) item)) no broadcast(item)*/ c_last_name ... 6. 发现最后一层使用单层Agg,但行数缩减较多。使用相同的hint,同时结合参数best_agg_plan=3进行双层Agg调优,最终计划如下图所示,运行时间94s,完成调优。 如果有统计信息变更引起的查询劣化,可以考虑用plan hint来调整到之前的查询计划。这里以TPCH-Q17为例,在收集default_statistics_target设置为–2的统计信息之后,计划相比于默认统计信息发生劣化。 1. 默认统计信息(default_statistics_target设置为100)的计划如下: 2. 统计信息变更(default_statistics_target设置为–2)的计划如下: 3. 经过对比,劣化的原因主要为lineitem和part表join时stream类型由BroadCast变更为Redistribute导致。可以对语句进行stream方式的hint来调整到之前的计划,例如: 父主题: 使用Plan Hint进行调优
  • PG_TOTAL_USER_RESOURCE_INFO PG_TOTAL_USER_RESOURCE_INFO视图显示所有用户的资源使用情况,需要使用管理员用户进行查询。此视图在GUC参数use_workload_manager为on时才有效。其中,I/O相关监控项在参数enable_logical_io_statistics为on时才有效。 表1 PG_TOTAL_USER_RESOURCE_INFO字段 名称 类型 描述 username name 用户名。 used_memory integer 正在使用的内存大小,单位MB。 total_memory integer 可以使用的内存大小,单位MB。值为0表示未限制最大可用内存,其限制取决于数据库最大可用内存。 used_cpu double precision 正在使用的CPU核数(仅统计复杂作业CPU使用 情况,且该值为相关控制组的CPU使用统计值)。 total_cpu integer 在该机器节点上,用户关联控制组的CPU核数总和。 used_space bigint 已使用的永久表存储空间大小,单位KB。 total_space bigint 可使用的永久表存储空间大小,单位KB,值为-1表示未限制最大存储空间。 used_temp_space bigint 已使用的临时空间大小,单位KB。 total_temp_space bigint 可使用的临时空间总大小,单位KB,值为-1表示未限制。 used_spill_space bigint 已使用的算子落盘空间大小,单位KB。 total_spill_space bigint 可使用的算子落盘空间总大小,单位KB,值为-1表示未限制。 read_kbytes bigint CN:过去5秒内,该用户在所有DN上复杂作业read的字节总数(单位KB)。 DN:实例启动至当前时间为止,该用户复杂作业read的字节总数(单位KB)。 write_kbytes bigint CN:过去5秒内,该用户在所有DN上复杂作业write的字节总数(单位KB)。 DN:实例启动至当前时间为止,该用户复杂作业write的字节总数(单位KB)。 read_counts bigint CN:过去5秒内,该用户在所有DN上复杂作业read的次数之和(单位次)。 DN:实例启动至当前时间为止,该用户复杂作业read的次数之和(单位次)。 write_counts bigint CN:过去5秒内,该用户在所有DN上复杂作业write的次数之和(单位次)。 DN:实例启动至当前时间为止,该用户复杂作业write的次数之和(单位次)。 read_speed double precision CN:过去5秒内,该用户在单个DN上复杂作业read平均速率(单位KB/s)。 DN:过去5秒内,该用户在该DN上复杂作业read平均速率(单位KB/s)。 write_speed double precision CN:过去5秒内,该用户在单个DN上复杂作业write平均速率(单位KB/s)。 DN:过去5秒内,该用户在该DN上复杂作业write平均速率(单位KB/s)。 父主题: 系统视图
  • temp_file_limit 参数说明:限制一个会话中,触发下盘操作时,下盘文件占用的空间大小。例如一次会话中,排序和哈希表使用的临时文件,或者游标占用的临时文件。 此设置为会话级别的下盘文件控制。 该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。 SQL查询执行时使用的临时表空间不在此限制。 取值范围:整型,-1~2147483647,单位为KB。其中-1表示没有限制。 默认值:-1
  • DB_IND_COLUMNS DB_IND_COLUMNS视图显示当前用户可访问的所有索引的字段信息。该视图同时存在于PG_CATA LOG 和SYS Schema下。 表1 DB_IND_COLUMNS字段 名称 类型 描述 index_owner character varying(64) 索引的所有者。 index_name character varying(64) 索引名。 table_owner character varying(64) 表的所有者。 table_name character varying(64) 表名。 column_name name 列名。 column_position smallint 索引中列的位置。 父主题: 系统视图
  • 参数说明 SESSION 声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。 如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。 TIME ZONE timezone 用于指定当前会话的本地时区。 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 CURRENT_SCHEMA schema CURRENT_SCHEMA用于指定当前的模式。 取值范围:已存在模式名称。如果模式名不存在,会导致CURRENT_SCHEMA值为空。 SCHEMA schema 同CURRENT_SCHEMA。此处的schema是个字符串。 例如:set schema 'public'; NAMES encoding_name 用于设置客户端的字符编码。等价于set client_encoding to encoding_name。 取值范围:有效的字符编码。该选项对应的运行时参数名称为client_encoding,默认编码为UTF8。 XML OPTION option 用于设置XML的解析方式。 取值范围:CONTENT(缺省)、DOCUMENT config_parameter 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。
  • 语法格式 设置会话的事务参数。 1 2 ALTER SESSION SET [ SESSION CHARACTERIS TICS AS ] TRANSACTION { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED } | { READ ONLY | READ WRITE } } [, ...] ; 设置会话的其他运行时参数。 1 2 3 4 5 6 7 8 9 10 ALTER SESSION SET {{config_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }} | CURRENT_SCHEMA [ TO | = ] { schema | DEFAULT } | TIME ZONE time_zone | SCHEMA 'schema' | NAMES encoding_name | ROLE role_name PASSWORD 'password' | SESSION AUTHORIZATION { role_name PASSWORD 'password' | DEFAULT } | XML OPTION { DOCUMENT | CONTENT } } ;
  • 远程连接数据库 完成远程连接配置,请联系管理员处理。 在客户端机器上,上传客户端工具包并配置gsql的执行环境变量。 登录客户端机器。 创建“/tmp/tools”目录。 mkdir /tmp/tools 获取软件安装包中的“ GaussDB -Kernel_VxxxRxxxCxx-xxxxx-64bit-gsql.tar.gz”上传到“/tmp/tools”路径下。 软件包相对位置为安装时所放位置,根据实际情况填写。 不同的操作系统,工具包文件名称会有差异。请根据实际的操作系统类型选择对应的工具包。 解压文件。 cd /tmp/tools tar -zxvf GaussDB-Kernel_VxxxRxxxCxx-XXXXX-64bit-gsql.tar.gz 设置环境变量。 打开“~/.bashrc”文件。 vi ~/.bashrc 在其中输入如下内容后,使用“:wq!”命令保存并退出。 export PATH=/tmp/tools/bin:$PATH export LD_LIBRARY_PATH=/tmp/tools/lib:$LD_LIBRARY_PATH 使环境变量配置生效。 source ~/.bashrc 连接数据库。 数据库安装完成后,会默认生成名称为postgres的数据库。 gsql -d postgres -h 10.10.0.11 -U jack -p 8000 Password for user jack: postgres为需要连接的数据库名称,10.10.0.11为CN所在的服务器IP地址,jack为登录数据库的用户名,8000为CN的端口号,上述示例中,连接的服务器的IP和端口也可以替换成DN服务器IP和端口。 上述示例中,jack用户为数据库初始化用户创建的普通用户。 默认禁止使用数据库初始化用户进行远程连接数据库,开启集群内部kerberos认证时,允许初始化用户在集群内部进行远程连接。
  • 开发规范 如果用户在APP的开发中,使用了连接池机制,那么需要遵循如下规范: 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。 否则,连接池里面的连接就是有状态的,会对用户后续使用连接池进行操作的正确性带来影响。 应用程序开发驱动兼容性说明如表1所示: 表1 兼容性说明 驱动 兼容性说明 JDBC、ODBC、libpq、Psycopg 驱动前向兼容数据库,若需使用驱动与数据库同步增加的新特性,须升级数据库。 在多线程环境下使用驱动: JDBC驱动程序不是线程安全的,不保证连接上的方法是同步的。由调用者来同步对驱动程序的调用。 父主题: 应用程序开发教程
  • PGXC_RUNNING_XA CTS PGXC_RUNNING_XACTS视图显示集群中各个节点运行事务的信息,字段内容和PG_RUNNING_XACTS相同。只有system admin和monitor admin用户有权限查看。 表1 PGXC_RUNNING_XACTS字段 名称 类型 描述 handle integer 事务在GTM对应的句柄。 gxid xid 事务id号。 state tinyint 事务状态。 3:prepared。 0:starting。 node text 节点名称。 xmin xid 节点上当前数据涉及的最小事务号xmin。 vacuum boolean 表示当前事务是否是lazy vacuum事务。 t(true):表示是。 f(false):表示否。 timeline bigint 数据库重启次数。 prepare_xid xid 处于prepared状态事务的id号,若不在prepared状态,值为0。 pid bigint 事务对应的线程id。 next_xid xid CN传给DN的事务id号。 父主题: 系统视图
  • 背景信息 GaussDB数据库 支持的分区表为范围分区表。 范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期,例如将销售数据按照月份进行分区。 分区表和普通表相比具有以下优点: 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。 普通表若要转成分区表,需要新建分区表,然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时,请根据业务提前规划是否使用分区表。
  • PG_STAT_SYS_INDEXES PG_STAT_SYS_INDEXES视图显示pg_catalog、information_schema模式中所有系统表的索引状态信息。 表1 PG_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 使用该索引的简单索引扫描在原表中抓取的活表行数。 父主题: 系统视图
  • 示例 支持在PL/SQL的存储过程内使用COMMIT/ROLLBACK。 CREATE TABLE EXAMPLE1(COL1 INT); CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE() AS BEGIN FOR i IN 0..20 LOOP INSERT INTO EXAMPLE1(COL1) VALUES (i); IF i % 2 = 0 THEN COMMIT; ELSE ROLLBACK; END IF; END LOOP; END; / 支持含有EXCEPTION的存储过程使用COMMIT/ROLLBACK。 支持在存储过程的EXCEPTION语句内使用COMMIT/ROLLBACK。 支持DDL在COMMIT/ROLLBACK后的提交/回滚。 CREATE OR REPLACE PROCEDURE TEST_COMMIT_INSERT_EXCEPTION_ROLLBACK() AS BEGIN DROP TABLE IF EXISTS TEST_COMMIT; CREATE TABLE TEST_COMMIT(A INT, B INT); INSERT INTO TEST_COMMIT SELECT 1, 1; COMMIT; CREATE TABLE TEST_ROLLBACK(A INT, B INT); RAISE EXCEPTION 'RAISE EXCEPTION AFTER COMMIT'; EXCEPTION WHEN OTHERS THEN INSERT INTO TEST_COMMIT SELECT 2, 2; ROLLBACK; END; / 支持在事务块里调用含有COMMIT/ROLLBACK的存储过程,即通过/BEGIN/START/END等开启控制的外部事务。 BEGIN; CALL TEST_COMMIT_INSERT_EXCEPTION_ROLLBACK(); END; 支持多数PL/SQL的上下文和语句内调用COMMIT/ROLLBACK,包括常用的IF/FOR/CURSOR LOOP/WHILE。 CREATE OR REPLACE PROCEDURE TEST_COMMIT2() IS BEGIN DROP TABLE IF EXISTS TEST_COMMIT; CREATE TABLE TEST_COMMIT(A INT); FOR I IN REVERSE 3..0 LOOP INSERT INTO TEST_COMMIT SELECT I; COMMIT; END LOOP; FOR I IN REVERSE 2..4 LOOP UPDATE TEST_COMMIT SET A=I; COMMIT; END LOOP; EXCEPTION WHEN OTHERS THEN INSERT INTO TEST_COMMIT SELECT 4; COMMIT; END; / 支持存储过程内GUC参数的回滚提交。 enable_force_vector_engine GUC参数不建议开发者使用。 SHOW explain_perf_mode; SHOW enable_force_vector_engine; CREATE OR REPLACE PROCEDURE GUC_ROLLBACK() AS BEGIN SET enable_force_vector_engine = on; COMMIT; SET explain_perf_mode TO pretty; ROLLBACK; END; / call GUC_ROLLBACK(); SHOW explain_perf_mode; SHOW enable_force_vector_engine; SET enable_force_vector_engine = off;
  • 限制场景 不支持调用的上下文环境: 不支持除PL/SQL的其他存储过程中调用COMMIT/ROLLBACK/SAVEPOINT,例如PLPYTHON等。 不支持事务块中调用了SAVEPOINT后,调用含有COMMIT/ROLLBACK的存储过程。 不支持TRIGGER中调用含有COMMIT/ROLLBACK/SAVEPOINT语句的存储过程。 不支持EXECUTE语句中调用COMMIT/ROLLBACK/SAVEPOINT语句。 不支持在CURSOR语句中打开一个含有COMMIT/ROLLBACK/SAVEPOINT的存储过程。 不支持带有IMMUTABLE以及SHIPPABLE的存储过程调用COMMIT/ROLLBACK/SAVEPOINT,或调用带有COMMIT/ROLLBACK/SAVEPOINT语句的存储过程。 不支持SQL中调用含有COMMIT/ROLLBACK/SAVEPOINT语句的存储过程,除了SELECT PROC以及CALL PROC。 存储过程头带有GUC参数设置的不允许调用COMMIT/ROLLBACK/SAVEPOINT语句。 不支持CURSOR/EXECUTE语句,以及各类表达式内调用COMMIT/ROLLBACK/SAVEPOINT。 不支持存储过程返回值与表达式计算中调用含有COMMIT/ROLLBACK/SAVEPOINT的存储过程。 不支持存储过程中释放存储过程外部定义的保存点。 存储过程事务和其中的自治事务是两个独立的事务,不能互相使用对方事务中定义的保存点 不支持提交回滚的内容: 不支持存储过程内声明变量以及传入变量的提交/回滚。 不支持存储过程内必须重启生效的GUC参数的提交/回滚。 在存储过程使用commit/rollback有以下限制场景: 不允许Trigger的存储过程包含commit/rollback语句,或调用带有commit/rollback语句的存储过程。 CREATE OR REPLACE FUNCTION FUNCTION_TRI_EXAMPLE2() RETURN TRIGGER AS EXP INT; BEGIN FOR i IN 0..20 LOOP INSERT INTO EXAMPLE1(col1) VALUES (i); IF i % 2 = 0 THEN COMMIT; ELSE ROLLBACK; END IF; END LOOP; SELECT COUNT(*) FROM EXAMPLE1 INTO EXP; END; / CREATE TRIGGER TRIGGER_EXAMPLE AFTER DELETE ON EXAMPLE1 FOR EACH ROW EXECUTE PROCEDURE FUNCTION_TRI_EXAMPLE2(); DELETE FROM EXAMPLE1; 不支持带有IMMUTABLE以及SHIPPABLE的存储过程调用commit/rollblack,或调用带有commit/rollback语句的存储过程。 CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE1() IMMUTABLE AS BEGIN FOR i IN 0..20 LOOP INSERT INTO EXAMPLE1 (col1) VALUES (i); IF i % 2 = 0 THEN COMMIT; ELSE ROLLBACK; END IF; END LOOP; END; / 不支持存储过程中任何变量的提交,包括存储过程内声明的变量或者传入的参数。 CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE2(EXP_OUT OUT INT) AS EXP INT; BEGIN EXP_OUT := 0; COMMIT; DBE_OUTPUT.PRINT_LINE('EXP IS:'||EXP); EXP_OUT := 1; ROLLBACK; DBE_OUTPUT.PRINT_LINE('EXP IS:'||EXP); END; / 不支持出现在SQL中的调用(除了Select Procedure)。 CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE3() AS BEGIN FOR i IN 0..20 LOOP INSERT INTO EXAMPLE1 (col1) VALUES (i); IF i % 2 = 0 THEN EXECUTE IMMEDIATE 'COMMIT'; ELSE EXECUTE IMMEDIATE 'ROLLBACK'; END IF; END LOOP; END; / 存储过程头带有GUC参数设置的不允许调用commit/rollback语句。 CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE4() SET ARRAY_NULLS TO "ON" AS BEGIN FOR i IN 0..20 LOOP INSERT INTO EXAMPLE1 (col1) VALUES (i); IF i % 2 = 0 THEN COMMIT; ELSE ROLLBACK; END IF; END LOOP; END; / 游标open的对象不允许为带有commit/rollback语句的存储过程。 CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE5(INTIN IN INT, INTOUT OUT INT) AS BEGIN INTOUT := INTIN + 1; COMMIT; END; / CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE6() AS CURSOR CURSOR1(EXPIN INT) IS SELECT TRANSACTION_EXAMPLE5(EXPIN); INTEXP INT; BEGIN FOR i IN 0..20 LOOP OPEN CURSOR1(i); FETCH CURSOR1 INTO INTEXP; INSERT INTO EXAMPLE1(COL1) VALUES (INTEXP); IF i % 2 = 0 THEN COMMIT; ELSE ROLLBACK; END IF; CLOSE CURSOR1; END LOOP; END; / 不支持CURSOR/EXECUTE语句,以及各类表达式内调用COMMIT/ROLLBACK。 CREATE OR REPLACE PROCEDURE exec_func1() AS BEGIN CREATE TABLE TEST_exec(A INT); COMMIT; END; / CREATE OR REPLACE PROCEDURE exec_func2() AS BEGIN EXECUTE exec_func1(); COMMIT; END; / 不支持存储过程返回值与表达式计算。 CREATE OR REPLACE PROCEDURE exec_func3(RET_NUM OUT INT) AS BEGIN RET_NUM := 1+1; COMMIT; END; / CREATE OR REPLACE PROCEDURE exec_func4(ADD_NUM IN INT) AS SUM_NUM INT; BEGIN SUM_NUM := ADD_NUM + exec_func3(); COMMIT; END; / 不支持存储过程中释放存储过程外部定义的保存点。 CREATE OR REPLACE PROCEDURE STP_SAVEPOINT_EXAMPLE3() AS BEGIN INSERT INTO EXAMPLE1 VALUES(2); RELEASE SAVEPOINT s1; -- 释放存储过程外部定义的保存点 INSERT INTO EXAMPLE1 VALUES(3); END; / BEGIN; INSERT INTO EXAMPLE1 VALUES(1); SAVEPOINT s1; CALL STP_SAVEPOINT_EXAMPLE3(); COMMIT;
  • 配置设置函数 配置设置函数是可以用于查询以及修改运行时配置参数的函数。 current_setting(setting_name) 描述:当前的设置值。 返回值类型:text 备注:current_setting用于以查询形式获取setting_name的当前值。和SQL语句SHOW是等效的。比如: 1 2 3 4 5 6 openGauss=# SELECT current_setting('datestyle'); current_setting ----------------- ISO, MDY (1 row) set_working_grand_version_num_manually(tmp_version) 描述:通过切换授权版本号来更新和升级高斯数据库的新特性。 返回值类型:void shell_in(type) 描述:为shell类型输入路由(那些尚未填充的类型)。 返回值类型:void shell_out(type) 描述:为shell类型输出路由(那些尚未填充的类型)。 返回值类型:void set_config(setting_name, new_value, is_local) 描述:设置参数并返回新值。 返回值类型:text 备注:set_config将参数setting_name设置为new_value,如果is_local为true,则新值将只应用于当前事务。如果希望new_value应用于当前会话,可以使用false,和SQL语句SET是等效的。 示例: 1 2 3 4 5 6 openGauss=# SELECT set_config('log_statement_stats', 'off', false); set_config ------------ off (1 row) 父主题: 系统管理函数
  • 现象描述 某局点测试中:ddw_f10_op_cust_asset_mon为分区表,分区键为year_mth,此字段是由年月两个值拼接而成的字符串。 测试SQL如下: 1 2 3 4 select count(1) from t_ddw_f10_op_cust_asset_mon b1 where b1.year_mth between to_char(add_months(to_date(''20170222'','yyyymmdd'), -11),'yyyymm') and substr(''20170222'',1 ,6 ); 测试结果显示此SQL的表Scan耗时长达135s。初步猜测可能是性能瓶颈点。 add_months为本地适配函数: 1 2 3 4 5 6 7 8 9 10 11 12 CREATE OR REPLACE FUNCTION ADD_MONTHS(date, integer) RETURNS date AS $$ SELECT CASE WHEN (EXTRACT(day FROM $1) = EXTRACT(day FROM (date_trunc('month', $1) + INTERVAL '1 month - 1 day'))) THEN date_trunc('month', $1) + CAST($2 + 1 || ' month - 1 day' as interval) ELSE $1 + CAST($2 || ' month' as interval) END $$ LANGUAGE SQL IMMUTABLE;
  • GS_AUDITING GS_AUDITING视图显示对数据库相关操作的所有审计信息。需要有系统管理员或安全策略管理员权限才可以访问此视图。 表1 GS_AUDITING字段 名称 类型 描述 polname name 策略名称,需要唯一,不可重复。 pol_type text 审计策略类型,值为‘access’或者‘privilege’。 access:表示审计DML操作。 privilege:表示审计DDL操作。 polenabled boolean 用来表示策略启动开关。 t(true):表示启动。 f(false):表示不启动。 access_type name DML数据库操作相关类型。例如SELECT、INSERT、DELETE等。 label_name name 资源标签名称。对应系统表gs_auditing_policy中的polname字段。 priv_object text 用来描述数据库资产的路径。 filter_name text 过滤条件的逻辑字符串。 父主题: 系统视图
  • javax.naming.Context javax.naming.Context是连接配置的上下文接口。 表1 对javax.naming.Context的支持情况 方法名 返回值类型 支持JDBC 4 bind(Name name, Object obj) void Yes bind(String name, Object obj) void Yes lookup(Name name) Object Yes lookup(String name) Object Yes rebind(Name name, Object obj) void Yes rebind(String name, Object obj) void Yes rename(Name oldName, Name newName) void Yes rename(String oldName, String newName) void Yes unbind(Name name) void Yes unbind(String name) void Yes 父主题: JDBC接口参考
  • PG_STATIO_SYS_TABLES PG_STATIO_SYS_TABLES视图显示命名空间中所有系统表的I/O状态信息。 表1 PG_STATIO_SYS_TABLES字段 名称 类型 描述 relid oid 表OID。 schemaname name 该表的模式名。 relname name 表名。 heap_blks_read bigint 从该表中读取的磁盘块数。 heap_blks_hit bigint 该表命中缓存数。 idx_blks_read bigint 从表中所有索引读取的磁盘块数。 idx_blks_hit bigint 表中所有索引命中缓存数。 toast_blks_read bigint 从该表的TOAST表读取的磁盘块数(如果存在)。 toast_blks_hit bigint 该表的TOAST表命中缓存数(如果存在)。 tidx_blks_read bigint 从该表的TOAST表索引读取的磁盘块数(如果存在)。 tidx_blks_hit bigint 该表的TOAST表索引命中缓存数(如果存在)。 父主题: 系统视图
  • Hint的错误、冲突及告警 Plan Hint的结果会体现在计划的变化上,可以通过explain来查看变化。 Hint中的错误不会影响语句的执行,只是不能生效,该错误会根据语句类型以不同方式提示用户。对于explain语句,hint的错误会以warning形式显示在界面上,对于非explain语句,会以debug1级别日志显示在日志中,关键字为PLANHINT。 hint的错误分为以下类型: 语法错误 语法规则树归约失败,会报错,指出出错的位置。 例如:hint关键字错误,leading hint或join hint指定2个表以下,其它hint未指定表等。一旦发现语法错误,则立即终止hint的解析,所以此时只有错误前面的解析完的hint有效。 例如: 1 leading((t1 t2)) nestloop(t1) rows(t1 t2 #10) nestloop(t1)存在语法错误,则终止解析,可用hint只有之前解析的leading((t1 t2))。 语义错误 表不存在,存在多个,或在leading或join中出现多次,均会报语义错误。 scanhint中的index不存在,会报语义错误。 另外,如果子查询提升后,同一层出现多个名称相同的表,且其中某个表需要被hint,hint会存在歧义,无法使用,需要为相同表增加别名规避。 hint重复或冲突 如果存在hint重复或冲突,只有第一个hint生效,其它hint均会失效,会给出提示。 hint重复是指,hint的方法及表名均相同。例如:nestloop(t1 t2) nestloop(t1 t2)。 hint冲突是指,table list一样的hint,存在不一样的hint,hint的冲突仅对于每一类hint方法检测冲突。 例如:nestloop (t1 t2) hashjoin (t1 t2),则后面与前面冲突,此时hashjoin的hint失效。注意:nestloop(t1 t2)和no mergejoin(t1 t2)不冲突。 leading hint中的多个表会进行拆解。例如:leading ((t1 t2 t3))会拆解成:leading((t1 t2)) leading(((t1 t2) t3)),此时如果存在leading((t2 t1)),则两者冲突,后面的会被丢弃。(例外:指定内外表的hint若与不指定内外表的hint重复,则始终丢弃不指定内外表的hint。) 子链接提升后hint失效 子链接提升后的hint失效,会给出提示。通常出现在子链接中存在多个表连接的场景。提升后,子链接中的多个表不再作为一个整体出现在join中。 列类型不支持重分布 对于skew hint来说,目的是为了进行重分布时的调优,所以当hint列的类型不支持重分布时,hint将无效。 hint未被使用 非等值join使用hashjoin hint或mergejoin hint 不包含索引的表使用indexscan hint或indexonlyscan hint 通常只有在索引列上使用过滤条件才会生成相应的索引路径,全表扫描将不会使用索引,因此使用indexscan hint或indexonlyscan hint将不会使用 indexonlyscan只有输出列仅包含索引列才会使用,否则指定时hint不会被使用 多个表存在等值连接时,仅尝试有等值连接条件的表的连接,此时没有关联条件的表之间的路径将不会生成,所以指定相应的leading,join,rows hint将不使用,例如:t1 t2 t3表join,t1和t2, t2和t3有等值连接条件,则t1和t3不会优先连接,leading(t1 t3)不会被使用。 生成stream计划时,如果表的分布列与join列相同,则不会生成redistribute的计划;如果不同,且另一表分布列与join列相同,只能生成redistribute的计划,不会生成broadcast的计划,指定相应的hint则不会被使用。 如果子链接未被提升,则blockname hint不会被使用。 对于skew hint,hint未被使用可能由于: 计划中不需要进行重分布。 hint指定的列为包含分布键。 hint指定倾斜信息有误或不完整,如对于join优化未指定值。 倾斜优化的GUC参数处于关闭状态。 父主题: 使用Plan Hint进行调优
  • 优化建议 create index 建议仅在匹配如下条件之一时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 约束限制: 普通表的索引支持最大列数为32列;分区表的GLOBAL索引支持最大列数为31列。 单个索引大小不能超过索引页面大小(8k),其中B-tree、UBtree不能超过页面大小的三分之一。 分区表上不支持创建部分索引。 在分区表上创建唯一索引时,索引项中必须包含分布列。索引项不包含分区键只能创建全局分区索引。
  • 语法格式 在表上创建索引。 1 2 3 4 5 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [schemaname.]index_name ] ON table_name [ USING method ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ]; 在分区表上创建索引。 1 2 3 4 5 6 CREATE [ UNIQUE ] INDEX [ [schemaname.]index_name ] ON table_name [ USING method ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ LOCAL [ ( { PARTITION index_partition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] | GLOBAL ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ];
  • 功能描述 在指定的表上创建索引。 索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如当索引带GLOBAL/LOCAL关键字或者创建索引为GLOBAL索引时不支持创建部分索引。
共100000条
提示

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