华为云用户手册

  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 --创建dev_audit和bob_audit用户。 postgres=# CREATE USER dev_audit PASSWORD 'dev@1234'; postgres=# CREATE USER bob_audit password 'bob@1234'; --创建一个表tb_for_audit postgres=# CREATE TABLE tb_for_audit(col1 text, col2 text, col3 text); --创建资源标签 postgres=# CREATE RESOURCE LABEL adt_lb0 add TABLE(tb_for_audit); --对数据库执行create操作创建审计策略 postgres=# CREATE AUDIT POLICY adt1 PRIVILEGES CREATE; --对数据库执行select操作创建审计策略 postgres=# CREATE AUDIT POLICY adt2 AC CES S SELECT; --仅审计记录用户dev_audit和bob_audit在执行针对adt_lb0资源进行的create操作数据库创建审计策略 postgres=# CREATE AUDIT POLICY adt3 PRIVILEGES CREATE ON LABEL(adt_lb0) FILTER ON ROLES(dev_audit, bob_audit); --仅审计记录用户dev_audit和bob_audit,客户端工具为psql和gsql,IP地址为'10.20.30.40', '127.0.0.0/24',在执行针对adt_lb0资源进行的select、insert、delete操作数据库创建审计策略。 postgres=# CREATE AUDIT POLICY adt4 ACCESS SELECT ON LABEL(adt_lb0), INSERT ON LABEL(adt_lb0), DELETE FILTER ON ROLES(dev_audit, bob_audit), APP(psql, gsql), IP('10.20.30.40', '127.0.0.0/24');
  • 参数说明 policy_name 审计策略名称,需要唯一,不可重复; 取值范围:字符串,要符合标识符的命名规范。 DDL 指的是针对数据库执行如下操作时进行审计,目前支持:CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、SET、SHOW、 LOG IN_ANY、LOGIN_FAILURE、LOGIN_SUCCESS、LOGOUT。 ALL 指的是上述DDL支持的所有对数据库的操作。 resource_label_name 资源标签名称。 DML 指的是针对数据库执行如下操作时进行审计,目前支持:SELECT、COPY、DEALLOCATE、DELETE、EXECUTE、INSERT、PREPARE、REINDEX、TRUNCATE、UPDATE。 FILTER_TYPE 描述策略过滤的条件类型,包括IP | APP | ROLES。 filter_value 指具体过滤信息内容。 ENABLE|DISABLE 可以打开或关闭统一审计策略。若不指定ENABLE|DISABLE,语句默认为ENABLE。
  • 语法格式 CREATE AUDIT POLICY [ IF NOT EXISTS ] policy_name { { privilege_audit_clause | access_audit_clause } [ filter_group_clause ] [ ENABLE | DISABLE ] }; privilege_audit_clause: 1 PRIVILEGES { DDL | ALL } [ ON LABEL ( resource_label_name [, ... ] ) ] access_audit_clause: ACCESS { DML | ALL } [ ON LABEL ( resource_label_name [, ... ] ) ]
  • 参数说明 UNLOGGED 指定表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是,它也是不安全的,非日志表在冲突或异常关机后会被自动删截。非日志表中的内容也不会被复制到备用服务器中。在该类表中创建的索引也不会被自动记录。 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 GLOBAL | LOCAL 创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。目前这两个关键字的设立,仅是为了兼容SQL标准,实际上无论指定GLOBAL还是LOCAL, GaussDB 都会创建本地临时表。 TEMPORARY | TEMP 如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表分为全局临时表和本地临时表两种类型。创建临时表时如果指定GLOBAL关键字则为全局临时表,否则为本地临时表。 全局临时表的元数据对所有会话可见,会话结束后元数据继续存在。会话与会话之间的用户数据、索引和统计信息相互隔离,每个会话只能看到和更改自己提交的数据。全局临时表有两种模式:一种是基于会话级别的(ON COMMIT PRESERVE ROWS),当会话结束时自动清空用户数据;一种是基于事务级别的(ON COMMIT DELETE ROWS),当执行commit或rollback时自动清空用户数据。建表时如果没有指定ON COMMIT选项,则缺省为会话级别。与本地临时表不同,全局临时表建表时可以指定非pg_temp_开头的schema。 本地临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。 本地临时表通过每个会话独立的以pg_temp开头的schema来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg_temp,pg_toast_temp开头的schema。 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的schema为当前会话的pg_temp_开头的schema,则此表会被创建为临时表。 ALTER/DROP全局临时表和索引,如果其它会话正在使用它,禁止操作。 全局临时表的DDL只会影响当前会话的用户数据和索引。例如truncate、reindex、analyze只对当前会话有效。 table_name 要创建的表名。 取值范围:字符串,要符合标识符的命名规范。 column_name 新表中要创建的字段名。 取值范围:字符串,要符合标识符的命名规范。 WITH ( storage_parameter [= value] [, ... ] ) 这个子句为表或索引指定一个可选的存储参数。参数的详细说明如下所示。 FILLFACTOR 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数只对行存表有效。 取值范围:10~100 ORIENTATION 取值范围: COLUMN:表的数据将以列式存储。 ROW(缺省值):表的数据将以行式存储。 COMPRESSION 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。 取值范围: 列存表的有效值为YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。 行存表不支持压缩。 MAX_BATCHROW 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 取值范围:10000~60000 hashbucket 创建hash bucket存储。本参数仅支持行存表和行存range表。 取值范围:on/off 默认值:off 当前版本hashbucket表相关DDL操作性能受限,不建议频繁对hashbucket表进行DDL操作。 COMPRESS / NOCOMPRESS 创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。行存表不支持压缩。 缺省值:NOCOMPRESS,即不对元组数据进行压缩。 TABLESPACE tablespace_name 指定新表将要在tablespace_name表空间内创建。如果没有声明,将使用默认表空间。 DISTRIBUTE BY 指定表如何在节点之间分布或者复制。 REPLICATION:表的每一行存在所有数据节点( DN )中,即每个数据节点都有完整的表数据。 HASH (column_name ) :对指定的列进行Hash,通过映射,把数据分布到指定DN。 当指定DISTRIBUTE BY HASH (column_name)参数时,创建主键和唯一索引必须包含“ column_name”列。 当被参照表指定DISTRIBUTE BY HASH (column_name)参数时,参照表的外键必须包含“ column_name”列。 缺省值:HASH(column_name),column_name取表的主键列(如果有的话)或首个数据类型支持作为分布列的列。 column_name的数据类型必须是以下类型之一: INTEGER TYPES:TINYINT,SMALLINT,INT,BIGINT,NUMERIC/DECIMAL CHARACTER TYPES: CHAR,BPCHAR,VARCHAR,VARCHAR2,NVARCHAR2 DATE/TIME TYPES: DATE,TIME,TIMETZ,TIMESTAMP,TIMESTAMPTZ,INTERVAL,SMALLDATETIME TO { GROUP groupname | NODE ( nodename [, ... ] ) } TO GROUP指定创建表所在的Node Group,目前不支持hdfs表使用。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 AS query 一个SELECT VALUES命令或者一个运行预备好的SELECT或VALUES查询的EXECUTE命令。 [ WITH [ NO ] DATA ] 创建表时,是否也插入查询到的数据。默认是要数据,选择“NO”参数时,则不要数据。
  • 功能描述 根据查询结果创建表。 CREATE TABLE AS创建一个表并且用来自SELECT命令的结果填充该表。该表的字段和SELECT输出字段的名称及数据类型相关。不过用户可以通过明确地给出一个字段名称列表来覆盖SELECT输出字段的名称。 CREATE TABLE AS对源表进行一次查询,然后将数据写入新表中,而查询视图结果会根据源表的变化而有所改变。相比之下,每次做查询的时候,视图都重新计算定义它的SELECT语句。
  • 语法格式 1 2 3 4 5 6 7 8 9 CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE table_name [ (column_name [, ...] ) ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY { REPLICATION | { [HASH ] ( column_name ) } } ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] AS query [ WITH [ NO ] DATA ];
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --将创建在模式tpcds里的所有表(和视图)的SELECT权限授予每一个用户。 postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT SELECT ON TABLES TO PUBLIC; --创建用户普通用户jack。 postgres=# CREATE USER jack PASSWORD 'xxxxxxxxxx'; --将tpcds下的所有表的插入权限授予用户jack。 postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT INSERT ON TABLES TO jack; --撤销上述权限。 postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE SELECT ON TABLES FROM PUBLIC; postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE INSERT ON TABLES FROM jack; --删除用户jack。 postgres=# DROP USER jack;
  • 参数说明 target_role 已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。 取值范围:已有角色的名称。 schema_name 现有模式的名称。 target_role必须有schema_name的CREATE权限。 取值范围:现有模式的名称。 role_name 被授予或者取消权限角色的名称。 取值范围:已存在的角色名称。 如果想删除一个被赋予了默认权限的角色,有必要恢复改变的缺省权限或者使用DROP OWNED BY来为角色脱离缺省的权限记录。
  • 语法格式 1 2 3 4 ALTER DEFAULT PRIVILEGES [ FOR { ROLE | USER } target_role [, ...] ] [ IN SCHEMA schema_name [, ...] ] abbreviated_grant_or_revoke; 其中abbreviated_grant_or_revoke子句用于指定对哪些对象进行授权或回收权限。 1 2 3 4 5 6 7 8 9 10 11 12 grant_on_tables_clause | grant_on_sequences_clause | grant_on_functions_clause | grant_on_types_clause | grant_on_client_master_keys_clause | grant_on_column_encryption_keys_clause | revoke_on_tables_clause | revoke_on_sequences_clause | revoke_on_functions_clause | revoke_on_types_clause | revoke_on_client_master_keys_clause | revoke_on_column_encryption_keys_clause 其中grant_on_tables_clause子句用于对表授权。 1 2 3 4 5 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] } ON TABLES TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_sequences_clause子句用于对序列授权。 1 2 3 4 5 GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_functions_clause子句用于对函数授权。 1 2 3 4 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON FUNCTIONS TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_types_clause子句用于对类型授权。 1 2 3 4 GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TYPES TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_client_master_keys_clause子句用于对客户端主密钥授权。 1 2 3 4 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] } ON CLIENT_MASTER_KEYS TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_column_encryption_keys_clause子句用于对列加密密钥授权。 1 2 3 4 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] } ON COLUMN_ENCRYPTION_KEYS TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中revoke_on_tables_clause子句用于回收表对象的权限。 1 2 3 4 5 6 REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] } ON TABLES FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] 其中revoke_on_sequences_clause子句用于回收序列的权限。 1 2 3 4 5 6 REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] 其中revoke_on_functions_clause子句用于回收函数的权限。 1 2 3 4 5 REVOKE [ GRANT OPTION FOR ] { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON FUNCTIONS FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] 其中revoke_on_types_clause子句用于回收类型的权限。 1 2 3 4 5 REVOKE [ GRANT OPTION FOR ] { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TYPES FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
  • \copy命令 \copy命令格式以及说明参见表 1 \copy元命令说明。 表1 \copy元命令说明 语法 说明 \copy { table [ ( column_list ) ] | ( query ) } { from | to } { filename | stdin | stdout | pstdin | pstdout } [ with ] [ binary ] [ oids ] [ delimiter [ as ] 'character' ] [ null [ as ] 'string' ] [ csv [ header ] [ quote [ as ] 'character' ] [ escape [ as ] 'character' ] [ force quote column_list | * ] [ force not null column_list ] ] 在任何gsql客户端登录数据库成功后,可以使用该命令进行数据的导入/导出。但是与SQL的COPY命令不同,该命令读取/写入的文件是本地文件,而非数据库服务器端文件;所以,要操作的文件的可访问性、权限等,都是受限于本地用户的权限。 说明: \COPY只适合小批量、格式良好的数据导入,不会对非法字符做预处理,也无容错能力,无法适用于含有异常数据的场景。导入数据应优先选择GDS或COPY。
  • 语句下推介绍 目前,GaussDB优化器在分布式框架下制定语句的执行策略时,有三种执行计划方式:生成下推语句计划、生成分布式执行计划、生成发送语句的分布式执行计划。 下推语句计划:指直接将完整的查询语句从CN发送到DN进行执行,然后将执行结果返回给CN。 分布式执行计划:指CN对查询语句进行编译和优化,生成计划树,再将计划树发送给DN进行执行,并在执行完毕后返回结果到CN。 发送语句的分布式执行计划:上述两种方式都不可行时,将可下推的查询部分组成查询语句(多为基表扫描语句)下推到DN进行执行,获取中间结果到CN,然后在CN执行剩下的部分。 在第3种策略中,要将大量中间结果从DN发送到CN,并且要在CN运行不能下推的部分语句,会导致CN成为性能瓶颈(带宽、存储、计算等)。在进行性能调优的时候,应尽量避免只能选择第3种策略的查询语句。 执行语句不能下推是因为语句中含有不支持下推的函数或者不支持下推的语法。一般都可以通过等价改写规避执行计划不能下推的问题。
  • 不支持下推的函数 首先介绍函数的易变性。在GaussDB中共分三种形态: IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 VOLATILE 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 函数易变性可以查询pg_proc的provolatile字段获得,i代表IMMUTABLE,s代表STABLE,v代表VOLATILE。另外,在pg_proc中的proshippable字段,取值范围为t/f/NULL,这个字段与provolatile字段一起用于描述函数是否下推。 如果函数的provolatile属性为i,则无论proshippable的值是否为t,则函数始终可以下推。 如果函数的provolatile属性为s或v,则仅当proshippable的值为t时,函数可以下推。 random,exec_hadoop_sql,exec_on_extension如果出现CTE中,也不下推。因为这种场景下下推可能出现结果错误。 对于用户自定义函数,可以在创建函数的时候指定provolatile和proshippable属性的值,详细请参考CREATE FUNCTION。 对于函数不能下推的场景: 如果是系统函数,建议根据业务等价替换这个函数。 如果是自定义函数,建议分析客户业务场景,看函数的provolatile和proshippable属性定义是否正确。
  • 返回值 PQresultStatus:命令执行结果的枚举,包括: 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 PQresultStatus可以返回下面数值之一: PGRES_EMPTY_QUERY 发送给服务器的字串是空的。 PGRES_COMMAND_OK 成功完成一个不返回数据的命令。 PGRES_TUPLES_OK 成功执行一个返回数据的查询(比如SELECT或者SHOW)。 PGRES_COPY_OUT (从服务器)Copy Out (拷贝出)数据传输开始。 PGRES_COPY_IN Copy In(拷贝入)(到服务器)数据传输开始。 PGRES_BAD_RESPONSE 服务器的响应无法理解。 PGRES_NONFATAL_ERROR 发生了一个非致命错误(通知或者警告)。 PGRES_FATAL_ERROR 发生了一个致命错误。 PGRES_COPY_BOTH 拷贝入/出(到和从服务器)数据传输开始。这个特性当前只用于流复制, 所以这个状态不会在普通应用中发生。 PGRES_SINGLE_TUPLE PGresult包含一个来自当前命令的结果元组。 这个状态只在查询选择了单行模式时发生
  • 示例 示例1:创建GDS导出外表foreign_tpcds_reasons,待导出数据格式为 CS V,用于接收数据服务器上的数据。 其中设置的导出模式信息如下所示: 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,待导出的数据文件格式为CSV,选择并行导出模式为Remote模式。 假定启动GDS时,规划导出的数据文件存放目录为“/output_data/”,GDS侦听端口为5000,所以设置参数“location”为“gsfs://192.168.0.90:5000/”。 设置导出的数据格式信息,参数设置如下所示: 导出数据文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为0x1b。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)为默认值双引号。 数据文件是否包含标题行(header)为默认值false,即导出时数据文件第一行被识别为数据。 导出数据文件换行符样式(EOL)为0X0A。 创建的外表如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV', DELIMITER E'\x08', QUOTE E'\x1b', NULL '', EOL '0x0a' ) WRITE ONLY; 示例2:创建GDS导出外表foreign_tpcds_reasons,导出数据格式为FIXED,用于接收数据服务器上的数据。 其中设置的导出模式信息如下所示: 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,计划导出的数据文件格式为CSV,选择并行导出模式为Remote模式。 假定启动GDS时,规划导出的数据文件存放目录为“/output_data/”,GDS侦听端口为5000,所以设置参数“location”为“gsfs://192.168.0.90:5000/”。 设置导出的数据格式信息,参数设置如下所示: 导出数据文件格式(format)为FIXED。 编码格式(encoding)为UTF-8。 数据文件是否包含标题行(header)为默认值false,即指定导出数据文件是不包含标题行。 定义每一个字段在数据文件中的位置POSITION(offset,length)。其中offset为该字段在文件中的起始位置,length为该字段的长度,单位为字节。 字段“r_reason_sk”,数据类型为integer,使用以下查询所得占用的最大字节数为2,所以设置的起始位置为1,长度为2。 字段“r_reason_id”,数据类型为character varying(16),使用以下查询所得占用的最大字节数为16,所以设置的起始位置为字段“r_reason_sk”的offset+length=1+2=3,长度为16。 字段“r_reason_desc”,数据类型为character varying(100),使用以下查询所得占用的最大字节数为100,所以设置的起始位置为字段“r_reason_id”的offset+length=3+16=19,长度为100。 1 2 3 4 5 postgres=# SELECT max(lengthb(r_reason_sk)),max(lengthb(r_reason_id)),max(lengthb(r_reason_desc)) FROM reasons; max | max | max -----+-----+----- 2 | 16 | 100 (1 row) 导出数据文件换行符样式(EOL)为0X0A。 创建的外表如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer position(1,2), r_reason_id char(16) position(3,16), r_reason_desc char(100) position(19,100) ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'FIXED', ENCODING 'utf8', EOL '0x0a' ) WRITE ONLY;
  • 操作步骤 根据规划导出数据中规划的路径确定外表参数location的值。 Remote模式 请通过URL方式设置参数“location”,用于指定导出的数据文件存放路径。 不需要指定文件名。 当有多个路径时,只有第一个路径有效。 示例: GDS数据服务器IP为192.168.0.90,假定启动GDS时设置的侦听端口为5000,设置的导出后文件存放目录为“/output_data/”。 根据以上情况,在创建外表时,指定参数“location”为“gsfs://192.168.0.90:5000/”。 Local模式 设置参数“location”,用于指定导出的数据文件存放路径,不需要指定文件名。 示例: 数据源文件可通过本地文件方式访问,计划将导出数据文件存放在“/output_data/”目录中。 根据以上情况,在创建外表时,指定参数“location”为“file:///output_data/”。 梳理待导出数据的格式信息,确定创建外表时使用的数据格式参数的值。格式参数详细介绍,请参见数据格式参数。 根据前面步骤确定的参数,创建GDS外表。外表的创建语法以及详细使用,请参考CREATE FOREIGN TABLE (导入导出)。
  • 语法格式 1 2 3 4 5 ALTER [ ROW LEVEL SECURITY ] POLICY [ IF EXISTS ] policy_name ON table_name RENAME TO new_policy_name; ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name [ TO { role_name | PUBLIC } [, ...] ] [ USING ( using_expression ) ];
  • 参数说明 groupname 节点组名称。 取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。 节点组命名支持ASCII字符集上所有字符,但是建议用户按照标识符命名规范命名。 nodename 节点名称。 取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。 BUCKETS [ ( bucketnumber [, ... ] ) ] BUCKETS子句是集群管理工具的内部用法,该子句不建议用户直接使用,以免对集群的正常使用造成影响。 VCGROUP 创建一个逻辑集群类型的节点组。 DISTRIBUTE FROM src_group_name 创建一个逻辑集群节点组,用于从src_group_name指定的逻辑集群节点组重分布数据。该子句不建议用户直接使用,以免导致数据分布错误和逻辑集群不可用。
  • 配置设置函数 配置设置函数是可以用于查询以及修改运行时配置参数的函数。 current_setting(setting_name) 描述:当前的设置值。 返回值类型:text 备注:current_setting用于以查询形式获取setting_name的当前值。和SQL语句SHOW是等效的。比如: 1 2 3 4 5 6 postgres=# 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,则新值将只应用于当前事务。如果希望新值应用于当前会话,可以使用false,和SQL语句SET是等效的。 示例: 1 2 3 4 5 6 postgres=# SELECT set_config('log_statement_stats', 'off', false); set_config ------------ off (1 row) 父主题: 系统管理函数
  • DDL 【建议】在GaussDB中,建议DDL(建表、comments等)操作统一执行,在批处理作业中尽量避免DDL操作。避免大量并发事务对性能的影响。 【建议】在非日志表(unlogged table)使用完后,立即执行数据清理(truncate)操作。因为在异常场景下,GaussDB不保证非日志表(unlogged table)数据的安全性。 【建议】临时表和非日志表的存储方式建议和基表相同。当基表为行存(列存)表时,临时表和非日志表也推荐创建为行存(列存)表,可以避免行列混合关联带来的高计算代价。 【建议】索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。 【建议】不要使用DROP…CASCADE方式删除对象,除非已经明确对象间的依赖关系,以免误删。
  • 数据加载和卸载 【建议】在insert语句中显式给出插入的字段列表。例如: 1 INSERT INTO task(name,id,comment) VALUES ('task1','100','第100个任务'); 【建议】在批量数据入库之后,或者数据增量达到一定阈值后,建议对表进行analyze操作,防止统计信息不准确而导致的执行计划劣化。 【建议】如果要清理表中的所有数据,建议使用truncate table方式,不要使用delete table方式。delete table方式删除性能差,且不会释放那些已经删除了的数据占用的磁盘空间。
  • 二进制字符串函数 GaussDB也提供了函数调用所使用的常用语法。 btrim(string bytea,bytes bytea) 描述:从string的开头和结尾删除只包含bytes中字节的最长的字符串。 返回值类型:bytea 示例: 1 2 3 4 5 postgres=# SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea) AS RESULT; result ------------ \x7472696d (1 row) get_bit(string, offset) 描述:从字符串中抽取位。 返回值类型:int 示例: 1 2 3 4 5 postgres=# SELECT get_bit(E'Th\\000omas'::bytea, 45) AS RESULT; result -------- 1 (1 row) get_byte(string, offset) 描述:从字符串中抽取字节。 返回值类型:int 示例: 1 2 3 4 5 postgres=# SELECT get_byte(E'Th\\000omas'::bytea, 4) AS RESULT; result -------- 109 (1 row) set_bit(string,offset, newvalue) 描述:设置字符串中的位。 返回值类型:bytea 示例: 1 2 3 4 5 postgres=# SELECT set_bit(E'Th\\000omas'::bytea, 45, 0) AS RESULT; result ------------------ \x5468006f6d4173 (1 row) set_byte(string,offset, newvalue) 描述:设置字符串中的字节。 返回值类型:bytea 示例: 1 2 3 4 5 postgres=# SELECT set_byte(E'Th\\000omas'::bytea, 4, 64) AS RESULT; result ------------------ \x5468006f406173 (1 row) rawcmp 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:integer raweq 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawge 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawgt 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawin 描述:raw数据类型解析函数。 参数:cstring 返回值类型:bytea rawle 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawlike 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawlt 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawne 描述:比较raw类型是否一样。 参数:raw, raw 返回值类型:boolean rawnlike 描述:比较raw类型与模式是否不匹配。 参数:raw, raw 返回值类型:boolean rawout 描述:RAW类型的输出接口。 参数:bytea 返回值类型:cstring rawsend 描述:转换bytea为二进制类型。 参数:raw 返回值类型:bytea rawtohex 描述:raw格式转换为十六进制。 参数:text 返回值类型:text
  • 字符串操作符 SQL定义了一些字符串函数,在这些函数里使用关键字而不是逗号来分隔参数。 octet_length(string) 描述:二进制字符串中的字节数。 返回值类型:int 示例: 1 2 3 4 5 postgres=# SELECT octet_length(E'jo\\000se'::bytea) AS RESULT; result -------- 5 (1 row) overlay(string placing string from int [for int]) 描述:替换子串。 返回值类型:bytea 示例: 1 2 3 4 5 postgres=# SELECT overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3) AS RESULT; result ---------------- \x5402036d6173 (1 row) position(substring in string) 描述:特定子字符串的位置。 返回值类型:int 示例: 1 2 3 4 5 postgres=# SELECT position(E'\\000om'::bytea in E'Th\\000omas'::bytea) AS RESULT; result -------- 3 (1 row) substring(string [from int] [for int]) 描述:截取子串。 返回值类型:bytea 示例: 1 2 3 4 5 postgres=# SELECT substring(E'Th\\000omas'::bytea from 2 for 3) AS RESULT; result ---------- \x68006f (1 row) substr(bytea [from int] [for int]) 描述:截取子串。 返回值类型:bytea 示例: 1 2 3 4 5 postgres=# select substr(E'Th\\000omas'::bytea,2, 3) as result; result ---------- \x68006f (1 row) trim([both] bytes from string) 描述:从string的开头和结尾删除只包含bytes中字节的最长字符串。 返回值类型:bytea 示例: 1 2 3 4 5 postgres=# SELECT trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) AS RESULT; result ---------- \x546f6d (1 row)
  • 原型 1 2 3 4 5 6 7 8 9 10 SQLRETURN SQLBindParameter(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT InputOutputType, SQLSMALLINT ValuetType, SQLSMALLINT ParameterType, SQLSMALLINT ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, SQLINTEGER BufferLength, SQLINTEGER *StrLen_or_IndPtr);
  • 参数 表1 SQLBindParameter 关键词 参数说明 StatementHandle 语句句柄。 ParameterNumber 参数序号,起始为1,依次递增。 InputOutputType 输入输出参数类型。 ValueType 参数的C数据类型。 ParameterType 参数的SQL数据类型。 ColumnSize 列的大小或相应参数标记的表达式。 DecimalDigits 列的十进制数字或相应参数标记的表达式。 ParameterValuePtr 指向存储参数数据缓冲区的指针。 BufferLength ParameterValuePtr指向缓冲区的长度,以字节为单位。 StrLen_or_IndPtr 缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 --创建基本表table_for_label。 postgres=# CREATE TABLE table_for_label(col1 int, col2 text); --创建资源标签table_label。 postgres=# CREATE RESOURCE LABEL table_label ADD COLUMN(table_for_label.col1); --将col2添加至资源标签table_label中 postgres=# ALTER RESOURCE LABEL table_label ADD COLUMN(table_for_label.col2) --将资源标签table_label中的一项移除 postgres=# ALTER RESOURCE LABEL table_label REMOVE COLUMN(table_for_label.col1);
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 --演示在存储过程中对数组进行操作。 postgres=# CREATE OR REPLACE PROCEDURE array_proc AS TYPE ARRAY_INTEGER IS VARRAY(1024) OF INTEGER;--定义数组类型 ARRINT ARRAY_INTEGER := ARRAY_INTEGER(); --声明数组类型的变量 BEGIN ARRINT.extend(10); FOR I IN 1..10 LOOP ARRINT(I) := I; END LOOP; DBE_OUTPUT.PRINT_LINE(ARRINT.COUNT); DBE_OUTPUT.PRINT_LINE(ARRINT(1)); DBE_OUTPUT.PRINT_LINE(ARRINT(10)); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.FIRST)); DBE_OUTPUT.PRINT_LINE(ARRINT(ARRINT.last)); END; / --调用该存储过程。 postgres=# CALL array_proc(); --删除存储过程。 postgres=# DROP PROCEDURE array_proc;
  • 数组类型的使用 在使用数组之前,需要自定义一个数组类型。 在存储过程中紧跟AS关键字后面定义数组类型。定义方法为: TYPE array_type IS VARRAY(size) OF data_type; 其中: array_type:要定义的数组类型名。 VARRAY:表示要定义的数组类型。 size:取值为正整数,表示可以容纳的成员的最大数量。 data_type:要创建的数组中成员的类型。 在GaussDB中,数组会自动增长,访问越界会返回一个NULL,不会报错。 在存储过程中定义的数组类型,其作用域仅在该存储过程中。 建议选择上述定义方法的一种来自定义数组类型,当同时使用两种方法定义同名的数组类型时,GaussDB会优先选择存储过程中定义的数组类型来声明数组变量。 GaussDB支持使用圆括号来访问数组元素,且还支持一些特有的函数,如extend,count,first,last来访问数组的内容。 存储过程中如果有DML语句(SELECT、UPDATE、INSERT、DELETE),DML语句只能使用中括号来访问数组元素,这样可以和函数表达式区分开。
  • dynamic_library_path 参数说明:设置数据查找动态加载的共享库文件的路径。当需要打开一个可以动态装载的模块并且在CREATE FUNCTION或LOAD命令里面声明的名称没有目录部分时,系统将搜索这个目录以查找声明的文件,仅sysadmin用户可以访问。 用于dynamic_library_path的数值必须是一个冒号分隔(Windows下是分号分隔)的绝对路径列表。当一个路径名称以特殊变量$libdir为开头时,会替换为GaussDB发布提供的模块安装路径。例如: 1 dynamic_library_path = '/usr/local/lib/postgresql:/opt/testgs/lib:$libdir' 该参数属于SUSET类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:字符串 设置为空字符串,表示关闭自动路径搜索。 默认值:$libdir
  • local_preload_libraries 参数说明:指定一个或多个共享库,它们在开始连接前预先加载。多个加载库之间用逗号分隔,除了双引号,所有的库名都转换为小写。 并非只有系统管理员才能更改此选项,因此只能加载安装的标准库目录下plugins子目录中的库文件,数据库管理员有责任确保该目录中的库都是安全的。local_preload_libraries中指定的项可以明确含有该目录,例如$libdir/plugins/mylib;也可以仅指定库的名称,例如mylib(等价于$libdir/plugins/mylib)。 与shared_preload_libraries不同,在会话开始之前加载模块与在会话中使用到该模块的时候临时加载相比并不具有性能优势。相反,这个特性的目的是为了调试或者测量在特定会话中不明确使用LOAD加载的库。例如针对某个用户将该参数设为ALTER USER SET来进行调试。 当指定的库未找到时,连接会失败。 每一个支持GaussDB的库都有一个“magic block”用于确保兼容性,因此不支持GaussDB的库不能通过这个方法加载。 该参数属于BACKEND类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:字符串 默认值:空
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 其中with_query的详细格式为:with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} ) – with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问 子查询的结果集。 – column_name指定子查询结果集中显示的列名。 – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 INSERT ON DUPLICATE KEY UPDATE不支持WITH及WITH RECURSIVE子句。 table_name 要插入数据的目标表名。 取值范围:已存在的表名。 column_name 目标表中的字段名: 字段名可以有子字段名或者数组下标修饰。 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据的话,其他字段将是NULL。 目标字段(column_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 如果value子句和query中只提供了N个字段,则目标字段为前N个字段。 value子句和query提供的值在表中从左到右关联到对应列。 取值范围:已存在的字段名。 expression 赋予对应column的一个有效表达式或值: 如果是INSERT ON DUPLICATE KEY UPDATE语句下,expression可以为VALUES(column_name)或EXCLUDED.column_name用来表示引用冲突行对应的column_name字段的值。需注意,其中VALUES(column_name)不支持嵌套在表达式中(例如VALUES(column_name)+1),但EXCLUDED不受此限制。 向表中字段插入单引号 " ' "时需要使用单引号自身进行转义。 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 DEFAULT 对应字段名的缺省值。如果没有缺省值,则为NULL。 query 一个查询语句(SELECT语句),将查询结果作为插入的数据。 RETURNING 返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。注意:INSERT ON DUPLICATE KEY UPDATE不支持RETURNING子句。 output_expression INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 取值范围:该表达式可以使用table的任意字段。可以使用*返回被插入行的所有字段。 output_name 字段的输出名称。 取值范围:字符串,符合标识符命名规范。 ON DUPLICATE KEY UPDATE 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新。如果UPDATE子句为NOTHING,则不做任何操作。 对于不带唯一约束的表,则仅执行插入。 不支持触发器,不会触发目标表的INSERT或UPDATE触发器。 不支持延迟生效(DEFERRABLE)的唯一约束或主键。 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 分布列、唯一索引列不允许UPDATE。 列存表不支持该操作就行。
共100000条