华为云用户手册

  • constraint_exclusion 参数说明:控制查询优化器使用表约束查询的优化。 该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 取值范围:枚举类型 on表示检查所有表的约束。 off表示不检查约束。 partition表示只检查继承的子表和UNION ALL子查询。 当constraint_exclusion为on,优化器用查询条件和表的CHECK约束比较,并且在查询条件和约束冲突的时候忽略对表的扫描。 默认值:partition 目前, constraint_exclusion缺省被打开,通常用来实现表分区。为所有的表打开它时,对于简单的查询强加了额外的规划,并且对简单查询没有什么好处。如果不用分区表,可以关掉它。
  • cursor_tuple_fraction 参数说明:优化器估计游标获取行数在总行数中的占比。 该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 取值范围:浮点型,0.0~1.0。 比默认值小的值与使用 “fast start” 为游标规划的值相偏离,从而使得前几行恢复的很快而抓取全部的行需要很长的时间。比默认值大的值加大了总的估计的时间。在最大的值1.0处,像正常的查询一样规划游标,只考虑总的估计时间和传送第一行的时间。 默认值:0.1
  • enable_opfusion 参数说明:控制是否对简单增删改查进行优化。 该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 简单查询限制如下: 只支持indexscan和indexonlyscan,且全部WHERE语句的过滤条件都在索引上。 只支持单表增删改查,不支持join、using。 只支持行存表,不支持分区表,表不支持有触发器。 不支持active sql、QPS等信息统计特性。 不支持正在扩容和缩容的表。 不支持查询或者修改系统列。 只支持简单SELECT语句,例如: SELECT c3 FROM t1 WHERE c1 = ? and c2 =10; 仅可以查询目标表的列,c1和c2列为索引列,后边可以是常量或者参数,可以使用 for update。 只支持简单INSERT语句,例如: INSERT INTO t1 VALUES (?,10,?); 仅支持一个VALUES,VALUES里面的类型可以是常量和参数,不支持returning。 只支持简单DELETE语句,例如: DELETE FROM t1 WHERE c1 = ? and c2 = 10; c1和c2列为索引列,后边可以是常量或者参数。 只支持简单UPDATE语句,例如: UPDATE t1 SET c3 = c3+? WHERE c1 = ? and c2 = 10; c3列修改的值可以是常量和参数,也可以是一个简单的表达式,c1和c2列为索引列,后边可以是常量或者参数。 取值范围:布尔型 on表示使用。 off表示不使用。 默认值:on
  • enable_plsql_opfusion 参数说明:如果开启该参数,可以对存储过程中的简单增删改查语句进行优化,提升SQL执行性能。 简单增删改查语句的限制请参见enable_opfusion中相关说明。 仅在enable_opfusion参数打开的状态下生效。 参数类型:布尔型 参数单位:无 取值范围: on表示使用。 off表示不使用。 默认值:on 设置方式:该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 设置建议:设置为默认值,不做调整。
  • analysis_options 参数说明:通过开启对应选项中所对应的功能选项使用相应的定位功能,包括数据校验、性能统计等,参见取值范围中的选项说明。 该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 取值范围:字符串 LLVM_COMPILE表示在explain performance显示界面中显示每个线程的codegen编译时间。 HASH_CONFLICT表示在数据库节点进程的gs_log目录中的log日志中显示hash表的统计信息,包括hash表大小、hash链长、hash冲突情况。 STREAM_DATA_CHECK表示对网络传输前后的数据进行CRC校验。 默认值:ALL,on(),off(LLVM_COMPILE,HASH_CONFLICT,STREAM_DATA_CHECK),不开启任何定位功能。
  • cost_param 参数说明:该参数用于控制在特定的客户场景中,使用不同的估算方法使得估算值与真实值更接近。此参数可以同时控制多种方法,与某一方法对应的位做与操作,不为0表示该方法被选择。 当cost_param & 1 不为0,表示对于求不等值连接选择率时选择一种改良机制,此方法在自连接(两个相同的表之间连接)的估算中更加准确。目前,已弃用cost_param & 1 不为0时的路径,默认选择更优的估算公式; 当cost_param & 2 不为0,表示求多个过滤条件(Filter)的选择率时,选择最小的作为总的选择率,而非两者乘积,此方法在过滤条件的列之间关联性较强时估算更加准确; 该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 取值范围:整型,0~INT_MAX 默认值:0
  • 示例 --创建源表及触发表。 gaussdb=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); gaussdb=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); INSERT触发器的使用。 --创建insert触发器函数。 gaussdb=# 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; --创建INSERT触发器。 gaussdb=# CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func(); --执行INSERT触发事件并检查触发结果。 gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) 匿名块和OR REPLACE语法创建触发器。 --使用匿名块语法创建INSERT触发器。 gaussdb=# CREATE TRIGGER insert_trigger_with_anonyblock BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END; / --使用OR REPLACE语法创建INSERT触发器。 gaussdb=# CREATE OR REPLACE TRIGGER insert_trigger_with_anonyblock BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END; / --删除触发器。 gaussdb=# DROP TRIGGER insert_trigger_with_anonyblock ON test_trigger_src_tbl; -- 会将隐式创建的函数insert_trigger_with_anonyblock一起删除 UPDATE触发器的使用。 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 --创建UPDATE触发器函数。 gaussdb=# 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; --创建UPDATE触发器。 gaussdb=# CREATE TRIGGER update_trigger AFTER UPDATE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_update_func(); --执行UPDATE触发事件并检查触发结果。 gaussdb=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) DELETE触发器的使用。 --创建DELETE触发器函数。 gaussdb=# 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; --创建DELETE触发器。 gaussdb=# CREATE TRIGGER delete_trigger BEFORE DELETE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_delete_func(); --执行DELETE触发事件并检查触发结果。 gaussdb=# DELETE FROM test_trigger_src_tbl WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- (0 rows) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- (0 rows) 修改触发器名称。 1 2 --修改触发器的名称。 gaussdb=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; 禁用触发器。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 --禁用insert_trigger触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //可以看到触发器没有生效。 id1 | id2 | id3 -----+-----+----- (0 rows) --禁用当前表上所有触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; 删除触发器。 1 2 3 4 5 gaussdb=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER update_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl; 删除函数。 1 2 3 4 5 gaussdb=# DROP FUNCTION tri_insert_func; gaussdb=# DROP FUNCTION tri_update_func; gaussdb=# DROP FUNCTION tri_delete_func; 1 2 3 --删除源表及触发表。 gaussdb=# DROP TABLE test_trigger_src_tbl; gaussdb=# DROP TABLE test_trigger_des_tbl;
  • var_eq_const_selectivity 参数说明:整型const选择率是否使用新型选择率模型进行估算。 该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 取值范围:布尔型 on表示使用新型选择率模型计算整型const的选择率: 若整型不落入MCV且不为NULL值,但落入直方图,则利用直方图左右边界情况进行估算;不落入直方图,则使用表的行数进行估算。 若整型为NULL值或者MCV值,使用原逻辑计算选择率。 off表示使用原有的选择率计算模型。 默认值:off
  • cost_model_version 参数说明:此参数用来指定优化器代价模型的版本。可以视作一个保护参数,用来禁用最新的优化器代价模型,保持和旧版本计划一致。改变此参数,可能会导致很多SQL计划的改变。因此修改前请谨慎评估。 参数类型:整型 参数单位:无 取值范围:0、1、2、3、4 0:表示使用最新的cost估算模型。当前版本等价于4。 1:表示使用原始的cost估算模型。 2:表示在1的基础上,使用增强的coalesce表达式估算、hash join代价估算、semi/anti join代价估算。 3:表示在2的基础上,使用边界矫正估计器估算NDV, indexscan的hint可以作用于indexonlyscan。 4:表示在3的基础上,使用分区级统计信息参与代价估算。 默认值:0 设置方式:该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。 设置建议:数据库升级时,建议和升级前版本保持一致;新安装环境时,建议设置为默认值。
  • 注意事项 当前仅支持在普通行存表上创建触发器,不支持在临时表、unlogged表等类型表上创建触发器。 如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。 触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。 执行触发器语句时是用触发器创建者的身份进行权限判断的。 执行创建触发器操作的用户需要拥有指定表的TRIGGER权限或被授予了CREATE ANY TRIGGER权限。 BEFORE触发的行级触发器函数可以返回一个NULL值,表示忽略对该行的操作,随后的触发器将不再执行,并且不会对该行产生INSERT/UPDATE/DELETE动作。AFTER触发器函数返回值无影响。 DELETE的BEFORE触发器的情况下,触发器函数返回值NEW等于NULL;INSERT的BEFORE触发器的情况下,触发器函数返回值OLD等于NULL;UPDATE的BEFORE触发器的情况下,触发器函数返回值只有显示为NULL才是NULL值。 对于event为INSERT/UPDATE的触发器函数,正常返回值是NEW。如果返回一个非NULL的行,将修改那个插入或者更新的行。对于event为DELETE的触发器函数,正常返回值是OLD。 INSTEAD OF触发器只能作用于视图,其触发器函数同样可以返回NULL值,表示随后的触发器将不再执行。
  • 语法格式 CREATE [OR REPLACE] [ 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 ) | AnonyBlock ]; 其中event包含以下几种: 1 INSERT 1 UPDATE [ OF column_name [, ... ] ] 1 DELETE 1 TRUNCATE
  • 参数说明 OR REPLACE 可选项,指定此参数将在TRIGGER已存在的前提下修改已有的TRIGGER。 无法通过OR REPLACE语法创建或修改CONSTRAINT TRIGGER和INTERNAL TRIGGER。CONSTRAINT TRIGGER是指通过CREATE CONSTRAINT TRIGGER创建的TRIGGER,CONSTRAINT TRIGGER是指某些SQL语句隐式创建的TRIGGER(如给表加上外键约束会隐式创建4个TRIGGER,这4个TRIGGER即为INTERNAL TRIGGER)。 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,则触发器不会排队等待延迟执行。 ANONYBLOCK A数据库风格的匿名块,其中的语句在触发器触发时执行。使用匿名块语法创建trigger时会创建一个与trigger同名的函数,需要注意不能和现有函数名冲突。 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为空,并且对于statement级别的触发器此变量也为空。 OLD UPDATE及DELETE操作涉及tuple信息中的旧值,对INSERT为空,并且对于statement级别的触发器此变量也为空。 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选择其一。 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class SSL{ public static void main(String[] args) { Properties urlProps = new Properties(); String urls = "jdbc:gaussdb://$ip:$port/postgres"; String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); /** * ================== 示例1 使用NonValidatingFactory通道 */ urlProps.setProperty("sslfactory","com.huawei.gaussdb.jdbc.ssl.NonValidatingFactory"); urlProps.setProperty("user", userName); urlProps.setProperty("password", password); urlProps.setProperty("ssl", "true"); /** * ================== 示例2 使用证书 */ urlProps.setProperty("sslcert", "client.crt"); urlProps.setProperty("sslkey", "client.key.pk8"); urlProps.setProperty("sslrootcert", "cacert.pem"); urlProps.setProperty("user", userName); urlProps.setProperty("password", password); urlProps.setProperty("ssl", "true"); /* sslmode可配置为:require、verify-ca、verify-full,以下三个示例选择其一*/ /* ================== 示例2.1 设置sslmode为require,使用证书 */ urlProps.setProperty("sslmode", "require"); /* ================== 示例2.2 设置sslmode为verify-ca,使用证书 */ urlProps.setProperty("sslmode", "verify-ca"); /* ================== 示例2.3 设置sslmode为verify-full,使用证书(Linux下验证) */ urls = "jdbc:gaussdb://world:8000/postgres"; urlProps.setProperty("sslmode", "verify-full"); try { Class.forName("com.huawei.gaussdb.jdbc.Driver").newInstance(); } catch (Exception e) { e.printStackTrace(); } try { Connection conn; conn = DriverManager.getConnection(urls,urlProps); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 注:将客户端密钥转化为DER格式: * openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-MD5-DES * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-SHA1-3DES * 以上算法由于安全级别较低,不推荐使用。 * 如果客户需要采用更高级别的私钥加密算法,启用bouncycastle或者其他第三方私钥解密密码包后可以使用的私钥加密算法如下: * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 AES128 * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 aes-256-cbc -iter 1000000 * openssl pkcs8 -in client.key -topk8 -out client.key.der -outform Der -v2 aes-256-cbc -v2prf hmacWithSHA512 * 启用bouncycastle:使用jdbc的项目引入依赖:bcpkix-jdk15on.jar包,版本建议:1.65以上。 */ JDBC使用SSL方式建立连接时,会在客户端获取强随机数,建立连接过程中可能出现下图中的报错信息。 原因在于客户端环境随机数产生的速度太慢,无法满足产品要求,熵源不足,导致服务启动失败。当前已知在一些Linux环境中存在此问题。 建议处理方案:启动客户端环境中的haveged服务,增加系统熵池熵值以提高读取随机数的速度。启动命令为: systemctl start haveged
  • PG_AUTH_MEMBERS PG_AUTH_MEMBERS系统表存储显示角色之间的成员关系。 表1 PG_AUTH_MEMBERS字段 名称 类型 描述 roleid oid 拥有成员的角色ID。 member oid 属于ROLEID角色的一个成员的角色ID。 grantor oid 赋予此成员关系的角色ID。 admin_option boolean 如果MEMBER可以把ROLEID角色的成员关系赋予其他角色则为真,不可以则为假。 父主题: 连接和认证
  • 使用分区表 分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点: 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。 GaussDB支持的分区表为一级分区表和二级分区表,其中一级分区表包括范围分区表、间隔分区表、列表分区表、哈希分区表四种,二级分区表包括范围分区、列表分区、哈希分区两两组合的九种。 范围分区表:将数据基于范围映射到每一个分区。这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。 间隔分区表:是一种特殊的范围分区表,相比范围分区表,新增间隔值定义,当插入记录找不到匹配的分区时,可以根据间隔值自动创建分区。 列表分区表:将数据中包含的键值分别存储在不同的分区中,依次将数据映射到每一个分区,分区中包含的键值由创建分区表时指定。 哈希分区表:将数据根据内部哈希算法依次映射到每一个分区中,包含的分区个数由创建分区表时指定。 二级分区表:由范围分区、列表分区、哈希分区任意组合得到的分区表,其一级分区和二级分区均可以使用前面三种定义方式。 父主题: 审视和修改表定义
  • 示例 --创建用户webuser。 gaussdb=# CREATE USER webuser PASSWORD '********'; --授予用户webuser对模式tpcds下视图的所有操作权限。 gaussdb=# DO $$DECLARE r record; BEGIN FOR r IN SELECT c.relname table_name,n.nspname table_schema FROM pg_class c,pg_namespace n WHERE c.relnamespace = n.oid AND n.nspname = 'tpcds' AND relkind IN ('r','v') LOOP EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser'; END LOOP; END$$; --删除用户webuser。 gaussdb=# DROP USER webuser CASCADE;
  • 事务管理 在ecpg缺省模式下,语句只有在EXEC SQL COMMIT发出的时候才被提交,嵌入的SQL接口也支持事务的自动提交(通过EXEC SQL SET AUTOCOMMIT TO ON语句设置自动提交)。在自动提交模式下,每条命令都是自动提交的,除非它们包围在一个明确的事务块里。自动提交模式可以用EXEC SQL SET AUTOCOMMIT TO OFF语句关闭。 常见事务管理命令如下: EXEC SQL COMMIT:提交正在进行的事务。 EXEC SQL ROLLBACK:回滚正在进行的事务。 EXEC SQL SET AUTOCOMMIT TO ON:启动自动提交模式。 EXEC SQL SET AUTOCOMMIT TO OFF:关闭自动提交模式,缺省模式。 父主题: 执行SQL命令
  • MY_SCHEDULER_JOB_ARGS MY_SCHEDULER_JOB_ARG视图显示当前用户拥有的任务的有关参数信息。该视图所有用户可访问,仅可查看当前用户所属信息。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 MY_SCHEDULER_JOB_ARGS字段 名称 类型 描述 job_name character varying(128) 参数所属作业名。 argument_name character varying(128) 参数名称。 argument_position numeric 参数在参数列表中的位置。 argument_type character varying(257) 参数的数据类型,可以是用户的自定义数据类型。 value character varying(4000) 参数值。 anydata_value character varying(4000) 暂不支持,值为NULL。 out_argument character varying(5) 保留字段,值为NULL。 父主题: 其他系统视图
  • DBE_PLDEVELOPER.gs_source 用于记录PL/SQL对象(存储过程、函数、包、包体)编译相关信息,如表1所示。 打开plsql_show_all_error参数后,会把成功或失败的PL/SQL对象编译信息记录在此表中,如果关闭plsql_show_all_error参数则只会将正确的编译相关信息插入此表中。 gs_source表中只记录用户定义的原始对象语句,即使用户使用了ALTER改变了创建的SCHEMA或者名字,gs_source表中的信息也不会发生变化,如果用户更改了对象的SCHEMA或者名字,会导致用户在删除对象后,对象仍存在于gs_source表中。 gs_source表中的owner指创建的用户,不是用户创建存储过程或者package时指定的用户。 数据库默认情况下没有对gs_source表中设置行级访问控制,如果用户想使用数据库隔离性特性,请参考以下语句,自行添加行级访问控制。 ALTER TABLE dbe_pldeveloper.gs_source ENABLE ROW LEVEL SECURITY; CREATE ROW LEVEL SECURITY POLICY all_data_rls ON dbe_pldeveloper.gs_source USING(owner = (select oid from pg_roles where rolname=current_user)); 表1 DBE_PLDEVELOPER.gs_source字段 名称 类型 描述 id oid 对象id。 owner bigint 对象创建用户id。 nspid oid 对象的模式id。 name name 对象名。 type text 对象类型(procedure/function/package/package body)。 status boolean 是否创建成功。 src text 对象创建的原始语句。 父主题: DBE_PLDEVELOPER
  • 创建数据库用户 默认只有数据库安装时创建的管理员用户可以访问初始数据库,您还可以创建其他数据库用户账号。 1 gaussdb=# CREATE USER joe WITH PASSWORD "********"; 当结果显示为如下信息,则表示创建成功。 1 CREATE ROLE 如上创建了一个用户名为joe,密码为********的用户。 执行如下命令设置joe用户为系统管理员。 gaussdb=# GRANT ALL PRIVILEGES TO joe; 使用GRANT命令进行相关权限设置,具体操作请参见GRANT。 关于数据库用户的更多信息请参见用户及权限。 父主题: 操作数据库
  • ADM_SYS_PRIVS ADM_SYS_PRIVS视图显示授予用户和角色的系统权限信息。默认只有系统管理员权限才可以访问此系统视图,普通用户需要授权才可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 ADM_SYS_PRIVS字段 名称 类型 描述 grantee character varying(128) 被授予权限的用户或角色的名称。 privilege character varying(40) 用户拥有的系统权限或ANY权限。 系统权限包括rolsuper、rolinherit、rolcreaterole、rolcreatedb、rolcatupdate、rolcanlogin、rolreplication、rolauditadmin、rolsystemadmin、roluseft、rolmonitoradmin、roloperatoradmin、rolpolicyadmin。 ANY权限的取值请参考表1。 admin_option character varying(3) 该授权是否包含ADMIN选项。 YES:包含ADMIN选项。 NO:不包含ADMIN选项。 common character varying(3) 暂不支持,值为NULL。 inherited character varying(3) 暂不支持,值为NULL。 父主题: 用户和权限管理
  • MY_DEPENDENCIES MY_DEPENDENCIES显示用户拥有对象对其他对象的依赖关系。所有用户都可以访问,该视图同时存在于PG_CATALOG和SYS Schema下。 表1 MY_DEPENDENCIES字段 名称 类型 描述 name name 对象的名称。 type character varying(18) 对象类型。 referenced_owner name 被引用对象的所有者。 referenced_name name 被引用对象的名称。 referenced_type character varying(18) 被引用对象的类型。 referenced_link_name character varying(128) 指向父对象的链接的名称(如果是远程)。 dependency_type character varying(4) 指示依赖关系是否为REF依赖关系,默认取值为HARD,表示硬引用。 父主题: 其他系统视图
  • 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。 DEPENDENCY_EXTENSION (e):依赖对象是被依赖对象extension的一个成员(请参见PG_EXTENSION)。依赖对象只可以通过在被依赖对象上DROP EXTENSION删除。函数上这个依赖类型和内部依赖一样动作,但是它为了清晰和简化gs_dump保持分开。 扩展功能为内部使用功能,不建议用户使用。 DEPENDENCY_PIN (p):没有依赖对象,这种类型的记录标志着系统本身依赖于被引用对象,因此这个对象绝不能被删除。这种类型的记录只有在initdb的时候创建。有依赖对象的字段里是零。 父主题: 其他系统表
  • 数据库执行语句函数 与数据库服务器的连接成功建立,便可以使用这里描述的函数执行SQL查询和命令。 PQclear PQexec PQexecParams PQexecParamsBatch PQexecPrepared PQexecPreparedBatch PQfname PQgetvalue PQnfields PQntuples PQprepare PQresultStatus PQfnumberEx 父主题: libpq接口参考
  • Schema GaussDB的Schema如表1所示。 数据库禁止在提供功能接口的Schema下创建用户的业务数据,包括但不限于表、函数等(dbe_*, pkg_*)。 表1 GaussDB支持的Schema Schema名称 描述 blockchain 用于存储账本数据库特性中创建防篡改表时自动创建的用户历史表。 db4ai 用于管理AI训练中不同版本的数据信息。 dbe_perf DBE_PERF Schema内视图主要用来诊断性能问题,也是WDR Snapshot的数据来源。数据库安装后,默认只有初始用户和监控管理员具有模式dbe_perf的权限,有权查看该模式下的视图和函数。 dbe_pldebugger 用于调试PL/SQL函数及存储过程。 snapshot 用于管理WDR snapshot的相关的数据信息,默认初始化用户或监控管理员用户可以访问。 sqladvisor 用于分布列推荐,集中式不可用。 sys 用于提供系统信息视图接口。 pg_catalog 用于维护系统的catalog信息,包含系统表和所有内置数据类型、函数、操作符。 pg_toast 用于存储大对象(系统内部使用)。 public 公共模式,用于存储公共对象。search_path参数缺省时,如果存在用户同名的模式则将创建的表(以及其他对象)默认创建到同名模式下,不存在用户同名模式则自动放入public模式。 pkg_service 用于管理package服务相关信息。 pkg_util 用于管理package工具相关信息。 dbe_raw 高级功能包dbe_raw,用于raw类型数据的转化、取子串、求长度等操作。 dbe_session 高级功能包dbe_session,用于设置指定属性的值(value),并支持用户查询校验。 dbe_lob 高级功能包dbe_lob,用于大文件(clob/blob)的读取、写入、复制等操作。 dbe_match 高级功能包dbe_match,用于字符串相似度的比较。 dbe_task 高级功能包dbe_task,用于作业任务的调度包括提交任务、取消任务、同步任务状态、更新任务信息等可以使数据库定期执行特定的任务。 dbe_sql 高级功能包dbe_sql,用于执行动态sql,可以在应用的运行时间构建查询和其他命令。 dbe_file 高级功能包dbe_file,用于数据库外部文件的读取、复制、写入、删除、重命名等。 dbe_output 高级功能包dbe_output,用于打印输出信息。 dbe_random 高级功能包dbe_random,用于生成随机种子和随机数。 dbe_application_info 高级功能包dbe_application_info,用于记录客户端信息。 dbe_utility 高级功能包dbe_utility,用于存储过程中调用调试工具,例如打印错误堆栈等。 dbe_scheduler 高级功能包dbe_scheduler,用于创建定时任务,通过程序(program)、调度(schedule)使数据库定期执行特定的任务。也可以通过授权、提供证书执行数据库外部任务。 information_schema 用于存储有关当前数据库中定义的对象的信息。 dbe_pldeveloper 用户存储过程编译调试。 dbe_xmlgen 高级功能包dbe_xmlgen,用于将查询结果转换成xml字符串。 dbe_stats 高级功能包dbe_stats,用于管理统计信息。 dbe_describe 高级功能包dbe_describe,用于查询存储过程或函数的参数信息。 dbe_sql_util SQL运维功能,目前包含SQL Patch和Plan Management的运维接口。 Information Schema DBE_PERF Schema WDR Snapshot Schema DBE_PLDEBUGGER Schema DB4AI Schema DBE_PLDEVELOPER DBE_SQL_UTIL Schema
  • ADM_AUDIT_OBJECT ADM_AUDIT_OBJECT显示数据库中所有对象的审计跟踪记录, 该视图同时存在于pg_catalog和sys schema下。默认只有系统管理员权限才可以访问,普通用户需要授权才可以访问。 表1 ADM_AUDIT_OBJECT字段 名称 类型 描述 os_username character varying(255) 暂不支持,值为NULL。 username character varying(128) 操作被审计的用户的名称,不是用户ID。 userhost character varying(128) 暂不支持,值为NULL。 terminal character varying(255) 暂不支持,值为NULL。 timestamp timestamp(0) without time zone 在本地数据库会话时区中创建审计跟踪条目的日期和时间(审计会话创建的条目的用户登录日期和时间)。 owner character varying(128) 受操作影响的对象的创建者。 obj_name character varying(128) 受操作影响的对象的名称。 action_name character varying(28) DBA_AUDIT_TRAIL中的“操作”列中的数字代码对应的动作类型名称。 说明: GaussDB的action_name字段与A数据库审计动作不一致。 new_owner character varying(128) 暂不支持,值为NULL。 new_name character varying(128) 暂不支持,值为NULL。 ses_actions character varying(19) 暂不支持,值为NULL。 comment_text character varying(4000) 暂不支持,值为NULL。 sessionid numeric 暂不支持,值为NULL。 entryid numeric 暂不支持,值为NULL。 statementid numeric 暂不支持,值为NULL。 returncode numeric 暂不支持,值为NULL。 priv_used character varying(40) 暂不支持,值为NULL。 client_id character varying(128) 暂不支持,值为NULL。 econtext_id character varying(64) 暂不支持,值为NULL。 session_cpu numeric 暂不支持,值为NULL。 extended_timestamp timestamp(6) with time zone 在UTC(协调世界时)时区创建审计跟踪条目的时间戳(审计会话创建的条目的用户登录时间戳)。 proxy_sessionid numeric 暂不支持,值为NULL。 global_uid character varying(32) 暂不支持,值为NULL。 instance_number numeric 暂不支持,值为NULL。 os_process character varying(16) 暂不支持,值为NULL。 transactionid text 访问或修改对象事务的事务标识符。 说明: GaussDB的transactionid字段与A数据库中transactionid数据的类型保持一致。 scn numeric 暂不支持,值为NULL。 sql_bind nvarchar2(2000) 暂不支持,值为NULL。 sql_text character varying 查询的SQL文本。 说明: GaussDB的sql_text字段为解析后的SQL描述语句,不完全与执行的SQL语句相同。 obj_edition_name character varying(128) 暂不支持,值为NULL。 父主题: 审计
  • ADM_SCHEDULER_PROGRAMS ADM_SCHEDULER_PROGRAMS视图显示数据库中所有可以调度的程序信息。默认只有系统管理员权限才可以访问,普通用户需要授权才可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 ADM_SCHEDULER_PROGRAMS字段 名称 类型 描述 owner name 调度程序的所有者。 program_name text 调度程序的名称。 program_type character varying(16) 调度程序的类型,可用类型为: PLSQL_BLOCK:匿名存储过程块。 STORED_PROCEDURE:保存的存储过程。 EXTERNAL_SCRIPT:外部脚本。 program_action text 调度程序执行的操作。 number_of_arguments numeric 调度程序参数个数。 enabled character varying(5) 调度程序是否启用。 comments text 调度程序的备注。 detached character varying(5) 暂不支持,值为NULL。 schedule_limit interval day to second(0) 暂不支持,值为NULL。 priority numeric 暂不支持,值为NULL。 weight numeric 暂不支持,值为NULL。 max_runs numeric 暂不支持,值为NULL。 max_failures numeric 暂不支持,值为NULL。 max_run_duration interval day to second(0) 暂不支持,值为NULL。 has_constraints character varying(5) 暂不支持,值为NULL。 nls_env character varying(4000) 暂不支持,值为NULL。 父主题: 其他系统视图
  • 执行批处理 用一条预处理语句处理多条相似的数据,数据库只创建一次执行计划,节省了语句的编译和优化时间。可以按如下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("url",userName,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);
  • Oracle兼容模式启用重载时,调用存储过程 打开参数behavior_compat_options='proc_outparam_override'后,JDBC调用事先创建的存储过程,步骤如下: 调用Connection的prepareCall方法创建调用语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("url",userName,password); CallableStatement cs = conn.prepareCall("{ CALL TEST_PROC(?,?,?) }"); 调用CallableStatement的setInt方法设置参数。 1 2 3 4 PGobject pGobject = new PGobject(); pGobject.setType("public.compfoo"); // 设置复合类型名,格式为“schema.typename”。 pGobject.setValue("(1,demo)"); // 绑定复合类型值,格式为“(value1,value2)”。 cs.setObject(1, pGobject); 调用CallableStatement的registerOutParameter方法注册输出参数。 1 2 3 4 // 注册out类型的参数,类型为复合类型,格式为“schema.typename”。 cs.registerOutParameter(2, Types.STRUCT, "public.compfoo"); // 注册out类型的参数,类型为Table类型,格式为“schema.typename”。 cs.registerOutParameter(3, Types.ARRAY, "public.compfoo_table"); 调用CallableStatement的execute方法调用。 1 cs.execute(); 调用CallableStatement的getObject方法获取输出参数。 1 2 3 4 5 6 7 8 9 10 11 12 // 返回结构是自定义类型。 PGobject result = (PGobject)cs.getObject(2); // 获取out参数。 result.getValue(); // 获取复合类型字符串形式值。 result.getArrayValue(); //获取复合类型数组形式值,以复合数据类型字段顺序排序。 result.getStruct(); //获取复合类型子类型名,按创建顺序排序。 result.getAttributes(); //返回自定义类型每列组成类型的对象,对于array类型和table类型返回的是PgArray,对于自定义类型,封装的是PGobject,对于其他类型数据存储方式为字符串类型。 // 返回结果是Table类型。 PgArray pgArray = (PgArray) cs.getObject(3); ResultSet rs = pgArray.getResultSet(); while (rs.next()) { rs.getObject(2);// table类型每行的数据构建成的对象。 } 如果出参的table类型组成为自定义类型,例如create type compfooTable is table of compfoo,此时接收到的返回对象为PgArray,在通过rs.getObject(2)遍历获取到的组成对象也为PgArray,此时无法获取到组成它的compfoo类型对应的每列数据,需要通过getPGobject()获取到PgObject再操作获取。 调用CallableStatement的close方法关闭调用语句。 1 cs.close(); oracle兼容模式开启参数后,调用存储过程必须使用{call proc_name(?,?,?)}形式调用,调用函数必须使用{? = call func_name(?,?)}形式调用(等号左侧的“?”为函数返回值的占位符,用于注册函数返回值)。 参数behavior_compat_options='proc_outparam_override行为变更后,业务需要重新建立连接,否则无法正确调用存储过程和函数。 函数和存储过程中包含复合类型时,参数的绑定与注册需要使用schema.typename形式。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // 在数据库创建复合数据类型。 CREATE TYPE compfoo AS (f1 int, f3 text); // 在数据库中创建table类型。 create type compfoo_table is table of compfoo; // 在数据库中已创建了如下存储过程,它带有out参数。 create or replace procedure test_proc ( psv_in in compfoo, psv_out out compfoo, table_out out compfoo_table ) as begin psv_out := psv_in; table_out:=compfoo_table(); table_out.extend(2); table_out(1):=psv_out; table_out(2):=psv_out; end; /
  • 执行预编译SQL语句 预编译语句是只编译和优化一次,可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预编译语句。可以按以下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 PreparedStatement pstmt = con.prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1"); 调用PreparedStatement的setShort设置参数。 1 pstmt.setShort(1, (short)2); PrepareStatement设置绑定参数后,最终会构建成一个B报文或U报文,在下一步执行SQL语句时发给服务端。但是B报文或U报文有最大长度限制(不能超过1023MB),如果一次绑定数据过大,可能因报文过长导致异常。因此PrepareStatement设置绑定参数时需要注意评估和控制绑定数据的大小,避免出现超出报文上限要求的现象。 调用PreparedStatement的executeUpdate方法执行预编译SQL语句。 1 int rowcount = pstmt.executeUpdate(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close();
共100000条