华为云用户手册

  • 调用存储过程 GaussDB(DWS)支持通过JDBC直接调用事先创建的存储过程,步骤如下: 调用Connection的prepareCall方法创建调用语句对象。 1 CallableStatement cstmt = myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}"); 调用CallableStatement的setInt方法设置参数。 1 2 3 cstmt.setInt(2, 50); cstmt.setInt(1, 20); cstmt.setInt(3, 90); 调用CallableStatement的registerOutParameter方法注册输出参数。 1 cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。 调用CallableStatement的execute执行方法调用。 1 cstmt.execute(); 调用CallableStatement的getInt方法获取输出参数。 1 int out = cstmt.getInt(4); //获取out参数 示例: 1 2 3 4 5 6 7 8 9 10 11 12 //在数据库中已创建了如下存储过程,它带有out参数。 create or replace procedure testproc ( psv_in1 in integer, psv_in2 in integer, psv_inout in out integer ) as begin psv_inout := psv_in1 + psv_in2 + psv_inout; end; / 调用CallableStatement的close方法关闭调用语句。 1 cstmt.close(); 很多的数据库例如Connection、Statement和ResultSet都有close()方法,在使用完对象后应把它们关闭。要注意的是,Connection的关闭将间接关闭所有与它关联的Statement,Statement的关闭间接关闭了ResultSet。 一些JDBC驱动程序还提供命名参数的方法来设置参数。命名参数的方法允许根据名称而不是顺序来设置参数,若参数有默认值,则可以不用指定参数值就可以使用此参数的默认值。即使存储过程中参数的顺序发生了变更,也不必修改应用程序。目前GaussDB(DWS)数据库的JDBC驱动程序不支持此方法。 GaussDB(DWS)数据库不支持带有输出参数的函数,也不支持存储过程和函数参数默认值。 当游标作为存储过程的返回值时,如果使用JDBC调用该存储过程,返回的游标将不可用。 存储过程不能和普通SQL在同一条语句中执行。
  • 执行批处理 用一条预处理语句处理多条相似的数据,数据库只创建一次执行计划,节省了语句的编译和优化时间。可以按如下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 PreparedStatement pstmt = con.prepareStatement("INSERT INTO customer_t1 VALUES (?)"); 针对每条数据都要调用setShort设置参数,以及调用addBatch确认该条设置完毕。 1 2 pstmt.setShort(1, (short)2); pstmt.addBatch(); 调用PreparedStatement的executeBatch方法执行批处理。 1 int[] rowcount = pstmt.executeBatch(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close(); 在实际的批处理过程中,通常不终止批处理程序的执行,否则会降低数据库的性能。因此在批处理程序时,应该关闭自动提交功能,每几行提交一次。关闭自动提交功能的语句为:conn.setAutoCommit(false);
  • 执行预编译SQL语句 预编译语句是只编译和优化一次,然后可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预编译语句。可以按以下步骤执行: 调用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); 调用PreparedStatement的executeUpdate方法执行预编译SQL语句。 1 int rowcount = pstmt.executeUpdate(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close();
  • 执行普通SQL语句 应用程序通过执行SQL语句来操作数据库的数据(不用传递参数的语句),需要按以下步骤执行: 调用Connection的createStatement方法创建语句对象。 1 Statement stmt = con.createStatement(); 调用Statement的executeUpdate方法执行SQL语句。 1 int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"); 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,事务块中不支持vacuum操作。如果其中有一个语句失败,那么整个请求都将会被回滚。 关闭语句对象。 1 stmt.close();
  • job_queue_processes 参数说明:表示系统可以并发执行的job数目。 参数类型:POSTMASTER 取值范围:0~1000 功能: 当job_queue_processes设置为0值,表示不启用定时任务功能,任何job都不会被执行(因为开启定时任务的功能会对系统的性能有影响,有些局点可能不需要定时任务的功能,可以通过设置为0不启用定时任务功能)。 当job_queue_processes为大于0时,表示启用定时任务功能且系统能够并发处理的最大任务数。 启用定时任务功能后,job_scheduler线程会在定时时间间隔轮询pg_jobs系统表,系统设置定时任务检查周期默认为1s。 由于并行运行的任务数太多会消耗更多的系统资源,因此需要设置系统并发处理的任务数,当前并发的任务数达到job_queue_processes时,且此时又有任务到期,那么这些任务本次得不到执行而延期到下一轮询周期。因此,建议用户需要根据每个任务的执行时长合理的设置任务的时间间隔(即submit接口中的interval参数),来避免由于任务执行时间太长而导致下个轮询周期无法正常执行。 注:如果同一时间内并行的job数很多,过小的参数值会导致job等待。而过大的参数值则消耗更多的系统资源,建议设置此参数为100,用户可以根据系统资源情况合理调整。 默认值:10
  • max_cache_partition_num 参数说明:设置扩容重分布过程中列存节省内存模式的分区数目。如果超过分区数据目,则最早缓存的分区将直接写入列存文件中。 参数类型:SIGHUP 取值范围:整型,最小值为0,最大值为32767。 0表示关闭列存节省内存模式。 1~32767表示存分区表最多缓存的分区数目。 默认值:0 该参数用于扩容重分布,合理设置可以缓解列存分区表重分布过程中的内存消耗。但某些分区数据分布非常不均衡的表在重分布完成后,可能会产生较多小CU。如果出现较多小CU,需要通过VACUUM FULL来合并小CU。
  • remote_read_mode 参数说明:设置当开启enable_crc_check为on,主DN读取的数据校验失败后是否进行远程读的开关,以及是否采用安全认证方式连接。设置后需要重启集群才能生效。 参数类型:POSTMASTER 取值范围:off,non_authentication,authentication off,表示关闭远程读功能。 non_authentication,表示采用非认证的方式连接备DN并获取数据。 authentication,表示采用认证方式连接备DN并获取数据,重启集群前在$GAUSSHOME/share/sslcert/grpc/目录下必须存在证书,否则无法启动集群。 默认值:non_authentication
  • view_independent 参数说明:用于设置是否开启视图与表、函数、同义词的解耦功能。基表恢复后目前已支持自动关联重建。 参数类型:SIGHUP 取值范围:布尔型 on表示启用视图解耦功能,存在视图依赖的表、函数、同义词及其他视图可以单独删除(临时表及临时视图除外),关联视图保留但不可用。 off表示关闭视图解耦功能,存在视图依赖的表、函数、同义词及其他视图不可以单独删除,仅可使用cascade级联删除。 默认值: off
  • default_distribution_mode 参数说明:用于设置表的默认分布方式。该参数仅8.1.2及以上版本支持。 参数类型:USERSET 取值范围:枚举类型 roundrobin,创建表不指定分布方式时,按如下规则选取默认分布方式: 若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。 若建表时不包含主键/唯一约束,则选取ROUNDROBIN分布。 hash,创建表不指定分布方式时,按如下规则选取默认分布方式: 若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。 若建表时不包含主键/唯一约束,但存在数据类型支持作分布列的列,则选取HASH分布,分布列为第一个数据类型支持作分布列的列。 若建表时不包含主键/唯一约束,也不存在数据类型支持作分布列的列,选取ROUNDROBIN分布。 默认值:roundrobin 新建8.1.2集群版本默认值为roundrobin,升级到8.1.2集群版本场景该参数的默认值为hash。
  • enable_upgrade_merge_lock_mode 参数说明:当该参数设置为on时,通过提升deltamerge内部实现的锁级别,避免和update/delete并发操作时的报错。 参数类型:USERSET 取值范围: 布尔型 on,提升deltamerge内部实现的锁级别,并发执行deltamerge和update/delete操作时,一个操作先执行,另一个操作被阻塞,在前一个操作完成后,后一个操作再执行。 off,在对HDFS表的delta table的同一行并发执行deltamerge和update/delete操作时,后一个对同一行数据更新的操作会报错退出。 默认值:off
  • enable_prevent_job_task_startup 参数说明:设置用于阻止job线程的启动。该参数属于系统内部参数,不建议用户修改设置。 参数类型:SIGHUP 取值范围:布尔型 on表示阻止启动job线程。当job周期到来时,不会启动job执行线程。 off表示允许启动job线程。当job周期到来时,会启动job执行线程,完成job中规定的操作。 默认值: off 该参数只需在CN上设置。
  • object_mtime_record_mode 参数说明:用于设置PG_OBJECT系统表中mtime字段的更新行为。 参数类型:SIGHUP 取值范围:字符串 default,表示默认行为包括ALTER、COMMENT、GRANT/REVOKE和TRUNCATE操作会更新mtime字段。 none,表示不更新mtime字段。 disable_acl,表示GRANT/REVOKE操作不更新mtime字段。 disable_truncate,表示TRUNCATE操作不更新mtime字段。 disable_partition,表示分区表相关ALTER操作不更新mtime字段。 默认值:default
  • enable_hadoop_env 参数说明:设置使用Hadoop特性时,是否允许在数据库中创建本地行存表和列存表。GaussDB(DWS)集群中,集群安装好后,该参数默认设为off。以支持本地行列存储和跨集群访问Hadoop特性。不推荐用户调整enable_hadoop_env的值。 参数类型:USERSET 取值范围: 布尔型 on/true,表示使用Hadoop特性时,不允许在数据库中创建本地行存表和列存表。 off/false,表示使用Hadoop特性时,可以在数据库中创建本地行存表和列存表。 默认值:off
  • 表自动分析 GaussDB(DWS)提供了三种场景下表的自动分析。 当查询中存在“统计信息完全缺失”或“修改量达到analyze阈值”的表,且执行计划不采取FQS (Fast Query Shipping)执行时,则通过GUC参数autoanalyze控制此场景下表统计信息的自动收集。此时,查询语句会等待统计信息收集成功后,生成更优的执行计划,再执行原查询语句。 当autovacuum设置为on时,系统会定时启动autovacuum线程,对“修改量达到analyze阈值”的表在后台自动进行统计信息收集。 表1 表自动分析 触发方式 触发条件 触发频率 控制参数 备注 同步 统计信息完全缺失 查询时 autoanalyze, autoanalyze_mode truncate主表时会清空统计信息。 同步 数据修改量达到analyze阈值 查询时 autoanalyze, autoanalyze_mode 先触发analyze,后选择最优计划。 异步 数据修改量达到analyze阈值 autovacuum线程轮询检查 autovacuum_mode, autovacuum_naptime 2s等锁超时, 5min执行超时。 autoanalyze只支持内存方式计算统计信息,不支持临时采样表方式计算统计信息。 多列统计信息仅支持临时采样表方式计算统计信息,因此autoanalyze不收集多列统计信息。 查询过程因表的“统计信息完全缺失”和“修改量达到analyze阈值”而自动触发autoanalyze的场景,当前不支持对外表触发autoanalyze,不支持对带有ON COMMIT [DELETE ROWS | DROP]选项的临时表触发autoanalyze。 修改量达到analyze阈值是指:表的修改量超过autovacuum_analyze_threshold + autovacuum_analyze_scale_factor * reltuples,其中reltuples是pg_class中记录的表的估算行数。 基于定时启动的autovacuum线程触发的autoanalyze,仅支持行存表和列存表,不支持外表、HDFS表、OBS外表、临时表、unlogged表和toast表。 查询时触发analyze会对分区表的所有分区加四级锁,直到查询所在事务提交后才会放锁。四级锁不堵塞增删改查,但会堵塞分区的修改操作,比如分区的truncate,可以通过将object_mtime_record_mode设置为disable_partition,实现提前释放分区锁。 autovacuum自动清理功能的生效还依赖于下面两个GUC参数: track_counts参数需要设置为on,开启收集收据库统计数据功能。 autovacuum_max_workers参数需要大于0,该参数表示能同时运行的自动清理线程的最大数量。 GaussDB(DWS)支持轻量化的autoanalyze,可通过autoanalyze_mode参数来设置。 表2 两种autoanalyze的对比 类型 统计信息存储位置 统计信息是否持久化 加锁级别 是否向其它CN同步 是否影响autovacuum触发的analyze 普通autoanalyze 系统表 是 四级锁 是 完成后,autovacuum不再触发analyze 轻量化autoanalyze 内存 否 一级锁 否 完成后,autovacuum依然可以触发analyze 普通autoanalyze统计信息要存系统表,因此需要加四级锁,防止系统表的并发更新。触发普通autoanalyze的查询会从一级锁升四级锁,堵塞其它四级锁以上的操作。 轻量化autoanalyze对普通autoanalyze做了极简的设计: 统计信息仅写入内存,不写入系统表。 执行时只加一级锁。 统计信息不向其它CN同步。 查询触发的轻量化autoanalyze可以快速生成统计信息,并在一个CN内供多个查询共享使用。需要开启autovacuum后台触发的analyze,由其重新生成统计信息,实现统计信息的持久化和同步,并清理内存中的统计信息。
  • 示例:从MySQL向GaussDB(DWS)进行数据迁移 下面示例演示如何通过CopyManager从mysql向GaussDB(DWS)进行数据迁移的过程。 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 //以下用例以gsjdbc4.jar为例,如果要使用gsjdbc200.jar,请替换驱动类名(将代码中的“org.postgresql”替换成“com.huawei.gauss200.jdbc”)与连接URL串前缀(将“jdbc:postgresql”替换为“jdbc:gaussdb”)。 import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Migration{ public static void main(String[] args) { String url = new String("jdbc:postgresql://10.180.155.74:8000/gaussdb"); //数据库URL String user = new String("jack"); //mppdb用户名 String pass = new String("********"); //mppdb密码 String tablename = new String("migration_table"); //定义表信息 String delimiter = new String("|"); //定义分隔符 String encoding = new String("UTF8"); //定义字符集 String driver = "org.postgresql.Driver"; StringBuffer buffer = new StringBuffer(); //定义存放格式 化数据的缓存 try { //获取源数据库查询结果集 ResultSet rs = getDataSet(); //遍历结果集,逐行获取记录 //将每条记录中各字段值,按指定分隔符分割,由换行符结束,拼成一个字符串 //把拼成的字符串,添加到缓存buffer while (rs.next()) { buffer.append(rs.getString(1) + delimiter + rs.getString(2) + delimiter + rs.getString(3) + delimiter + rs.getString(4) + "\n"); } rs.close(); try { //建立目标数据库连接 Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, pass); BaseConnection baseConn = (BaseConnection) conn; baseConn.setAutoCommit(false); //初始化表信息 String sql = "Copy " + tablename + " from STDIN DELIMITER " + "'" + delimiter + "'" + " ENCODING " + "'" + encoding + "'"; //提交缓存buffer中的数据 CopyManager cp = new CopyManager(baseConn); StringReader reader = new StringReader(buffer.toString()); cp.copyIn(sql, reader); baseConn.commit(); reader.close(); baseConn.close(); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } } catch (Exception e) { e.printStackTrace(); } } //******************************** // 从源数据库返回查询结果集 //********************************* private static ResultSet getDataSet() { ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn = DriverManager.getConnection("jdbc:mysql://10.119.179.227:3306/jack?useSSL=false&allowPublicKeyRetrieval=true", "jack", "********"); Statement stmt = conn.createStatement(); rs = stmt.executeQuery("select * from migration_table"); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return rs; } } 父主题: 基于JDBC开发
  • PG_AMOP PG_AMOP系统表存储和访问方法操作符族关联的信息。如果一个操作符是一个操作符族中的成员,则在这个表中会占据一行。一个族成员是一个search操作符或一个ordering操作符。一个操作符可以在多个族中出现,但是不能在一个族中的多个搜索位置或多个排序位置中出现。 表1 PG_AMOP字段 名字 类型 引用 描述 oid oid - 行标识符(隐藏属性,必须明确选择才会显示)。 amopfamily oid PG_OPFAMILY.oid 该项的操作符族。 amoplefttype oid PG_TYPE.oid 操作符的左输入类型。 amoprighttype oid PG_TYPE.oid 操作符的右输入类型。 amopstrategy smallint - 操作符策略数。 amoppurpose "char" - 操作符目的,s为搜索或o为排序。 amopopr oid PG_OPERATOR.oid 该操作符的OID。 amopmethod oid PG_AM.oid 使用此操作符族的索引访问方法。 amopsortfamily oid PG_OPFAMILY.oid 如果是一个排序操作符,则该项会按照btree操作符族排序;如果是一个搜索操作符,则为0。 search操作符表明这个操作符族的一个索引可以被搜索,找到所有满足WHERE indexed_column operator constant的行。显然,这样的操作符必须返回布尔值,并且它的左输入类型必须匹配索引的字段数据类型。 ordering操作符表明这个操作符族的一个索引可以被扫描,返回以ORDER BY indexed_column operator constant顺序表示的行。这样的操作符可以返回任意可排序的数据类型,它的左输入类型也必须匹配索引的字段数据类型。ORDER BY的确切语义是由amopsortfamily字段指定的,该字段必须为操作符的返回类型引用一个btree操作符族。 父主题: 系统表
  • 索引类型 btree:B-tree索引使用一种类似于B+树的结构来存储数据的键值,通过这种结构能够快速的查找索引。btree适合支持比较查询以及查询范围。 gin:GIN索引是倒排索引,可以处理包含多个键的值(比如数组)。 gist:Gist索引适用于几何和地理等多维数据类型和集合数据类型。 Psort:Psort索引。针对列存表进行局部排序索引。 行存表支持的索引类型:btree(行存表缺省值)、gin、gist。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。 对于点查询场景,推荐建立btree索引。
  • 索引的选择原则 索引建立在数据库表中的某些列上。因此,在创建索引时,应该仔细考虑在哪些列上创建索引。 在经常需要搜索查询的列上创建索引,可以加快搜索的速度。 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。 在经常使用连接的列上创建索引,这些列主要是一些外键,可以加快连接的速度。 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。 在经常使用WHERE子句的列上创建索引,加快条件的判断速度。 为经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段建立索引。 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引
  • 定时任务管理 创建测试表: 1 CREATE TABLE test(id int, time date); 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLE 创建自定义存储过程: 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE PROCEDURE PRC_JOB_1() AS N_NUM integer :=1; BEGIN FOR I IN 1..1000 LOOP INSERT INTO test VALUES(I,SYSDATE); END LOOP; END; / 当结果显示为如下信息,则表示创建成功。 1 CREATE PROCEDURE 创建任务: 新创建的任务(未指定job_id)表示每隔1分钟执行一次存储过程PRC_JOB_1。 1 2 3 4 5 call dbms_job.submit('call public.prc_job_1(); ', sysdate, 'interval ''1 minute''', :a); job ----- 1 (1 row) 指定job_id创建任务。 1 2 3 4 5 call dbms_job.isubmit(2,'call public.prc_job_1(); ', sysdate, 'interval ''1 minute'''); isubmit --------- (1 row) 通过USER_JOBS视图查看当前用户已创建的任务信息。 需要有系统管理员权限才可以访问此系统视图,字段说明详见表1。 1 2 3 4 5 6 7 8 9 10 select job,dbname,start_date,last_date,this_date,next_date,broken,status,interval,failures,what from user_jobs; job | dbname | start_date | last_date | this_date | next_date | broken | status | interval | failures | what -----+----------+----------------------------+----------------------------+----------------------------+---------------------+--------+--------+---------------------+----------+---------------- ----------- 1 | db_demo | 2022-03-25 07:58:01.829436 | 2022-03-25 07:58:03.174817 | 2022-03-25 07:58:01.829436 | 2022-03-25 07:59:01 | n | s | interval '1 minute' | 0 | call public.prc _job_1(); 2 | db_demo | 2022-03-25 07:58:15.893383 | 2022-03-25 07:58:16.608959 | 2022-03-25 07:58:15.893383 | 2022-03-25 07:59:15 | n | s | interval '1 minute' | 0 | call public.prc _job_1(); (2 rows) 停止任务。 1 2 3 4 5 call dbms_job.broken(1,true); broken -------- (1 row) 启动任务。 1 2 3 4 5 call dbms_job.broken(1,false); broken -------- (1 row) 修改任务属性。 修改JOB的Next_date参数信息。例如,修改Job1的Next_date为1小时以后开始执行。 1 2 3 4 5 call dbms_job.next_date(1, sysdate+1.0/24); next_date ----------- (1 row) 修改JOB的Interval参数信息。例如,修改Job1的Interval为每隔1小时执行一次。 1 2 3 4 5 call dbms_job.interval(1,'sysdate + 1.0/24'); interval ---------- (1 row) 修改JOB的What参数信息。例如,修改Job1的What为执行SQL语句“insert into public.test values(333, sysdate+5);”。 1 2 3 4 5 call dbms_job.what(1,'insert into public.test values(333, sysdate+5);'); what ------ (1 row) 同时修改JOB的Next_date、Interval、What等多个参数信息。 1 2 3 4 5 call dbms_job.change(1, 'call public.prc_job_1();', sysdate, 'interval ''1 minute'''); change -------- (1 row) 删除JOB。 1 2 3 4 5 call dbms_job.remove(1); remove -------- (1 row) JOB的权限控制。 当创建一个JOB时,该JOB会和创建该JOB的数据库和用户绑定(即:pg_job系统视图新增的JOB记录中的dbname和log_user)。 如果当前用户是DBA用户、系统管理员、该JOB的创建用户(即:pg_job中的log_user),那么该用户有权限通过高级包接口remove、change、next_data、what、interval删除或修改JOB的参数信息。否则,会提示当前用户没有权限操作该JOB。 如果当前数据库是该JOB创建所属的数据库(即:为pg_job系统视图中的dbname),那么连接到当前数据库上可以通过高级包接口remove、change、next_data、what、interval删除或修改JOB的参数信息。 当删除JOB所属的数据库(即:为pg_job系统视图中的dbname)时,系统会关联删除该数据库从属的JOB记录。 当删除JOB所属的用户(即:为pg_job系统视图中的log_user)时,系统会关联删除该用户从属的JOB记录。
  • 操作步骤 设置参数,以设置explain_perf_mode参数为例。 查看explain_perf_mode参数。 1 2 3 4 5 SHOW explain_perf_mode; explain_perf_mode ------------------- normal (1 row) 设置explain_perf_mode参数。 使用以下任意方式进行设置: 设置数据库级别的参数 1 ALTER DATABASE gaussdb SET explain_perf_mode TO pretty; 当结果显示为如下信息,则表示设置成功。 ALTER DATABASE 在下次会话中生效。 设置用户级别的参数 1 ALTER USER dbadmin SET explain_perf_mode TO pretty; 当结果显示为如下信息,则表示设置成功。 ALTER USER 在下次会话中生效。 设置会话级别的参数 1 SET explain_perf_mode TO pretty; 当结果显示为如下信息,则表示设置成功。 SET 检查参数设置的正确性。 1 2 3 4 5 SHOW explain_perf_mode; explain_perf_mode -------------- pretty (1 row)
  • GUC参数设置 GUC参数设置有两种方式: 方式一:集群创建成功后,用户可以登录GaussDB(DWS) 管理控制台,根据实际需要修改集群的数据库参数。 具体操作请参见《管理指南》中的“修改数据库参数”章节。 方式二:成功连接集群后,通过SQL命令的方式设置SUSET或USERSET类型的参数。 修改指定数据库,用户,会话级别的参数。 设置数据库级别的参数 1 ALTER DATABASE dbname SET paraname TO value; 在下次会话中生效。 设置用户级别的参数 1 ALTER USER username SET paraname TO value; 在下次会话中生效。 设置会话级别的参数 1 SET paraname TO value; 修改本次会话中的取值。退出会话后,设置将失效。
  • 参数类型和值 GaussDB(DWS)的GUC参数类型分为以下五类: SUSET,数据库管理员参数。设置后立即生效,无需重启集群。若在当前会话中设置该类型参数仅当前会话生效。 USERSET,普通用户参数。设置后立即生效,无需重启集群。若在当前会话中设置该类型参数仅当前会话生效。 POSTMASTER,数据库服务端参数。设置后需要重启集群才能生效,确认修改后系统会提示集群状态为待重启,建议在非业务高峰期手动重启集群,使参数生效。 SIGHUP,数据库全局参数。设置后全局生效,无法会话级生效。 BACKEND,数据库全局参数。设置后全局生效,无法会话级生效。 所有的参数名称不区分大小写。 参数取值有整型、浮点型、字符串、布尔型和枚举型五类。 布尔值可以是(on,off)、(true,false)、(yes,no)或者(1,0),且不区分大小写。 枚举类型的取值由系统表pg_settings的enumvals字段取值所定义。 对于有单位的参数,在设置时请指定单位,否则将使用默认的单位。 参数的默认单位由系统表pg_settings的unit字段所定义。 内存单位有:KB(千字节)、MB(兆字节)和GB(吉字节)。 时间单位:ms(毫秒)、s(秒)、min(分钟)、h(小时)和d(天)。
  • 通用哈希函数 digest() digest()函数可以根据不同的算法生成数据的二进制哈希值,语法如下: digest(data text, type text) returns bytea digest(data bytea, type text) returns bytea 其中,data是原始数据,type是加密算法包括md5、sha1、sha224、sha256、sha384、sha512和sm3;函数的返回结果为二进制字符串。 示例: 使用digest() 函数对字符串GaussDB(DWS)进行sha256加密存储: select digest('GaussDB(DWS)', 'sha256'); digest -------------------------------------------------------------------- \xcc2d1b97c6adfba44bbce7386516f63f16fc6e6a10bd938861d3aba501ac8aab (1 row)
  • 随机数据函数 gen_random_bytes()函数用于生成具有强加密性的随机字节。 gen_random_bytes(count integer) returns bytea 其中,count表示返回的字节数,取值为1到1024。 示例: SELECT gen_random_bytes(16); gen_random_bytes ------------------------------------ \x1f1eddc11153afdde0f9e1229f8f4caf (1 row) gen_random_uuid()函数用于返回一个version 4的随机UUID。 SELECT gen_random_uuid(); gen_random_uuid -------------------------------------- 2bd664a2-b760-4859-8af6-8d09ccc5b830
  • 密码哈希函数 crypt()和gen_salt()函数专用于哈希密码。crypt()执行哈希用于加密数据,gen_salt()用于生成加盐哈希。 crypt()中的算法和普通的MD5或者SHA1哈希算法存在以下不同之处: crypt()中算法很慢。由于密码包含的数据量很小,这是增加暴力破解难度的唯一方法。 它们使用一个随机值(称为salt,即盐值),因此这样具有相同口令的用户将得到不同的密文口令。这也是针对破解算法提供一种额外的安全保护。 它们的结果中包括了算法类型,因此可以针对不同用户使用不同的算法对密码进行加密。 其中一些算法具有自适应性,意味着当计算机性能变得更快时,可以调整该算法使其变得更慢,而不会产生与已有密码的不兼容性。 crypt()函数所支持的算法如下表: 表1 crypt()支持的算法 算法 密码最大长度 自适应性 Salt位数 输出结果长度 描述 bf 72 √ 128 60 基于Blowfish的2a变种算法 md5 unlimited × 48 34 基于MD5的加密算法 xdes 8 √ 24 20 扩展DES des 8 × 12 13 原生UNIX加密算法
  • 原始加密函数 原始加密函数仅仅会对数据运行一次加密,不支持PGP加密的任何高级功能,因此存在以下问题: 直接将用户密钥作为加密密钥。 不提供任何完整性检查来校验加密后的数据是否被修改。 需要用户自己关联所有加密参数,包括初始值(IV)。 不支持处理文本数据。 因此,在引入了PGP加密后,不建议使用这些原始加密函数。 encrypt(data bytea, key bytea, type text) returns bytea decrypt(data bytea, key bytea, type text) returns bytea encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea 其中,data是需要加密的数据;type用于指定加密/解密方法。type参数的语法如下: algorithm [ - mode ] [ /pad: padding ]
  • PG_AMPROC PG_AMPROC系统表存储与访问方法操作符族相关联的支持过程的信息。每个属于某个操作符族的支持过程都占有一行。 表1 PG_AMPROC字段 名字 类型 引用 描述 oid oid - 行标识符(隐藏属性,必须明确选择才会显示) amprocfamily oid PG_OPFAMILY.oid 该项的操作符族 amproclefttype oid PG_TYPE.oid 相关操作符的左输入数据类型 amprocrighttype oid PG_TYPE.oid 相关操作符的右输入数据类型 amprocnum smallint - 支持过程编号 amproc regproc PG_PROC.oid 过程的OID amproclefttype和amprocrighttype字段的习惯解释,标识一个特定支持过程所支持的操作符的左右输入类型。对于某些访问方式,匹配支持过程本身的输入数据类型,对其他的则不会匹配。有一个对索引的“缺省”支持过程的概念,amproclefttype和amprocrighttype都等于索引操作符类的opcintype。 父主题: 系统表
  • PG_STAT_GET_MEM_MBYTES_RESERVED PG_STAT_GET_MEM_MBYTES_RESERVED视图显示线程在内存中保存的当前活动信息。该函数在调用时需要指定线程ID,线程ID的选取请参考PG_STAT_ACTIVITY中的pid,线程ID为0时表示选取当前线程ID,例如: 1 SELECT pg_stat_get_mem_mbytes_reserved(0); 表1 PG_STAT_GET_MEM_MBYTES_RESERVED信息 名称 描述 ConnectInfo 连接信息 ParctlManager 并发管理信息 GeneralParams 基本参数信息 GeneralParams RPDATA 基本资源池信息 ExceptionManager 异常管理信息 CollectInfo 收集信息 GeneralInfo 基本信息 ParctlState 并发状态信息 CPU INFO CPU信息 ControlGroup 控制组信息 IOSTATE IO状态信息 父主题: 系统视图
  • 接口介绍 高级功能包DBMS_RANDOM支持的所有接口请参见表1。 表1 DBMS_RANDOM接口参数说明 接口名称 描述 DBMS_RANDOM.SEED 设置一个随机数的种子。 DBMS_RANDOM.VALUE 生成一个大小介于指定的low及high之间的随机数。 DBMS_RANDOM.SEED 存储过程SEED用于设置一个随机数的种子。DBMS_RANDOM.SEED函数原型为: 1 DBMS_RANDOM.SEED (seed IN INTEGER); 表2 DBMS_RANDOM.SEED接口参数说明 参数 描述 seed 用于产生一个随机数的种子。 DBMS_RANDOM.VALUE 存储过程VALUE生成一个大小介于指定的low及high之间的随机数。DBMS_RANDOM.VALUE函数原型为: 1 2 3 4 DBMS_RANDOM.VALUE( low IN NUMBER, high IN NUMBER) RETURN NUMBER; 表3 DBMS_RANDOM.VALUE接口参数说明 参数 描述 low 指定随机数大小的下边界,生成的随机数大于或等于low。 high 指定随机数大小的上边界,生成的随机数小于high。 实际上,只要求这里的参数类型是NUMERIC即可,对于左右边界的大小并没有要求。
  • temp_file_limit 参数说明:语句执行过程中触发落盘操作时,限制语句中单个线程落盘文件的总空间大小。例如,排序和哈希表使用的临时文件或者游标占用的临时文件。 此设置为会话级别的落盘文件控制。 参数类型:SUSET 取值范围:整型,-1~INT_MAX,单位为KB。其中-1表示没有限制。 默认值:配置temp_file_limit为实例所在磁盘空间总容量的10%。 SQL查询执行时使用的临时表空间不在此限制。
共100000条