华为云用户手册

  • bit_and(expression) 描述:所有非NULL输入值的按位与(AND),如果全部输入值皆为NULL,那么结果也为NULL 。 返回类型:和参数数据类型相同。 示例: 1 2 3 4 5 SELECT BIT_AND(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1; bit_and --------- 0 (1 row)
  • listagg(expression [, delimiter]) WITHIN GROUP(ORDER BY order-list) 描述:将聚集列数据按WITHIN GROUP指定的排序方式排列,并用delimiter指定的分隔符拼接成一个字符串。 expression:必选。指定聚集列名或基于列的有效表达式,不支持DISTINCT关键字和VARIADIC参数。 delimiter:可选。指定分隔符,可以是字符串常数或基于分组列的确定性表达式,缺省时表示分隔符为空。 order-list:必选。指定分组内的排序方式。 返回类型:text listagg是兼容Oracle 11g2的列转行聚集函数,可以指定OVER子句用作窗口函数。为了避免与函数本身WITHIN GROUP子句的ORDER BY造成二义性,listagg用作窗口函数时,OVER子句不支持ORDER BY的窗口排序或窗口框架。 示例: 聚集列是文本字符集类型: 1 2 3 4 5 6 7 SELECT deptno, listagg(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees FROM emp GROUP BY deptno; deptno | employees --------+-------------------------------------- 10 | CLARK,KING,MILLER 20 | ADAMS,FORD,JONES,SCOTT,SMITH 30 | ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD (3 rows) 聚集列是整型: 1 2 3 4 5 6 7 SELECT deptno, listagg(mgrno, ',') WITHIN GROUP(ORDER BY mgrno NULLS FIRST) AS mgrnos FROM emp GROUP BY deptno; deptno | mgrnos --------+------------------------------- 10 | 7782,7839 20 | 7566,7566,7788,7839,7902 30 | 7698,7698,7698,7698,7698,7839 (3 rows) 聚集列是浮点类型: 1 2 3 4 5 6 7 8 9 SELECT job, listagg(bonus, '($); ') WITHIN GROUP(ORDER BY bonus DESC) || '($)' AS bonus FROM emp GROUP BY job; job | bonus ------------+------------------------------------------------- CLERK | 10234.21($); 2000.80($); 1100.00($); 1000.22($) PRESIDENT | 23011.88($) ANALYST | 2002.12($); 1001.01($) MANAGER | 10000.01($); 2399.50($); 999.10($) SALESMAN | 1000.01($); 899.00($); 99.99($); 9.00($) (5 rows) 聚集列是时间类型: 1 2 3 4 5 6 7 SELECT deptno, listagg(hiredate, ', ') WITHIN GROUP(ORDER BY hiredate DESC) AS hiredates FROM emp GROUP BY deptno; deptno | hiredates --------+------------------------------------------------------------------------------------------------------------------------------ 10 | 1982-01-23 00:00:00, 1981-11-17 00:00:00, 1981-06-09 00:00:00 20 | 2001-04-02 00:00:00, 1999-12-17 00:00:00, 1987-05-23 00:00:00, 1987-04-19 00:00:00, 1981-12-03 00:00:00 30 | 2015-02-20 00:00:00, 2010-02-22 00:00:00, 1997-09-28 00:00:00, 1981-12-03 00:00:00, 1981-09-08 00:00:00, 1981-05-01 00:00:00 (3 rows) 聚集列是时间间隔类型: 1 2 3 4 5 6 7 SELECT deptno, listagg(vacationTime, '; ') WITHIN GROUP(ORDER BY vacationTime DESC) AS vacationTime FROM emp GROUP BY deptno; deptno | vacationtime --------+------------------------------------------------------------------------------------ 10 | 1 year 30 days; 40 days; 10 days 20 | 70 days; 36 days; 9 days; 5 days 30 | 1 year 1 mon; 2 mons 10 days; 30 days; 12 days 12:00:00; 4 days 06:00:00; 24:00:00 (3 rows) 分隔符缺省时,默认为空: 1 2 3 4 5 6 7 SELECT deptno, listagg(job) WITHIN GROUP(ORDER BY job) AS jobs FROM emp GROUP BY deptno; deptno | jobs --------+---------------------------------------------- 10 | CLERKMANAGERPRESIDENT 20 | ANALYSTANALYSTCLERKCLERKMANAGER 30 | CLERKMANAGERSALESMANSALESMANSALESMANSALESMAN (3 rows) listagg作为窗口函数时,OVER子句不支持ORDER BY的窗口排序,listagg列为对应分组的有序聚集: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 SELECT deptno, mgrno, bonus, listagg(ename,'; ') WITHIN GROUP(ORDER BY hiredate) OVER(PARTITION BY deptno) AS employees FROM emp; deptno | mgrno | bonus | employees --------+-------+----------+------------------------------------------- 10 | 7839 | 10000.01 | CLARK; KING; MILLER 10 | | 23011.88 | CLARK; KING; MILLER 10 | 7782 | 10234.21 | CLARK; KING; MILLER 20 | 7566 | 2002.12 | FORD; SCOTT; ADAMS; SMITH; JONES 20 | 7566 | 1001.01 | FORD; SCOTT; ADAMS; SMITH; JONES 20 | 7788 | 1100.00 | FORD; SCOTT; ADAMS; SMITH; JONES 20 | 7902 | 2000.80 | FORD; SCOTT; ADAMS; SMITH; JONES 20 | 7839 | 999.10 | FORD; SCOTT; ADAMS; SMITH; JONES 30 | 7839 | 2399.50 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN 30 | 7698 | 9.00 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN 30 | 7698 | 1000.22 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN 30 | 7698 | 99.99 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN 30 | 7698 | 1000.01 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN 30 | 7698 | 899.00 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN (14 rows)
  • median(expression) 描述:所有输入值的中位数值。当前只支持数值类型和interval类型。其中空值不参与计算。 返回类型: 对于任何整型数据输入,结果都是NUMERIC类型。否则与输入数据类型相同。 Teradata兼容模式下,如果输入为整型,则返回的数据精度只有整数位。 示例: 1 2 3 4 5 SELECT MEDIAN(inv_quantity_on_hand) FROM tpcds.inventory; median -------- 500 (1 row)
  • percentile_cont(const) within group(order by expression) 描述:返回一个对应于目标列排序中指定分位数的值,如有必要就在相邻的输入项之间插入值。其中空值不参与计算。 输入:const为在0-1之间的数值,expression当前只支持数值类型和interval类型。 返回类型: 对于任何整型数据输入,结果都是NUMERIC类型。否则与输入数据类型相同。 Teradata兼容模式下,如果输入为整型,则返回的数据精度只有整数位。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT percentile_cont(0.3) within group(order by x) FROM (SELECT generate_series(1,5) AS x) AS t; percentile_cont ----------------- 2.2 (1 row) SELECT percentile_cont(0.3) within group(order by x desc) FROM (SELECT generate_series(1,5) AS x) AS t; percentile_cont ----------------- 3.8 (1 row)
  • array_agg(expression) 描述:将所有输入值(包括空)连接成一个数组。函数入参不支持数组形式。 返回类型:参数类型的数组。 示例: 创建表employeeinfo,并插入数据: 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE employeeinfo (empno smallint, ename varchar(20), job varchar(20), hiredate date,deptno smallint); INSERT INTO employeeinfo VALUES (7155, 'JACK', 'SALESMAN', '2018-12-01', 30); INSERT INTO employeeinfo VALUES (7003, 'TOM', 'FINANCE', '2016-06-15', 20); INSERT INTO employeeinfo VALUES (7357, 'MAX', 'SALESMAN', '2020-10-01', 30); SELECT * FROM employeeinfo; empno | ename | job | hiredate | deptno -------+-------+----------+---------------------+-------- 7155 | JACK | SALESMAN | 2018-12-01 00:00:00 | 30 7357 | MAX | SALESMAN | 2020-10-01 00:00:00 | 30 7003 | TOM | FINANCE | 2016-06-15 00:00:00 | 20 (3 rows) 查询部门编号为30的所有员工姓名: 1 2 3 4 5 SELECT array_agg(ename) FROM employeeinfo where deptno = 30; array_agg ------------ {JACK,MAX} (1 row) 查询属于同一个部门的所有员工: 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT deptno, array_agg(ename) FROM employeeinfo group by deptno; deptno | array_agg --------+------------ 30 | {JACK,MAX} 20 | {TOM} (2 rows) SELECT distinct array_agg(ename) OVER (PARTITION BY deptno) FROM employeeinfo; array_agg ------------ {TOM} {JACK,MAX} (2 rows) 查询所有的部门编号且去重: 1 2 3 4 5 6 SELECT array_agg(distinct deptno) FROM employeeinfo group by deptno; array_agg ----------- {20} {30} (2 rows) 查询所有的部门编号去重后按降序排列: 1 2 3 4 5 SELECT array_agg(distinct deptno order by deptno desc) FROM employeeinfo; array_agg ----------- {30,20} (1 row)
  • percentile_disc(const) within group(order by expression) 描述:返回第一个在排序中位置等于或者超过指定分数的输入值。 输入:const为在0-1之间的数值,expression当前只支持数值类型和interval类型。其中空值不参与计算。 返回类型:对于任何整型数据输入,结果都是NUMERIC类型。否则,与输入数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT percentile_disc(0.3) within group(order by x) FROM (SELECT generate_series(1,5) AS x) AS t; percentile_disc ----------------- 2 (1 row) SELECT percentile_disc(0.3) within group(order by x desc) FROM (SELECT generate_series(1,5) AS x) AS t; percentile_disc ----------------- 4 (1 row)
  • avg(expression) 描述:所有输入值的均值(算术平均)。 当入参类型为DOUBLE PRECISION时,入参取值范围为1.34E-154~1.34E+154,若数值超过取值范围则报错:value out of range: overflow。如果实际使用中不可避免入参超出范围,则使用cast函数强转该列类型为numeric。 返回类型: 对于任何整数类型输入,结果都是NUMBER类型。 对于任何浮点输入,结果都是DOUBLE PRECISION类型。 其他,和输入数据类型相同。 示例: 1 2 3 4 5 SELECT AVG(inv_quantity_on_hand) FROM tpcds.inventory; avg ---------------------- 500.0387129084044604 (1 row)
  • sum(expression) 描述:所有输入行的expression总和。 返回类型: 通常情况下输入数据类型和输出数据类型是相同的,但以下情况会发生类型转换: 对于SMALLINT或INT输入,输出类型为BIGINT。 对于BIGINT输入,输出类型为NUMBER 。 对于浮点数输入,输出类型为DOUBLE PRECISION。 示例: 1 2 3 4 5 SELECT SUM(ss_ext_tax) FROM tpcds.STORE_SALES; sum -------------- 213267594.69 (1 row)
  • current_setting(setting_name) 描述:当前的设置值。 返回值类型:text 备注:current_setting用于以查询形式获取setting_name的当前值。和SQL语句SHOW是等效的。比如: 1 2 3 4 5 6 SELECT current_setting('datestyle'); current_setting ----------------- ISO, MDY (1 row)
  • 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 SELECT set_config('log_statement_stats', 'off', false); set_config ------------ off (1 row)
  • pgxc_verify_residualfiles() 描述:pg_verify_residualfiles()的CN统一查询函数。该函数为集群级函数,与当前所在的数据库相关,在CN实例上运行。 参数类型:无 返回值类型:record 函数返回字段如下: 表3 pgxc_verify_residualfiles()返回字段 名称 类型 描述 nodename text 节点名称 result bool 是否完成验证 filepath text 残留文件记录路径 notes text 注释 示例: 1 2 3 4 5 6 SELECT * FROM pgxc_verify_residualfiles(); nodename | result | filepath | notes --------------+--------+---------------------------+------- cn_5001 | t | pgrf_20200910170129360401 | dn_6001_6002 | t | pgrf_20200908160211441546 | (2 rows) 本函数只能验证记录的文件在当前登录的数据库中是否是残留文件。如果记录的文件不属于当前登录的数据库,则不会进行校验行为。
  • pg_verify_residualfiles(filepath) 描述:用于验证参数指定文件中记录的文件是否为残留文件。该函数为实例级函数,与当前所在的数据库相关,可以在任意实例上运行。 参数类型:text 返回值类型:bool 函数返回字段如下: 表1 pg_verify_residualfiles(filepath)返回字段 名称 类型 描述 isverified bool 是否完成验证 示例: 1 2 3 4 5 SELECT * FROM pg_verify_residualfiles('pgrf_20200908160211441546'); isverified ------------ t (1 row) 本函数只能验证记录的文件在当前登录的数据库中是否是残留文件。如果记录的文件不属于当前登录的数据库,则不会进行校验行为。
  • pg_verify_residualfiles() 描述:用于验证当前实例上所有残留文件列表中记录的文件是否为残留文件。该函数为实例级函数,与当前所在的数据库相关,可以在任意实例上运行。 参数类型:无 返回值类型:record 函数返回字段如下: 表2 pg_verify_residualfiles()返回字段 名称 类型 描述 result bool 是否完成验证 filepath text 残留文件记录路径 notes text 注释 示例: 1 2 3 4 5 SELECT * FROM pg_verify_residualfiles(); result | filepath | notes --------+---------------------------+------- t | pgrf_20200908160211441546 | (1 row) 本函数只能验证记录的文件在当前登录的数据库中是否是残留文件。如果记录的文件不属于当前登录的数据库,则不会进行校验行为。
  • pg_is_residualfiles(residualfile) 描述:用于查询当前库中指定的relfilenode是否为残留文件。该函数为实例级函数,与当前所在的数据库相关,可以在任意实例上运行。 参数类型:text 返回值类型:bool 函数返回字段如下: 表4 pg_is_residualfiles(residualfile)返回字段 名称 类型 描述 result bool 是否是残留文件 示例: 1 2 3 4 5 SELECT * FROM pg_is_residualfiles('base/49155/114691'); result -------- t (1 row) 本函数只能验证记录的文件在当前登录的database中是否为残留文件。如果记录的文件不属于当前登录的数据库,则会被检测为是残留文件。 例如:针对gaussdb数据库中的非残留文件 base/15092/14790,如果在gaussdb库中查询,则认为是非残留文件;在其他数据库中查询,则认为是残留文件。 SELECT * FROM pg_is_residualfiles('base/15092/14790'); result -------- f (1 row) \c db2 db2=# SELECT * FROM pg_is_residualfiles('base/15092/14790'); result -------- t (1 row)
  • 词典概述 词典用于定义停用词(stop words),即全文检索时不搜索哪些词。 词典还可以用于对同一词的不同形式进行规范化,这样同一个词的不同派生形式都可以进行匹配。规范化后的词称为词位(lexeme)。 除了提高检索质量外,词的规范化和删除停用词可以减少文档tsvector格式的大小, 从而提高性能。词的规范化和删除停用词并不总是具有语言学意义,用户可以根据应用环境在词典定义文件中自定义规范化和删除规则。 一个词典是一个程序,接收标记(token)作为输入,并返回: 如果token在词典中已知,返回对应lexeme数组(注意,一个标记可能对应多个lexeme)。 一个lexeme。一个新token会代替输入token被传递给后继词典(当前词典可被称为过滤词典)。 如果token在词典中已知,但它是一个停用词,返回空数组。 如果词典不能识别输入的token,返回NULL。 GaussDB (DWS)提供了多种语言的预定义词典,同时提供了五种预定义的词典模板,分别是Simple,Synonym,Thesaurus,Ispell,和Snowball,可用于创建自定义参数的新词典。 在使用全文检索时,建议用户: 可以在文本搜索配置中定义一个解析器,以及一组用于处理该解析器的输出标记词典。对于解析器返回的每个标记类型,可以在配置中指定不同的词典列表进行处理。当解析器输出一种类型的标记后,在对应列表的每个词典中会查阅该标记,直到某个词典识别它。如果它被识别为一个停用词, 或者没有任何词典识别,该token将被丢弃,即不被索引或检索到。通常情况下,第一个返回非空结果的词典决定了最终结果,后继词典将不会继续处理。但是一个过滤类型的词典可以依据规则替换输入token,然后将替换后的token传递给后继词典进行处理。 配置词典列表的一般规则是,第一个位置放置一个应用范围最小的、最具体化定义的词典,其次是更一般化定义的词典, 最后是一个普适定义的词典,比如Snowball词干词典或Simple词典。在下面例子中,对于一个针对天文学的文本搜索配置astro_en,可以定义标记类型asciiword(ASCII词)对应的词典列表为:天文术语的Synonym同义词词典, Ispell英语词典和Snowball英语词干词典。 1 2 ALTER TEXT SEARCH CONFIGURATION astro_en ADD MAPPING FOR asciiword WITH astro_syn, english_ispell, english_stem; 过滤类型的词典可以放置在词典列表中除去末尾的任何地方,放置在末尾时是无效的。使用这些词典对标记进行部分规范化,可以有效简化后继词典的处理。 父主题: 词典
  • 排序查询结果 排序试图针对特定查询衡量文档的相关度,从而将众多的匹配文档中相关度最高的文档排在最前。GaussDB(DWS)提供了两个预置的排序函数。函数考虑了词法,距离,和结构信息;也就是,考虑查询词在文档中出现的频率、紧密程度、以及出现的地方在文档中的重要性。然而,相关性的概念是模糊的,并且是跟应用强相关的。不同的应用程序可能需要额外的信息来排序,比如,文档的修改时间,内置的排序函数等。也可以开发自己的排序函数或者采用附加因素组合这些排序函数的结果来满足特定需求。 两个预置的排序函数: 1 ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 基于词素匹配率对vector进行排序: 1 ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 该函数需要位置信息的输入。因此它不能在"剥离"tsvector值的情况下运行—它将总是返回零。 对于这两个函数,可选的weights参数提供给词加权重的能力,词的权重大小取决于所加的权值。权重阵列指定在排序时为每类词汇加多大的权重。 {D-weight, C-weight, B-weight, A-weight} 如果没有提供weights,则使用缺省值:{0.1, 0.2, 0.4, 1.0} 通常的权重是用来标记文档特殊领域的词,如标题或最初的摘要,所以相对于文章主体中的词它们有着更高或更低的重要性。 由于较长的文档有更多的机会包含查询词,因此有必要考虑文档的大小。例如,包含有5个搜索词的一百字文档比包含有5个搜索词的一千字文档相关性更高。两个预置的排序函数都采用了一个整型的标准化选项来定义文档长度是否影响排序及如何影响。这个整型选项控制多个行为,所以它是一个屏蔽字:可以使用|指定一个或多个行为(例如,2|4)。 0(缺省)表示:跟长度大小没有关系 1 表示:排名(rank)除以(文档长度的对数+1) 2表示:排名除以文档的长度 4表示:排名除以两个扩展词间的调和平均距离。只能使用ts_rank_cd实现 8表示:排名除以文档中单独词的数量 16表示:排名除以单独词数量的对数+1 32表示:排名除以排名本身+1 当指定多个标志位时,会按照所列的顺序依次进行转换。 需要特别注意的是,排序函数不使用任何全局信息,所以不可能产生一个某些情况下需要的1%或100%的理想标准值。标准化选项32 (rank/(rank+1))可用于所有规模的从零到一之间的排序。需要注意的是:这只是一个表面变化,并不会影响搜索结果的排序。 下面是一个例子,仅选择排名前十的匹配: 由于SQL_ASCII的数据库编码格式不支持中文字符,请在Encoding为UTF8/GBK的数据库中执行以下示例: 1 2 3 4 5 6 7 8 9 10 11 12 SELECT id, title, ts_rank_cd(to_tsvector(body), query) AS rank FROM tsearch.pgweb, to_tsquery('science') query WHERE query @@ to_tsvector(body) ORDER BY rank DESC LIMIT 10; id | title | rank ----+---------+------ 11 | Philology | .2 2 | Mathematics | .1 12 | Geography | .1 13 | Computer science | .1 (4 rows) 这是使用标准化排序的相同例子: 1 2 3 4 5 6 7 8 9 10 11 12 SELECT id, title, ts_rank_cd(to_tsvector(body), query, 32 /* rank/(rank+1) */ ) AS rank FROM tsearch.pgweb, to_tsquery('science') query WHERE query @@ to_tsvector(body) ORDER BY rank DESC LIMIT 10; id | title | rank ----+---------+---------- 11 | Philology | .166667 2 | Mathematics | .0909091 12 | Geography | .0909091 13 | Computer science | .0909091 (4 rows) 下面是使用中文分词法排序查询的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 CREATE TABLE tsearch.ts_zhparser(id int, body text); INSERT INTO tsearch.ts_zhparser VALUES(1, '排序'); INSERT INTO tsearch.ts_zhparser VALUES(2, '排序查询'); INSERT INTO tsearch.ts_zhparser VALUES(3, '查询排序'); --精确匹配 SELECT id, body, ts_rank_cd(to_tsvector('zhparser',body), query) AS rank FROM tsearch.ts_zhparser, to_tsquery('排序') query WHERE query @@ to_tsvector(body); id | body | rank ----+------+------ 1 | 排序 | .1 (1 row) --模糊匹配 SELECT id, body, ts_rank_cd(to_tsvector('zhparser',body), query) AS rank FROM tsearch.ts_zhparser, to_tsquery('排序') query WHERE query @@ to_tsvector('zhparser',body); id | body | rank ----+----------+------ 3 | 查询排序 | .1 1 | 排序 | .1 2 | 排序查询 | .1 (3 rows) 排序要遍历每个匹配的tsvector,因此资源消耗多,可能会因为I/O限制导致排序慢。可是这是很难避免的,因为实际查询中通常会有大量的匹配。 父主题: 控制文本搜索
  • 示例 建立一个hdfs_server,其中hdfs_fdw为数据库中存在的foreign data wrapper: 1 2 3 4 5 CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000', hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop', type 'HDFS' ) ; 建立一个obs_server,其中dfs_fdw为数据库中存在的foreign data wrapper: 1 2 3 4 5 6 CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( address 'obs.xxx.xxx.com', access_key 'xxxxxxxxx', secret_access_key 'yyyyyyyyyyyyy', type 'obs' ); 建立一个dli_server,其中dfs_fdw为数据库中存在的foreign data wrapper: 1 2 3 4 5 6 7 8 9 CREATE SERVER dli_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( address 'obs.xxx.xxx.com', access_key 'xxxxxxxxx', secret_access_key 'yyyyyyyyyyyyy', type 'dli', dli_address 'dli.xxx.xxx.com', dli_access_key 'xxxxxxxxx', dli_secret_access_key 'yyyyyyyyyyyyy' ); 建立另外一个同构集群的server,其中gc_fdw为数据库中存在的foreign data wrapper: 1 2 3 4 5 6 CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000', dbname 'test', username 'test', password 'xxxxxxxx' ); 建立一个FOREIGN DATA WRAPPER为dist_fdw的server,用于obs上文本数据的导入导出: 1 2 3 4 5 CREATE SERVER import_server FOREIGN DATA WRAPPER DIST_FDW OPTIONS ( access_key 'ak_string', secret_access_key 'sk_string' );
  • 参数说明 server_name 要创建的外部服务器的名称。服务器名称在数据库中必须唯一。 取值范围:长度必须小于等于63。 FOREIGN DATA WRAPPER fdw_name 指定外部数据封装器的名字。 取值范围:fdw_name是数据库初始化时系统创建的数据封装器,目前对于HDFS集群,fdw_name的名字可以是hdfs_fdw或者dfs_fdw;对于其他同构集群,fdw_name为gc_fdw;对于数据导入导出场景,GDS外表使用gsmpp_server,fdw_name为dist_fdw。 OPTIONS ( { option_name ' value ' } [, ...] ) 用于指定外部服务器的各类参数,详细的参数说明如下所示。 address 指定的OBS服务终端节点或HDFS集群的IP地址。 OBS:OBS服务的终端节点(Endpoint)。 HDFS:HDFS集群的元数据节点(NameNode)所在的IP地址以及端口,或者同构其他集群的CN的IP地址以及端口。 为保证HA(High Availability),HDFS NameNode经常采用主备模式。主备NameNode的地址都需要加入到address值中。GaussDB(DWS)访问HDFS服务时,会动态查找当前处于active状态的主NameNode。 若HDFS为联邦模式时,可将Router的地址都加入到address值中,GaussDB(DWS)访问HDFS服务时,会动态随机查找当前处于active状态的Router。 address option必须存在,若用于跨集群互联互通场景则只允许设置1个。 当server类型为 DLI 时,address为DLI服务上数据所存储的OBS address。 若HDFS为联邦模式时,即fed 'rbf',address可设置为多组IP、port,对应为HDFS Router的address。 hdfscfgpath 该参数仅支持type为HDFS时设置。 用户通过配置hdfscfgpath参数来指定HDFS配置文件路径。GaussDB(DWS)会根据配置文件路径下的HDFS配置文件指定的连接配置方式,以及安全模式,来访问HDFS集群。非安全模式连接HDFS集群时,不支持数据传输加密。 如果没有指定address选项,默认采用hdfscfgpath指定的配置文件中指定的address。 fed 表示dfs_fdw连接的是HDFS为联邦模式。 取值rbf,表示HDFS为联邦rbf方式。 该参数8.1.2及以上版本支持。 encrypt 是否对数据进行加密,该参数仅支持type为OBS时设置。默认值为off。 取值范围: on表示对数据进行加密。 off表示不对数据进行加密。 access_key OBS访问协议对应的AK值(OBS云服务界面由用户获取),创建外表时AK值会保存到数据库的元数据表中。 FOREIGN DATA WRAPPER 为dfs_fdw时,仅支持type为OBS时设置。 8.2.0及以上版本集群,支持FOREIGN DATA WRAPPER为dist_fdw时指定该参数。 secret_access_key OBS访问协议对应的SK值(OBS云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。 FOREIGN DATA WRAPPER 为dfs_fdw时,仅支持type为OBS时设置。 8.2.0及以上集群版本,支持FOREIGN DATA WRAPPER为dist_fdw时指定该参数。 security_token 对应 统一身份认证 服务 IAM 中临时安全凭证的SecurityToken的值,与临时AK、SK共同组成临时安全凭证,临时安全凭证有效期不超过24小时。该参数仅8.2.0及以上集群版本支持。 FOREIGN DATA WRAPPER 为dfs_fdw时,仅支持type为OBS时设置。 8.2.0及以上集群版本,支持FOREIGN DATA WRAPPER为dist_fdw时指定该参数。 使用该参数时,access_key和secret_access_key参数分别对应临时AK、SK。 type 表示dfs_fdw连接的类型。 取值范围: OBS表示连接的是OBS。 HDFS表示连接的是HDFS。 DLI表示连接的是DLI。 dli_address DLI服务的终端节点,即endpoint。该参数仅支持type为DLI时设置。 dli_access_key DLI访问协议对应的AK值(DLI云服务界面由用户获取),创建外表时AK值会保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 dli_secret_access_key DLI访问协议对应的SK值(DLI云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 dbname 用于协同分析、跨集群互联互通,表示将要连接的远端集群的数据库名字。 username 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名。 password 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名密码。 对于云下集群迁移到云上的场景,从云下集群导出的server配置中密码为密文,由于云上和云下集群加解密的密钥不同,如果直接在云上集群执行导出时的CREATE SERVER,会执行失败,报解密失败的错误。这种场景下需要将CREATE SERVER中的password手动修改成明文进行配置。 syncsrv 仅用于跨集群互联互通,表示数据同步过程中使用到的GDS服务,设置方式与GDS外表的location属性相同。
  • 示例 定义函数为SQL查询: 1 2 3 4 5 CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; 利用参数名用 PL/pgSQL 自增一个整数: 1 2 3 4 5 CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql; 返回RECORD类型: 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint) returns SETOF RECORD as $$ begin result_1 = i + 1; result_2 = i * 10; return next; end; $$language plpgsql; 返回一个包含多个输出参数的记录: 1 2 3 4 CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text) AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$ LANGUAGE SQL; SELECT * FROM func_dup_sql(42); 计算两个整数的和,并返回结果。若果输入为null,则返回null: 1 2 3 4 5 6 CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer AS BEGIN RETURN num1 + num2; END; / 创建package属性的重载函数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CREATE OR REPLACE FUNCTION package_func_overload(col int, col2 int) return integer package as declare col_type text; begin col := 122; dbms_output.put_line('two int parameters ' || col2); return 0; end; / CREATE OR REPLACE FUNCTION package_func_overload(col int, col2 smallint) return integer package as declare col_type text; begin col := 122; dbms_output.put_line('two smallint parameters ' || col2); return 0; end; /
  • 参数说明 function_name 要创建的函数名字(可以用模式修饰)。 取值范围:字符串,要符合标识符的命名规范。 如果创建的函数名与系统函数同名,建议指定schema。调用自定义函数时需指定schema,否则系统会优先调用系统函数。 argname 函数参数的名字。 取值范围:字符串,要符合标识符的命名规范。 argmode 函数参数的模式。 取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。 VARIADIC用于声明数组类型的参数。 argtype 函数参数的类型。 expression 函数参数的默认表达式。 rettype 函数返回值的数据类型。 如果存在OUT或IN OUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。 SETOF修饰词表示该函数将返回一个集合,而不是单独一项。 DETERMINISTIC 为适配Oracle SQL语法,未实现功能,不推荐使用。 column_name 字段名称。 column_type 字段类型。 definition 一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名字、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。 LANGUAGE lang_name 用以实现函数的语言的名字。可以是SQL,internal,或者是用户定义的过程语言名字。为了保证向下兼容,该名字可以用单引号(包围)。若采用单引号,则引号内必须为大写。 WINDOW 表示该函数是窗口函数,替换函数定义时不能改变WINDOW属性。 自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 如果函数的入参是常量,会在优化器阶段计算该函数的值。益处是可以尽早获取表达式的值,从而能更准确的进行代价估算,生成的执行计划也更优。 用户自定义的IMMUTABLE的函数是会被自动下推到DN执行的,但是这样可能有潜在的风险,即如果用户错误定义了函数的IMMUTABLE属性,但是函数执行的过程并不是IMMUTABLE的,那么可能会导致结果错误等严重问题。因此,用户在指定函数的属性为IMMUTABLE的时候,要特别慎重。 举例如下: 如果自定义函数中引用了表,视图等对象,那么该函数就不能定义为IMMUTABLE,因为当表的数据发生变化的时候,函数的返回值可能发生变化。 如果自定义函数中引用了STABLE/VOLATILE类型的函数,那么该函数不能定义为IMMUTABLE。 如果自定义函数中有不下推的因素,则该函数不能定义成IMMUTABLE,因为IMMUTABLE意味着要下推到DN执行,与函数内部的不下推因素相互冲突。典型场景例如,包含不下推的函数、语法等。 如果自定义函数中含有聚合运算,但聚合运算的运算需要生成STREAM计划才能完成计算的(部分结果在DN计算,部分结果在CN计算,例如listagg函数等)。 同时,为了防止这种情况下可能出现严重问题,数据库内部可以通过设置behavior_compat_options=‘check_function_conflicts’来开启对函数定义冲突的检查,目前可以识别出上述1和2场景。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 VOLATILE 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 SHIPPABLE NOT SHIPPABLE 表示该函数是否可以下推到DN上执行。 对于IMMUTABLE类型的函数,函数始终可以下推到DN上执行。 对于STABLE/VOLATILE类型的函数,仅当函数的属性是SHIPPABLE的时候,函数可以下推到DN执行。 用户在定义函数的SHIPPABLE属性时也需特别慎重,SHIPPABLE意味着整个函数会下推到DN上执行,如果设置不当,会导致结果错误等严重问题。 与定义IMMUTABLE属性一样,SHIPPABLE属性的定义也有诸多约束,简单来说就是函数内部不能有不可下推的因素,函数下推到单DN执行后,函数内部的计算逻辑仅依赖当前DN的数据集合。 举例如下: 如果函数内部引用了表,并且表为HASH分布,那么该函数通常不能定义为SHIPPABLE。 函数内部有不可下推的因素,函数,语法等,那么该函数不能定义为SHIPPABLE,可参考语句下推调优。 函数内部的计算过程可能需要跨DN数据,这种情况该函数通常不能定义为SHIPPABLE,例如一些聚合运算等。 PACKAGE 表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对Oracle风格的函数。 不允许package函数和非package函数重载或者替换。 package函数不支持VARIADIC类型的参数。 不允许修改函数的package属性。 LEAKPROOF 指出该函数的参数只包括返回值。LEAKPROOF只能由系统管理员设置。 CALLED ON NULL INPUT 表明该函数的某些参数是NULL的时候可以按照正常的方式调用。该参数可以省略。 RETURNS NULL ON NULL INPUT STRICT STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。 RETURNS NULL ON NULL INPUT和STRICT的功能相同。 EXTERNAL 目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。 SECURITY INVOKER AUTHID CURRENT_USER 表明该函数将带着调用它的用户的权限执行。该参数可以省略。 SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。 SECURITY DEFINER AUTHID DEFINER 声明该函数将以创建它的用户的权限执行。 AUTHID DEFINER和SECURITY DEFINER的功能相同。 FENCED NOT FENCED 该函数只对用户定义的C函数生效,声明函数是在保护模式还是非保护模式下执行。如果函数声明为NOT FENCED模式,则函数的执行在CN或者DN进程中进行。如果函数声明为FENCED模式,则函数在新fork的进程执行,这样函数的异常不会影响CN或者DN进程。 FENCED/NOT FENCED模式的选择: 正在开发或者调试的Function使用FENCED模式。开发测试完成,使用NOT FENCED模式执行,减少fork进程以及通信的开销。 复杂的操作系统操作,例:打开文件,信号处理,线程处理等操作,使用FENCED模式。否则可能影响GaussDB(DWS)数据库的执行。 默认值为FENCED。 COST execution_cost 用来估计函数的执行成本。 execution_cost以cpu_operator_cost为单位。 取值范围:正数 ROWS result_rows 估计函数返回的行数。用于函数返回的是一个集合。 取值范围:正数,默认值是1000行。 configuration_parameter value 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 取值范围:字符串 DEFAULT OFF RESET 指定默认值。 from current 取当前会话中的值设置为configuration_parameter的值。 plsql_body PL/SQL存储过程体。 当在函数中创建用户时,日志中会记录密码的明文。因此不建议用户在函数中创建用户。
  • 语法格式 兼容PostgreSQL风格的创建自定义函数语法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] ) [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )] LANGUAGE lang_name [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | WINDOW | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} | {FENCED | NOT FENCED} | {PACKAGE} | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT }} ][...] { AS 'definition' | AS 'obj_file', 'link_symbol' } Oracle风格的创建自定义函数的语法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] ) RETURN rettype [ DETERMINISTIC ] [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | {PACKAGE} | {FENCED | NOT FENCED} | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER } | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT ][...] { IS | AS } plsql_body /
  • 注意事项 如果创建函数时参数或返回值带有精度,不进行精度检测。 创建函数时,函数定义中对表对象的操作建议都显式指定模式,否则可能会导致函数执行异常。 在创建函数时,函数内部通过SET语句设置current_schema和search_path无效。执行完函数search_path和current_schema与执行函数前的search_path和current_schema保持一致。 如果函数参数中带有出参,SELECT调用函数必须缺省出参,CALL调用函数适配Oracle必须指定出参,对于调用重载的带有PACKAGE属性的函数,CALL调用函数可以缺省出参,具体信息参见CALL的示例。 兼容PostgreSQL风格的函数或者带有PACKAGE属性的函数支持重载。在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有函数,而是会建立新的函数。 SELECT调用可以指定不同参数来进行同名函数调用。由于语法CALL适配自Oracle,因此不支持调用不带有PACKAGE属性的同名函数。 在创建function时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 在非逻辑集群模式下,暂不支持将返回值、参数以及变量设置为建在非系统默认安装Node Group的表,sql function内部语句暂不支持对建在非系统默认安装Node Group的表操作。 在逻辑集群模式下,如果函数返回值和参数是用户表类型,所有涉及表都必须在同一逻辑集群内;如果函数内部涉及对多个逻辑集群表操作,函数定义时不能为IMMUTABLE和SHIPPABLE类型,以避免函数被下推到DN执行。 在逻辑集群模式下,函数参数、返回值不能用%type引用表字段类型,否则会导致函数创建失败。 新创建的函数默认会给PUBLIC授予执行权限(详见GRANT)。用户可以选择收回PUBLIC默认执行权限,然后根据需要将执行权限授予其他用户,为了避免出现新函数能被所有人访问的时间窗口,应在一个事务中创建函数并且设置函数执行权限。 在多个CN的集群中,不能将函数的入参或出参设置为临时表类型,因为在非当前连接CN上执行创建函数过程中,无法单独根据表名获取到正确的临时schema,进而无法获取到准确的表类型。
  • 示例 DISCARD操作后,清理当前会话中所有volatile临时表相关资源。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATE VOLATILE TEMP TABLE TX1(A INT) DISTRIBUTE BY HASH(A); CREATE TABLE CREATE VOLATILE TEMP TABLE TX2(A INT) DISTRIBUTE BY HASH(A); CREATE TABLE SELECT * FROM TX1; a --- (0 rows) SELECT * FROM TX2; a --- (0 rows) DISCARD VOLATILE TEMP; DISCARD VOLATILE TEMP SELECT * FROM TX1; ERROR: relation "tx1" does not exist LINE 1: SELECT * FROM TX1; ^ SELECT * FROM TX2; ERROR: relation "tx2" does not exist LINE 1: SELECT * FROM TX2;
  • pg_xlog_replay_completion() 描述:显示当前DN上xlog redo的进度信息。 返回值类型:record 示例: 1 2 3 4 5 SELECT * FROM pg_xlog_replay_completion(); replay_start | replay_current | replay_end | replay_percent --------------+----------------+------------+---------------- 0/2ACAB80 | 0/2B16530 | 0/4F62B090 | 0% (1 row) 函数返回信息如下: 表1 pg_xlog_replay_completion()字段 名称 类型 描述 replay_start integer Xlog Redo的起始LSN replay_current integer Xlog Redo的当前replay的LSN replay_end integer 最大的需要Xlog Redo的LSN replay_percent integer Xlog Redo的当前完成的百分比
  • pg_data_sync_from_dummy_completion() 描述:显示当前DN上Failover过程中数据页文件同步的进度信息。 返回值类型:record 示例: 1 2 3 4 5 SELECT * FROM pg_data_sync_from_dummy_completion(); start_index | current_index | total_index | sync_percent -------------+---------------+-------------+-------------- 0 | 0 | 0 | 100% (1 row) 函数返回信息如下: 表2 pg_data_sync_from_dummy_completion()字段 名称 类型 描述 start_index integer 数据页文件同步的起始编号 current_index integer 数据页文件同步的当前编号 total_index integer 数据页文件同步的最大编号 sync_percent integer 数据页文件当前完成的百分比
  • pg_last_xlog_replay_location() 描述:获取最后一个事务日志在恢复时重放的位置。如果恢复仍在进行,事务日志将持续递增。如果已经完成恢复,则将保持在恢复期间最后接收WAL记录的值。如果未进行恢复但服务器正常启动时,则这个函数返回NULL。 返回值类型:text 示例: 1 2 3 4 5 SELECT pg_last_xlog_replay_location(); pg_last_xlog_replay_location ------------------------------ 0/2B16530 (1 row)
  • pg_last_xact_replay_timestamp() 描述:获取最后一个事务在恢复时重放的时间戳。这是为在主节点上生成事务提交或终止WAL记录的时间。如果在恢复时没有事务重放,则这个函数返回NULL。否则,如果恢复仍在进行,则事务日志将持续递增。如果恢复已经完成,则将保持在恢复期间最后接收WAL记录的值。如果服务器无需恢复就已正常启动,则这个函数返回NULL。 返回值类型:timestamp with time zone 恢复控制函数控制恢复的进程。这些函数可能只在恢复时被执行。 示例: 1 2 3 4 5 SELECT pg_last_xact_replay_timestamp(); pg_last_xact_replay_timestamp ------------------------------- 2023-01-04 07:03:08.098024+00 (1 row)
  • pg_last_xlog_receive_location() 描述:获取最后接收事务日志的位置并通过流媒体复制同步到磁盘。在流复制仍在进行,事务日志将持续递增。如果恢复已完成,则这个值将保持最后接收事务记录的状态并在恢复期间同步到磁盘。如果不能用流复制,或还没有开始,这个函数返回NULL。 返回值类型:text 示例: 1 2 3 4 5 SELECT pg_last_xlog_receive_location(); pg_last_xlog_receive_location ------------------------------- (1 row)
  • pg_xlog_replay_resume() 描述:如果恢复处于暂停状态,则重新启动。 当恢复暂停时,没有发生数据库更改。如果是在热备里,所有新的查询将看到一致的数据库快照,并且不会有进一步的查询冲突产生,直到恢复继续。 如果不能使用流复制,则暂停状态将无限的延续。当流复制正在进行时,将连续接收WAL记录,最终将填满可用磁盘空间,这个进度取决于暂停的持续时间,WAL生成的速度和可用的磁盘空间。 返回值类型:void
  • RoaringBitmap类型 GaussDB(DWS)自8.1.3集群版本开始,支持RoaringBitmap数据类型,用于存储位图数据集。 roaringbitmap数据类型支持行存,列存表。 表1 RoaringBitmap类型 名字 存储容量 描述 范围 RoaringBitmap 32 字节 存储位图数据集 -2,147,483,648~2,147,483,647 示例:创建带有roaringbitmap数据类型的表。 1 2 CREATE TABLE r_row (a int ,b text, c roaringbitmap); CREATE TABLE r_col (a int ,b text, c roaringbitmap) with (orientation=column); 父主题: 数据类型
共100000条