华为云用户手册

  • epoch 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数); 如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数; 如果source为interval,表示时间间隔的总秒数。 1 2 3 4 5 SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); date_part -------------- 982384720.12 (1 row) 1 2 3 4 5 SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); date_part ----------- 442800 (1 row) 将epoch值转换为时间戳的方法。 1 2 3 4 5 SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT; result --------------------------- 2001-02-17 12:38:40.12+08 (1 row)
  • day 如果source为timestamp,表示月份里的日期(1-31)。 1 2 3 4 5 SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16 (1 row) 如果source为interval,表示天数。 1 2 3 4 5 SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); date_part ----------- 40 (1 row)
  • PG_OPERATOR PG_OPERATOR系统表存储有关操作符的信息。 表1 PG_OPERATOR字段 名字 类型 引用 描述 oid oid - 行标识符(隐藏属性,必须明确选择才会显示)。 oprname name - 操作符的名称。 oprnamespace oid PG_NAMESPACE.oid 包含此操作符的命名空间的OID。 oprowner oid PG_AUTHID.oid 操作符所有者。 oprkind "char" - b=infix =中缀(两边) l=前缀(左边) r=后缀(右边) oprcanmerge boolean - 该操作符是否支持合并连接。 oprcanhash boolean - 该操作符是否支持Hash连接。 oprleft oid PG_TYPE.oid 左操作数的类型。 oprright oid PG_TYPE.oid 右操作数的类型。 oprresult oid PG_TYPE.oid 结果类型。 oprcom oid PG_OPERATOR.oid 此操作符的交换符(如果存在)。 oprnegate oid PG_OPERATOR.oid 此操作符的反转器(如果存在)。 oprcode regproc PG_PROC.oid 实现该操作符的函数。 oprrest regproc PG_PROC.oid 此操作符的约束选择性计算函数。 oprjoin regproc PG_PROC.oid 此操作符的连接选择性计算函数。 父主题: 系统表
  • DateStyle 参数说明:设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。 这个变量包含两个独立的部分:输出格式声明(ISO、Postgres、SQL、German)和输入输出的年/月/日顺序(DMY、MDY、YMD)。这两个可以独立设置或者一起设置。关键字Euro和European等价于DMY;关键字US、NonEuro、NonEuropean等价于MDY 。 取值范围:字符串 默认值:ISO, MDY gs_initdb会将这个参数初始化成与lc_time一致的值。 设置建议:优先推荐使用ISO格式。Postgres、SQL和German均采用字母缩写的形式来表示时区,例如“EST、WST、 CS T”等。
  • IntervalStyle 参数说明:设置区间值的显示格式。 取值范围:枚举型 sql_standard表示产生与SQL标准规定匹配的输出。 postgres表示产生与PostgreSQL 8.4版本相匹配的输出,当DateStyle参数被设为ISO时。 postgres_verbose表示产生与PostgreSQL 8.4版本相匹配的输出,当DateStyle参数被设为non_ISO时。 iso_8601表示产生与在ISO 8601中定义的“格式与代号”相匹配的输出。 oracle表示产生于Oracle中与numtodsinterval函数相匹配的输出结果,详细请参考numtodsinterval。 IntervalStyle参数也会影响不明确的间隔输入的说明。 默认值:postgres
  • client_encoding 参数说明:设置客户端的字符编码类型。 请根据前端业务的情况确定。尽量客户端编码和服务器端编码一致,提高效率。 取值范围:兼容PostgreSQL所有的字符编码类型。其中UTF8表示使用数据库的字符编码类型。 使用命令locale -a查看当前系统支持的区域和相应的编码格式,并可以选择进行设置。 默认情况下,gs_initdb会根据当前的系统环境初始化此参数,通过locale命令可以查看当前的配置环境。 参数建议保持默认值,不建议通过gs_guc工具或其他方式直接在postgresql.conf文件中设置client_encoding参数,即使设置也不会生效,以保证集群内部通信编码格式一致。 默认值:UTF8 推荐值:SQL_ASCII/UTF8
  • 加载驱动 在创建数据库连接之前,需要先加载数据库驱动程序。 加载驱动有两种方法: 在代码中创建连接之前任意位置隐含装载:Class.forName("org.postgresql.Driver"); 在JVM启动时参数传递:java -Djdbc.drivers=org.postgresql.Driver jdbctest 上述jdbctest为测试用例程序的名称。 当使用gsjdbc200.jar时,上面的Driver类名相应修改为"com.huawei.gauss200.jdbc.Driver" 父主题: 基于JDBC开发
  • - 描述:减 示例: 1 2 3 4 5 6 7 8 9 10 SELECT inet '192.168.1.43' - 36 AS RESULT; result ------------- 192.168.1.7 (1 row) SELECT inet '192.168.1.43' - inet '192.168.1.19' AS RESULT; result -------- 24 (1 row)
  • hll_hash_bytea(bytea, int32) 描述:对bytea类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 返回值类型:hll_hashval 示例: 1 2 3 4 5 SELECT hll_hash_bytea(E'\\x', 10); hll_hash_bytea --------------------- 6574525721897061910 (1 row)
  • hll_hash_any(anytype, int32) 描述:对任意类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 返回值类型:hll_hashval 示例: 1 2 3 4 5 SELECT hll_hash_any(1, 10); hll_hash_any ---------------------- -1478847531811254870 (1 row)
  • hll_hash_bigint(bigint, int32) 描述:对bigint类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 返回值类型:hll_hashval 示例: 1 2 3 4 5 SELECT hll_hash_bigint(100::bigint, 10); hll_hash_bigint --------------------- 4631120266694327276 (1 row)
  • hll_hashval_eq(hll_hashval, hll_hashval) 描述:比较两个hll_hashval类型数据是否相等。 返回值类型:bool 示例: 1 2 3 4 5 SELECT hll_hashval_eq(hll_hash_integer(1), hll_hash_integer(1)); hll_hashval_eq ---------------- t (1 row)
  • hll_hash_smallint(smallint, int32) 描述:设置hash seed(即改变哈希策略)同时对smallint类型数据计算哈希值。 返回值类型:hll_hashval 示例: 1 2 3 4 5 SELECT hll_hash_smallint(100::smallint, 10); hll_hash_smallint --------------------- 8349353095166695771 (1 row)
  • hll_hash_any(anytype) 描述:对任意类型数据计算哈希值。 返回值类型:hll_hashval 示例: 1 2 3 4 5 6 7 8 9 10 11 SELECT hll_hash_any(1); hll_hash_any ---------------------- -8604791237420463362 (1 row) SELECT hll_hash_any('08:00:2b:01:02:03'::macaddr); hll_hash_any ---------------------- -4883882473551067169 (1 row)
  • hll_hash_integer(integer, int32) 描述:对integer类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 返回值类型:hll_hashval 示例: 1 2 3 4 5 SELECT hll_hash_integer(0, 10); hll_hash_integer -------------------- 183371090322255134 (1 row)
  • hll_hashval_ne(hll_hashval, hll_hashval) 描述:比较两个hll_hashval类型数据是否不相等。 返回值类型:bool 示例: 1 2 3 4 5 SELECT hll_hashval_ne(hll_hash_integer(1), hll_hash_integer(1)); hll_hashval_ne ---------------- f (1 row)
  • hll_hash_boolean(bool, int32) 描述:设置hash seed(即改变哈希策略)并对bool类型数据计算哈希值。 返回值类型:hll_hashval 示例: 1 2 3 4 5 SELECT hll_hash_boolean(FALSE, 10); hll_hash_boolean -------------------- 391264977436098630 (1 row)
  • 获取结果集中光标的位置 对于可滚动的结果集,可能会调用定位方法来改变光标的位置。JDBC驱动程序提供了获取结果集中光标所处位置的方法。获取光标位置的方法如表2所示。 表2 获取结果集光标的位置 方法 描述 isFirst() 是否在一行。 isLast() 是否在最后一行。 isBeforeFirst() 是否在第一行之前。 isAfterLast() 是否在最后一行之后。 getRow() 获取当前在第几行。
  • 获取结果集中的数据 ResultSet对象提供了丰富的方法,以获取结果集中的数据。获取数据常用的方法如表3所示,其他方法请参考JDK官方文档。 表3 ResultSet对象的常用方法 方法 描述 int getInt(int columnIndex) 按列标获取int型数据。 int getInt(String columnLabel) 按列名获取int型数据。 String getString(int columnIndex) 按列标获取String型数据。 String getString(String columnLabel) 按列名获取String型数据。 Date getDate(int columnIndex) 按列标获取Date型数据 Date getDate(String columnLabel) 按列名获取Date型数据。
  • 在结果集中定位 ResultSet对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next方法将光标移动到下一行;因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。但对于可滚动的结果集,JDBC驱动程序提供更多的定位方法,使ResultSet指向特定的行。定位方法如表1所示。 表1 在结果集中定位的方法 方法 描述 next() 把ResultSet向下移动一行。 previous() 把ResultSet向上移动一行。 beforeFirst() 把ResultSet定位到第一行之前。 afterLast() 把ResultSet定位到最后一行之后。 first() 把ResultSet定位到第一行。 last() 把ResultSet定位到最后一行。 absolute(int) 把ResultSet移动到参数指定的行数。 relative(int) 向前或者向后移动参数指定的行。
  • 操作符类型解析 从系统表pg_operator中选出要考虑的操作符。如果可以找到一个参数类型以及参数个数都一致的操作符,那么这个操作符就是最终使用的操作符。如果找到了多个备选的操作符,将从中选择一个最合适的。 寻找最优匹配。 丢弃输入类型不匹配以及无法隐式转换成匹配的候选操作符。unknown文本在这种情况下可以转换成任何类型。如果只剩下一个候选操作符,则使用,否则继续下一步。 查看所有候选操作符,并保留输入类型最匹配的操作符。此时,域被看作和其基本类型相同。如果没有完全匹配的操作符,则保留所有候选。如果只剩下一个候选操作符,则使用,否则继续下一步。 查看所有候选操作符,保留需要类型转换时接受(属于输入数据类型的类型范畴的)首选类型位置最多的操作符。如果没有接受首选类型的操作符,则保留所有候选。如果只剩下一个候选操作符,则使用,否则继续下一步。 如果有任何输入参数是unknown类型,请检查其余候选操作符对应参数位置的类型范畴。在每一个能够接受string类型范畴的位置使用string类型(这种偏向字符串的做法合理,因为unknown文本跟字符串相似)。另外,如果所有剩下的候选操作符都接受相同的类型范畴,则选择该类型范畴,否则会报错(因为在没有更多线索的条件下无法做出正确的选择)。现在丢弃不接受选定类型范畴的候选操作符。此外,如果有任意候选操作符接受该范畴中的首选类型,则丢弃该参数接受非首选类型的候选操作符。如果没有一个操作符能被保留,则保留所有候选。如果只剩下一个候选操作符,则使用,否则继续下一步。 如果同时有unknown和已知参数,并且所有已知参数都是相同的类型,那么假设unknown参数也属于该类型,并检查哪些候选操作符在unknown参数位置接受该类型。如果只有一个操作符符合,则使用。否则,报错。
  • 更多优化示例 示例:修改select语句,将子查询修改为和主表的join,或者修改为可以提升的subquery,但是在修改前后需要保证语义的正确性。 1 explain (costs off)select * from t1 where t1.c1 in (select t2.c1 from t2 where t1.c2 = t2.c2); 上面示例计划中存在一个subPlan,为了消除这个subPlan可以修改语句为: 1 explain(costs off) select * from t1 where exists (select 1 from t2 where t1.c1 = t2.c1 and t1.c2 = t2.c2); 从计划可以看出,subPlan消除了,计划变成了两个表的semi join,这样会大幅度提高执行效率。
  • PG_TIMEZONE_NAMES PG_TIMEZONE_NAMES视图提供了显示了所有能够被SET TIMEZONE识别的时区名及其缩写、UTC偏移量、是否夏时制。 表1 PG_TIMEZONE_NAMES字段 名称 类型 描述 name text 时区名。 abbrev text 时区名缩写。 utc_offset interval 相对于UTC的偏移量。 is_dst boolean 如果当前正处于夏令时范围则为TRUE,否则为FALSE。 父主题: 系统视图
  • 总结 通常优化器总会选择最优的执行计划,但是众所周知代价估算,尤其是中间结果集的代价估算一般会有比较大的偏差,这种比较大的偏差就可能会导致agg的计算方式出现比较大的偏差,这时候就需要通过best_agg_plan进行agg计算模型的干预。 一般来说,当agg汇聚的收敛度很小时,即结果集的个数在agg之后并没有明显变少时(经验上以5倍为临界点),选择redistribute+hashagg执行方式,否则选择hashagg+redistribute+hashagg执行方式。
  • jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after boolean]) 描述:返回target,并插入new_value。如果path指定的target部分位于JSONB数组中,则new_value将在目标之前或insert_after为true(默认值为false)之后插入。如果在JSONB对象中由path指定的target部分,则仅当target不存在时才插入new_value。与面向路径的运算符一样,path中出现的负整数从JSON数组的末尾开始计数。 返回类型:jsonb 示例: 1 2 3 4 5 SELECT jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'); jsonb_insert ------------------------------- {"a": [0, "new_value", 1, 2]} (1 row)
  • json_to_tsvector(config regconfig, ] json, jsonb) 描述:将json格式转换为用于支持全文检索的文件格式tsvector。 返回类型:jsonb 示例: 1 2 3 4 5 SELECT json_to_tsvector('{"a":1, "b":2, "c":3}'::json, to_jsonb('key'::text)); json_to_tsvector ------------------ 'b':2 'c':4 (1 row)
  • jsonb_pretty(jsonb) 描述:以缩进的JSON文本形式返回。 返回类型:jsonb 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT jsonb_pretty('{"a":{"b":{"c":1, "d":2}}, "e":3}'::jsonb); jsonb_pretty --------------------- { + "a": { + "b": { + "c": 1,+ "d": 2 + } + }, + "e": 3 + } (1 row)
  • jsonb_set(target jsonb, path text[], new_value jsonb [, create_missing boolean]) 描述:返回target,用path指定的部分被new_value替换,或者如果create_missing为true(默认值为true)且path指定的项不存在,则添加new_value。与面向路径的运算符一样,path中出现的负整数从JSON数组的末尾开始计数。 返回类型:jsonb 示例: 1 2 3 4 5 SELECT jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false); jsonb_set --------------------------------------------- [{"f1": [2, 3, 4], "f2": null}, 2, null, 3] (1 row)
  • jsonb_to_record(object-json) 描述:正如所有返回record的函数一样,调用者必须用一个AS子句显式地定义记录的结构。会将object-json的键值对进行拆分重组,把键当做列名,去匹配填充AS显示指定的记录的结构。 返回类型:record 示例: 1 2 3 4 5 SELECT * FROM jsonb_to_record('{"a":1,"b":"foo","c":"bar"}'::jsonb) as x(a int, b text, d text); a | b | d ---+-----+--- 1 | foo | (1 row)
  • jsonb_to_recordset(array-json) 描述:参考函数jsonb_to_record,对数组内个每个元素,执行上述函数的操作,因此这要求数组内的每个元素都得是object-jsonb。 返回类型:setof record 示例: 1 2 3 4 5 6 SELECT * FROM jsonb_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') AS x(a INT, b text, c boolean); a | b | c ---+-----+--- 1 | foo | 2 | bar | t (2 rows)
共100000条