华为云用户手册

  • json_object(text[])、json_object(text[], text[]) 描述:从一个文本数组构造一个object-json。这是个重载函数,当入参为一个文本数组的时候,其数组长度必须为偶数,数组内的成员被当作交替出现的键值对。两个文本数组的时候,第一个数组认为是键,第二个认为是值,两个数组长度必须相等。键值不可为NULL。 返回类型:object-json 示例: gaussdb=# SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); json_object ------------------------------------------------------- {"a" : "1", "b" : "2", "3" : null, "d e f" : "a b c"} (1 row) gaussdb=# SELECT json_object('{a,b,"a b c"}', '{a,1,1}'); json_object --------------------------------------- {"a" : "a", "b" : "1", "a b c" : "1"} (1 row)
  • json_array([VARIADIC "any"]) 描述:从一个可变参数列表构造出一个数组,并返回数组形式的json。如果该函数没有任何参数,则返回一个空的数组形式的json。 参数:入参为可变参数列表,这些列表中的值可以是任意类型。 返回类型:json 示例: --不输入入参,返回一个空的数组形式的json gaussdb=# SELECT json_array(); json_array ------------ [] (1 row) --入参可以是任意类型 gaussdb=# SELECT json_array(TRUE, FALSE, NULL, 114, 'text', current_timestamp); json_array ------------------------------------------------------------------- [true, false, null, 114, "text", "2023-08-12 15:17:34.979294+08"] (1 row)
  • jsonb_build_object( [VARIADIC "any"] ) 描述:从一个可变参数列表构造出一个JSONB对象,其入参必须为偶数个,两两一组组成键值对。注意键值不可为NULL。 返回类型:object-jsonb 当可变参数列表的元素存在空字符串('')时,若数据库SQL兼容模式为A,则对应的元素位置返回结果为NULL;若数据库SQL兼容模式为PG, 则对应的元素位置返回结果为空字符串。这是因为A兼容模式时空字符串作为NULL处理。 当可变参数列表的元素存在DATE类型时,若数据库SQL兼容模式为A,则对应的元素位置返回结果包含时分秒;若数据库SQL兼容模式为PG, 则对应的元素位置返回结果不包含时分秒。这是因为A兼容模式DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。 示例: gaussdb=# SELECT jsonb_build_object('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}'); jsonb_build_object ------------------------------------------------------------------------- {"a": 1, "b": 1.2, "c": true, "d": null, "e": {"x": 3, "y": [1, 2, 3]}} (1 row) gaussdb=# SELECT jsonb_build_object(); jsonb_build_object -------------------- {} (1 row)
  • json_object([VARIADIC "any"] ) 描述:从一个可变参数列表构造出一个json对象,其入参必须为偶数个,两两一组组成键值对。键值为null报错;参数格式为奇数报错。 参数:可变参数列表,入参是一个或多个成对的key-value的组合。 返回类型:json 示例: gaussdb=# SELECT json_object('d',2,'c','name','b',true,'a',2,'a',NULL,'d',1); json_object ------------------------------------------ {"a": 2, "b": true, "c": "name", "d": 2} (1 row) gaussdb=# SELECT json_object('d',2,true,'name','b',true,'a',2,'aa', current_timestamp); json_object ------------------------------------------------------------------------------ {"1": "name", "a": 2, "b": true, "d": 2, "aa": "2023-08-12 11:28:13.385958"} (1 row) 此函数在B模式数据库中,且GUC参数 b_format_version = '5.7'和b_format_dev_version = 's1'时生效,生效时会替换原有json_object行为。
  • json_contains(target_json, candidate_json[, json_path]) 描述:入参为两个json对象和一个可选的json_path路径。如果不选定json路径,则判断target_json是否包含了candidate_json。如果选定路径,则在target_json指定路径json_path指向的json中,判断是否包含candidate_json。json和json_path路径中有null值返回null,如果json格式错误或者json_path不是有效的路径表达式或者json_path包含“*”、“**”会报错。如果有null值和格式错误场景同时在可变参数列表中,则按异常的先后顺序处理,先有null值返回null,先有报错则报错。 参数:请参见表3。 表3 参数说明 参数名称 类型 描述 取值范围 target_json json 目标json对象,需要判断candidate_json是否被该json包含。 必须满足json的格式。 candidate_json json json子对象,需要判断是否被target_json包含。 必须满足json的格式。 json_path text 可选参数,指定json的路径json_path。如果指定,则使用target_json的json_path指定路径判断包含关系。 json_path必须是一个有效的路径表达式。 返回类型:bigint类型,如果包含关系返回1,如果不包含返回0。 示例: --不指定路径 gaussdb=# SELECT json_contains('[1, 2, {"x": 3}]', '{"x":3}'); json_contains --------------- 1 (1 row) --指定路径 gaussdb=# SELECT json_contains('[1, 2, {"x": 3},[1,2,3,4]]', '2','$[1]'); json_contains --------------- 1 (1 row) gaussdb=# SELECT json_contains('[1, 2, {"x": 3},[1,2,3,4]]', '1','$[1]'); json_contains --------------- 0 (1 row)
  • json_append/json_array_append(json, [VARIADIC "any"]) 描述:接受一个json入参和一个可变参数列表。从一个可变参数列表构造出若干对json_path和value对,向json类型中指定的路径追加一个值,并返回修改后的json。json_append与json_array_append完全一致。如果有任何参数为null返回null,如果json格式错误或者json_path不是有效的路径表达式或者json_path包含“*”、“**”会报错。如果有null值和格式错误场景同时在可变参数列表中,则按异常的先后顺序处理,先有null值返回null,先有报错则报错。 参数:第一个入参必须为符合格式的json,第二个入参为可变的参数列表,json_path-value对将从可变参数列表中构造。详情请参见表1。 表1 参数说明 参数名称 类型 描述 取值范围 json json 需要被修改的json值。 符合json格式。 [VARIADIC "any"] 可变any数组 可变参数列表,包含可变json_path-value数量。 json_path必须是一个有效的路径表达式,value可以是任意值。 返回类型:json 示例: gaussdb=# SELECT json_array_append('[1, [2, 3]]', '$[1]', 4, '$[0]', false, '$[0]', null, '$[0]', current_timestamp); json_array_append ---------------------------------------------------------------- [[1, false, null, "2023-08-12 14:27:16.142355+08"], [2, 3, 4]] (1 row)
  • json_array_insert(json, [VARIADIC "any"]) 描述:从一个可变参数列表中,构造一个或者多个json_path和value的路径-值对,向json中的json_path指定数组路径插入一个值value并返回新的json。如果指定的路径上有值,则在该路径上插入,并将已存在的值后移。json和json_path路径中有null值返回null,如果json格式错误或者json_path不是有效的路径表达式或者json_path包含“*”、“**”会报错。如果有null值和格式错误场景同时在可变参数列表中,则按异常的先后顺序处理,先有null值返回null,先有报错则报错。 参数:请参见表2。 表2 参数说明 参数名称 类型 描述 取值范围 json json 需要修改的json值。 必须满足json的格式。 [VARIADIC "any"] 可变any数组 可变参数列表,可以支持一个或多个json_path-value对。 json_path必须是一个有效的路径表达式,value可以是任意值。 返回类型:json 示例: --一对json_path-value用例 gaussdb=# SELECT json_array_insert('[1, [2, 3]]', '$[1]', 4); json_array_insert ------------------- [1, 4, [2, 3]] (1 row) --多个json_path-value用例 gaussdb=# SELECT json_array_insert('{"x": 1, "y": [1, 2]}', '$.y[0]', NULL, '$.y[0]', 123, '$.y[3]', current_timestamp); json_array_insert ------------------------------------------------------------------ {"x": 1, "y": [123, null, 1, "2023-08-14 14:54:12.85087+08", 2]} (1 row)
  • json_contains_path(json, mode_str, [VARIADIC text]) 描述:该函数用于检查一个json对象在指定的路径上是否有值,这个路径可以是多个。第一个入参为json对象,第二个入参为字符串“one”或者字符串“all”,它指示是否检查所有的路径。第三个入参为一个可变参数列表,所有的json_path路径将会从这个可变可变参数列表中构造。如果路径根据模式判断存在返回1,如果不存在返回0。json和json_path路径中有null值返回null, 如果json格式错误或者json_path不是有效的路径表达式则会报错。如果有null值和格式错误场景同时在可变参数列表中,则按异常的先后顺序处理,先有null值返回null,先有报错则报错。 参数:请参见表4。 表4 参数说明 参数名称 类型 描述 取值范围 json json 需要传入的json对象。 必须满足json的格式。 mode_str text 字符串“one”或者“all”,如果是“one”,其中一个路径存在返回1,否则返回0;如果是“all”,所有路径存在返回1,否则返回0。 必须为字符串“one”或者“all”,不区分大小写。 [VARIADIC text] 可变text数组 可变参数列表,从此列表中构造所有的json_path路径。 json_path必须为有效的路径表达式。 返回类型:bigint类型 示例: --all场景,需要所有路径都存在 gaussdb=# SELECT json_contains_path('[1, 2, {"x": 3}]', 'all', '$[0]', '$[1]', '$[2]'); json_contains_path -------------------- 1 (1 row) gaussdb=# SELECT json_contains_path('[1, 2, {"x": 3}]', 'all', '$[0]', '$[1]', '$[6]'); json_contains_path -------------------- 0 (1 row) --one场景,其中一个路径存在即可 gaussdb=# SELECT json_contains_path('[1, 2, {"x": 3}]', 'one', '$[0]', '$[1]', '$[5]'); json_contains_path -------------------- 1 (1 row)
  • row_to_json(record [, pretty_bool]) 描述:返回JSON类型的行。如果pretty_bool为true,将在第一级元素之间添加换行符。 返回类型:json 示例: gaussdb=# SELECT row_to_json(row(1,'foo')); row_to_json --------------------- {"f1":1,"f2":"foo"} (1 row)
  • json_object_keys(object-json)、jsonb_object_keys(object-jsonb) 描述:返回对象中顶层的所有键。 返回类型:SETOF text 示例: gaussdb=# SELECT json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}, "f1":"abcd"}'); json_object_keys ------------------ f1 f2 f1 (3 rows)
  • json_populate_record(anyelement, object-json [, bool])、jsonb_populate_record(anyelement, object-jsonb [, bool]) 描述:参数一必须是一个复合类型的参数。将会把object-json里的每个对键值进行拆分,以键当做列名,与参数一中的列名进行匹配查找,并填充到参数一的格式中。 返回类型:anyelement、anyelement 示例: gaussdb=# CREATE TYPE jpop AS (a text, b int, c bool); CREATE TYPE gaussdb=# SELECT * FROM json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}'); a | b | c --------+---+--- blurfl | | (1 row) gaussdb=# SELECT * FROM json_populate_record((1,1,null)::jpop,'{"a":"blurfl","x":43.2}'); a | b | c --------+---+--- blurfl | 1 | (1 row) gaussdb=# DROP TYPE jpop; DROP TYPE
  • array_to_json(anyarray [, pretty_bool]) 描述:返回JSON类型的数组。将一个多维数组转换为一个JSON数组。如果pretty_bool为true,将在一维元素之间添加换行符。 返回类型:json 示例: gaussdb=# SELECT array_to_json('{{1,5},{99,100}}'::int[]); array_to_json ------------------ [[1,5],[99,100]] (1 row)
  • json_array_elements_text(array-json)、jsonb_array_elements_text(array-jsonb) 描述:拆分数组,每一个元素返回一行。 返回类型:text、text 示例: gaussdb=# SELECT * FROM json_array_elements_text('[1,true,[1,[2,3]],null]'); value ----------- 1 true [1,[2,3]] (4 rows)
  • json_array_length(array-json)、jsonb_array_length(array-jsonb) 描述:返回数组长度。 返回类型:integer 示例: gaussdb=# SELECT json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4,null]'); json_array_length ------------------- 6 (1 row)
  • json_populate_record_set(anyelement, array-json [, bool])、jsonb_populate_record_set(anyelement, array-jsonb [, bool]) 描述:参考上述函数json_populate_record、jsonb_populate_record,对参数二数组的每一个元素进行上述参数函数的操作,因此这也要求第二个参数数组的每个元素都是object-json类型的。 返回类型:setof anyelement、setof anyelement 示例: gaussdb=# CREATE TYPE jpop AS (a text, b int, c bool); CREATE TYPE gaussdb=# SELECT * FROM json_populate_recordset(null::jpop, '[{"a":1,"b":2},{"a":3,"b":4}]'); a | b | c ---+---+--- 1 | 2 | 3 | 4 | (2 rows) gaussdb=# DROP TYPE jpop; DROP TYPE
  • json_typeof(json)、jsonb_typeof(jsonb) 描述:检测json类型 返回类型:text、text 示例: gaussdb=# SELECT value, json_typeof(value) FROM (values (json '123.4'), (json '"foo"'), (json 'true'), (json 'null'), (json '[1, 2, 3]'), (json '{"x":"foo", "y":123}'), (NULL::json)) AS data(value); value | json_typeof ----------------------+------------- 123.4 | number "foo" | string true | boolean null | null [1, 2, 3] | array {"x":"foo", "y":123} | object | (7 rows)
  • json_build_array( [VARIADIC "any"] ) 描述:从一个可变参数列表构造出一个JSON数组。 返回类型:array-json 示例: gaussdb=# SELECT json_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}',''); json_build_array ----------------------------------------------------------------------------- ["a", 1, "b", 1.2, "c", true, "d", null, "e", {"x": 3, "y": [1,2,3]}, null] (1 row)
  • json_build_object( [VARIADIC "any"] ) 描述:从一个可变参数列表构造出一个JSON对象,其入参必须为偶数个,两两一组组成键值对。注意键不可为null。 返回类型:object-json 示例: gaussdb=# SELECT json_build_object(1,2); json_build_object ------------------- {"1" : 2} (1 row)
  • json_array_elements(array-json)、jsonb_array_elements(array-jsonb) 描述:拆分数组,每一个元素返回一行。 返回类型:json、jsonb 示例: gaussdb=# SELECT json_array_elements('[1,true,[1,[2,3]],null]'); json_array_elements --------------------- 1 true [1,[2,3]] null (4 rows)
  • json_each_text(object-json)、jsonb_each_text(object-jsonb) 描述:将对象的每个键值对拆分转换成一行两列。 返回类型:setof(key text, value text)、setof(key text, value text) 示例: gaussdb=# SELECT * FROM json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); key | value -----+---------- f1 | [1,2,3] f2 | {"f3":1} f4 | (3 rows)
  • json_each(object-json)、jsonb_each(object-jsonb) 描述:将对象的每个键值对拆分转换成一行两列。 返回类型:setof(key text, value json)、setof(key text, value jsonb) 示例: gaussdb=# SELECT * FROM json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); key | value -----+---------- f1 | [1,2,3] f2 | {"f3":1} f4 | null (3 rows)
  • 聚集函数嵌套 描述:对聚集函数分组计算的结果再进行一次聚集函数操作。 一般可描述为: SELECT AGG1(AGG2(column_name1)) FROM table_name GROUP BY column_name2; 等价为: SELECT AGG1(value) FROM (SELECT AGG2(column_name1) value FROM table_name GROUP BY column_name2); 其中: AGG1():表示外层聚集函数。 AGG2():表示内层聚集函数。 table_name:表示表名。 column_name1、column_name2:表示列名。 value:表示内层聚集函数结果的别名。 整体含义可描述为:将内层聚集函数AGG2()分组计算的结果作为外层聚集函数AGG1()的输入再计算一次。 嵌套的聚集函数应位于SELECT和FROM之间,否则无意义。 使用嵌套聚集函数的SELECT语句应包含GROUP BY子句。 与嵌套聚集函数同时被SELECT的,应同为嵌套聚集函数,或为常量表达式。 聚集函数仅支持一次聚集函数嵌套操作。 当前支持以下聚集函数之间的嵌套:avg、max、min、sum、var_pop、var_samp、variance、stddev_pop、stddev_samp、stddev、median、regr_sxx、regr_syy、regr_sxy、regr_avgx、regr_avgy、regr_r2、regr_slope、regr_intercept、covar_pop、covar_samp、corr和listagg。 内层聚集函数的返回结果类型应符合外层聚集函数的参数类型。 示例: gaussdb=# CREATE TABLE test1 (id INT,val INT); CREATE TABLE gaussdb=# INSERT INTO test1 VALUES (1, 1); INSERT 0 1 gaussdb=# INSERT INTO test1 VALUES (1, null); INSERT 0 1 gaussdb=# INSERT INTO test1 VALUES (2, 10); INSERT 0 1 gaussdb=# INSERT INTO test1 VALUES (2, 55); INSERT 0 1 gaussdb=# SELECT SUM(MIN(val)) FROM test1 GROUP BY id; sum ----- 11 (1 row) gaussdb=# DROP TABLE test1; DROP TABLE 父主题: 聚集函数
  • SNAPSHOT.SNAP_QUERY SNAP_QUERY表记录所有存储的WDR Snapshot中的SQL语句信息,在WDR Snapshot启动后(即GUC参数enable_wdr_snapshot值为on时)会触发创建该表,如表1所示。 表1 SNAP_QUERY字段 名称 类型 描述 snap_node_name name 节点名称。 snap_node_id integer 节点的id,当前版本该值为0。 snap_user_name name 用户名称,若查询时执行query语句的用户已不存在,则显示为*REMOVED_USER*。 snap_user_id oid 用户OID。 snap_unique_sql_id bigint 归一化的SQL id。 snap_query text 归一化的SQL。 备注:长度受GUC参数track_activity_query_size控制。 snap_last_updated timestamp with time zone 最后一次更新该语句的时间。 snap_parent_unique_sql_id bigint 父语句的unique_sql_id,非存储过程子语句该值为0。 snap_db_name name 连接后端的数据库名称,若查询时执行query语句的数据库已不存在,则显示为*REMOVED_DB*。 snap_db_id db_id 连接后端的数据库OID。 父主题: WDR Snapshot原信息
  • || 描述:可代表hll_add, hll_union, hll_add_rev三个函数的功能。 返回值类型:hll 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 --hll_add gaussdb=# SELECT hll_empty() || hll_hash_integer(1); ?column? ---------------------------------------------------------------------------- \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 (1 row) --hll_add_rev gaussdb=# SELECT hll_hash_integer(1) || hll_empty(); ?column? ---------------------------------------------------------------------------- \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 (1 row) --hll_union gaussdb=# SELECT (hll_empty() || hll_hash_integer(1)) || (hll_empty() || hll_hash_integer(2)); ?column? -------------------------------------------------------------------------------------------- \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00 (1 row)
  • = 描述:比较hll或hll_hashval的值是否相等。 返回值类型:bool 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 --hll gaussdb=# SELECT (hll_empty() || hll_hash_integer(1)) = (hll_empty() || hll_hash_integer(1)); column ---------- t (1 row) --hll_hashval gaussdb=# SELECT hll_hash_integer(1) = hll_hash_integer(1); ?column? ---------- t (1 row)
  • 审视计划跳变场景 优化器生成计划的方式是基于代价完成的(Cost Based Optimizer),其会根据代价模型和相关表的统计信息生成最优的执行计划。因此,相关表的统计信息变更或代价模型的参数修改都会影响最优计划的生成。此外,生产业务的许多操作均会导致计划缓存失效并重建,如更新统计信息的相关操作(VACUUM、ANALYZE、AUTOVACUUM、AUTOANALYZE)、重建索引等DDL操作、施加SQL Patch和其他导致缓存失效的场景。如果期间基于代价生成的最优计划与之前不同,就会发生计划跳变。故计划跳变在生产业务中是一种较为常见的现象。 一般而言,正向的计划跳变无需重点关注。需要重点关注因计划跳变导致性能下降、CPU冲高等一系列后果的场景。这通常伴随着数据库环境变量变更,如统计信息更新,表结构变更或数据库版本升级。 在 GaussDB 中,有如下几类场景可能导致计划跳变,需要业务审视并应用精准的调优手段(Hint等)。 Generic-Plan的重建:业务稳定运行时通常执行的是Generic-Plan,表示计划已经稳定不再需要优化器对SQL进行优化。而有些情况会导致Generic-Plan失效需要重新构建: 修改GUC参数:修改GUC参数会导致Generic-Plan的重建,而修改优化器相关参数如query_dop等会导致计划跳变。稳定业务非特殊需求应尽量避免修改优化器相关参数。 对查询中涉及的基表进行了DDL操作:对表的DDL操作会导致Generic-Plan的重建,而对索引进行增删改会影响计划选择。若对索引进行调优需要保证索引有效性且及时更新索引统计信息保证选择更优的计划。 对表进行IUD操作并手动或自动收集统计信息:统计信息的变化会导致Generic-Plan的重建。一般认为若统计信息收集及时,即使计划跳变通常不会引入性能劣化。业务中常见情况是对于查询中涉及的基表进行大量IUD而统计信息未及时更新,此时需要手动收集统计信息或审视自动收集统计信息的触发情况。 智能优化器:Generic-Plan在部分场景中并不能满足业务需求,例如数据倾斜的场景,对于不同的数据最优计划不同。而智能优化器会生成多个备选的Generic-Plan并实时根据查询反馈决策挑选其中最优的计划执行。智能优化器和业务执行的顺序有关,若智能优化器不能满足要求,建议对关键业务语句使用Hint或SQL Patch等手段进行针对性调优。 父主题: SQL调优指南
  • has_database_privilege(database, privilege) 描述:当前用户是否有访问数据库的权限,合法参数类型请参见表5。non-PDB下不支持查询PDB相关的信息。PDB下不能使用该函数。 返回类型:Boolean 备注:has_database_privilege检查用户是否能以在特定方式访问数据库。其参数类似has_table_privilege。访问权限类型必须是CREATE、CONNECT、TEMPORARY、ALTER、DROP、COMMENT或TEMP(等价于TEMPORARY)的一些组合。
  • has_schema_privilege(schema, privilege) 描述:当前用户是否有访问模式的权限。 返回类型:Boolean 备注:has_schema_privilege检查用户是否能以特定方式访问一个模式。其参数类似has_table_privilege。访问权限类型必须是CREATE、USAGE、ALTER、DROP或COMMENT的一些组合。当检查类型里包含CREATE权限且被检查的Schema是用户同名的Schema时,由于同名Schema的特殊约束,必须拥有Schema的OWNER权限,该函数才会返回TRUE。
  • has_cmk_privilege(user, cmk, privilege) 描述:指定用户是否有访问客户端加密主密钥CMK的权限。参数说明如下。 表4 参数类型说明 参数名 合法入参类型 描述 取值范围 user name,oid 用户 用户名字或id。 cmk text,oid 客户端加密主密钥 客户端加密主密钥名称或id。 privilege text 权限 USAGE:允许使用指定客户端加密主密钥。 DROP:允许删除指定客户端加密主密钥。 返回类型:Boolean
  • has_function_privilege(function, privilege) 描述:当前用户是否有访问函数的权限。合法参数类型请参见表8。 返回类型:Boolean 备注:has_function_privilege检查一个用户是否能以指定方式访问一个函数。其参数类似has_table_privilege。使用文本字符而不是OID声明一个函数时,允许输入的类型和regprocedure数据类型一样(请参考对象标识符类型)。访问权限类型必须是EXECUTE、ALTER、DROP或COMMENT。
共100000条
提示

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