华为云用户手册

  • PERCENT_RANK() 描述:PERCENT_RANK函数为各组内对应值生成相对序号,即根据公式 (rank - 1) / (total rows - 1)计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。 返回值类型:DOUBLE PRECISION 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id, classid, score,PERCENT_RANK() OVER(ORDER BY score DESC) FROM score; id | classid | score | percent_rank ----+---------+-------+-------------- 1 | 1 | 95 | 0 2 | 2 | 95 | 0 3 | 2 | 85 | .6 4 | 1 | 70 | .8 5 | 2 | 88 | .4 6 | 1 | 70 | .8 (6 rows)
  • 语法格式 窗口函数需要特殊的关键字OVER语句来指定窗口触发窗口函数。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号: 1 2 3 4 function_name ([expression [, expression ... ]]) OVER ( window_definition ) function_name ([expression [, expression ... ]]) OVER window_name function_name ( * ) OVER ( window_definition ) function_name ( * ) OVER window_name 其中window_definition子句option为: 1 2 3 4 [ existing_window_name ] [ PARTITION BY expression [, ...] ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ frame_clause ] PARTITION BY选项指定了将具有相同PARTITION BY表达式值的行分为一组。 ORDER BY选项用于控制窗口函数处理行的顺序。ORDER BY后面必须跟字段名,如果ORDER BY后面跟数字,该数字会被按照常量处理,对目标列没有起到排序的作用。 frame_clause子句option为: 1 2 [ RANGE | ROWS ] frame_start [ RANGE | ROWS ] BETWEEN frame_start AND frame_end 当需要指定一个窗口对分组内所有行结果进行计算时,需要指定窗口区间开始的行和结束的行。窗口区间支持RANGE、ROWS两种模式,ROWS以物理单位(行)指定窗口,RANGE将窗口指定为逻辑偏移量。 RANGE、ROWS中可以使用BETWEEN frame_start AND frame_end指定边界可取值。如果仅指定frame_start,则frame_end默认为CURRENT ROW。 frame_start和frame_end取值为: CURRENT ROW,当前行。 N PRECEDING,当前行向前第n行。 UNBOUNDED PRECEDING,当前PARTITION的第1行。 N FOLLOWING,当前行向后第n行。 UNBOUNDED FOLLOWING,当前PARTITION的最后1行。 需要注意,frame_start不能为UNBOUNDED FOLLOWING,frame_end不能为UNBOUNDED PRECEDING,并且frame_end选项不能比上面取值中出现的frame_start选项早。例如RANGE BETWEEN CURRENT ROW AND N PRECEDING是不被允许的。 LAST_VALUE函数支持IGNORE NULLS语法,该语法返回非NULL窗口中的最后一个值,如果所有值都为NULL,则返回NULL,具体格式为: 1 LAST_VALUE (expression [IGNORE NULLS]) OVER (window_definition) 当前IGNORE NULLS仅支持ROWS between CURRENT ROW and UNBOUNDED FOLLOWING和ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW两种窗口区间。
  • 获取访问密钥 FabricSQL SDK会使用您提供账号的AK和SK进行签名认证以访问服务,防止未经授权的用户访问并使用FabricSQL资源和数据。访问密钥(Access Key ID/Secret Access Key,简称AK/SK)包含访问密钥ID(AK)和秘密访问密钥(SK)两部分,是您在华为云的长期身份凭证,您可以通过访问密钥对华为云API的请求进行签名。华为云通过AK识别访问用户的身份,通过SK对请求数据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。 访问密钥分为永久访问密钥(AK/SK)和临时访问密钥(AK/SK和SecurityToken)两种,获取永久访问密钥请参考:管理 IAM 用户访问密钥,同时可以创建临时访问密钥,创建方式参考:临时访问密钥 企业联邦用户不能创建访问密钥,但可以创建临时访问凭证(临时AK/SK和SecuritityToken),具体内容请参见:临时访问密钥。 IAM提供的“安全设置”功能,适用于管理员管理IAM用户的访问密钥。在我的凭证中也可以管理访问密钥,我的凭证适用于所有用户在可以登录控制台的情况下,自行管理访问密钥。 账号和IAM用户的访问密钥是单独的身份凭证,即账号和IAM用户仅能使用自己的访问密钥进行API调用。
  • 示例 创建表t1、t2、t3: 1 2 3 create table t1(a1 int,b1 int,c1 int,d1 int) store as orc; create table t2(a2 int,b2 int,c2 int,d2 int) store as orc; create table t3(a3 int,b3 int,c3 int,d3 int) store as orc; 原语句为: 1 explain select * from t3, (select a1,b2,c1,d2 from t1,t2 where t1.a1=t2.a2) s1 where t3.b3=s1.b2; 上述查询中,可以使用以下两种方式禁止子查询s1进行提升: 方式一: 1 explain select /*+ no merge(s1) */ * from t3, (select a1,b2,c1,d2 from t1,t2 where t1.a1=t2.a2) s1 where t3.b3=s1.b2; 方式二: 1 explain select * from t3, (select /*+ no merge */ a1,b2,c1,d2 from t1,t2 where t1.a1=t2.a2) s1 where t3.b3=s1.b2; 提升后效果:
  • PG_NODE_ENV PG_NODE_ENV视图提供获取当前节点的环境变量信息。 表1 PG_NODE_ENV字段 名称 类型 描述 node_name text 当前节点名称。 host text 当前节点的主机名称。 process integer 当前节点的进程号。 port integer 当前节点的端口号。 installpath text 当前节点的安装目录。 datapath text 当前节点的数据目录。 log_directory text 当前节点的日志目录。 父主题: 系统视图
  • / 描述:除(除法操作符不会取整) 除数为0时,结果为NULL(兼容Hive行为)。 示例: 1 2 3 4 5 SELECT 4/2 AS RESULT; result -------- 2 (1 row) 1 2 3 4 5 SELECT 4/3 AS RESULT; result ------------------ 1.33333333333333 (1 row)
  • 设置GUC 本版本新增GUC参数enable_meta_scan,用于优化查询的性能。 该参数默认打开,但在表数据量很小的情况下,关闭可能比打开的时候查询性能更高,请基于实际情况打开或关闭该GUC。 代码示例如下: 1 2 3 4 5 6 SHOW enable_meta_scan; SET enable_meta_scan=off; SET enable_meta_scan=on; 或 SET enable_meta_scan=true; SET enable_meta_scan=false;
  • 空串与NULL TD与MySQL兼容模式下,区分空串与null。 TD兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows) MySQL兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows)
  • 长度 如果把一个字段定义为char(n)或者varchar(n), 代表该字段最大可容纳n个长度的数据。无论哪种类型,可设置的最大长度都不得超过10485760(即10MB)。 当数据长度超过指定的长度n时,会抛出错误"value too long"。也可通过指定数据类型,使超过长度的数据自动截断。 示例: 创建表t1,指定其字段的字符类型。 1 CREATE EXTERNAL TABLE t1(a char(5), b varchar(5)) STORE AS orc; 向表t1插入数据时超过指定的字节长度报错。 1 2 INSERT INTO t1 VALUES('bookstore','123'); ERROR: value too long for type character(5) 向表t1插入数据并明确超过指定字节长度后自动截断。 1 2 3 4 5 6 7 8 INSERT INTO t1 VALUES('bookstore'::char(5),'12345678'::varchar(5)); INSERT 0 1 SELECT a,b FROM t1; a | b -------+------- books | 12345 (1 row)
  • 定长与变长 所有字符类型根据长度是否固定可以分为定长字符串与变长字符串两大类。 对于定长字符串,长度必须确定,如果不指定长度,则默认长度1;如果数据长度不足,会在尾部自动填充空格,用以存储和显示;但这部分填充的数据是无意义的,实际使用中会被忽略,如比较、排序或类型转换。 对于变长字符串,如果指定长度,则为最大可存储数据长度;如果不指定长度,则认为该字段支持任意长度。 示例: 创建表t2,指定其字段的字符类型。 1 CREATE EXTERNAL TABLE t2 (a char(5),b varchar(5)) STORE AS orc; 向表t2插入数据并查询字段a的字节长度。因建表时指定a的字符类型为char(5)且是定长字符串,长度不足,填充空格,所以查询的字节长度为5。 1 2 3 4 5 6 7 8 INSERT INTO t2 VALUES('abc','abc'); INSERT 0 1 SELECT a,lengthb(a),b FROM t2; a | lengthb | b -------+---------+----- abc | 5 | abc (1 row) 用函数转换后查询字段a的实际字节长度为3。 1 2 3 4 5 6 7 8 9 10 11 SELECT a = b from t2; ?column? ---------- t (1 row) SELECT cast(a as text) as val,lengthb(val) FROM t2; val | lengthb -----+--------- abc | 3 (1 row)
  • PG_DESCRIPTION PG_DESCRIPTION系统表可以给每个数据库对象存储一个可选的描述(注释)。许多内置的系统对象的描述提供了PG_DESCRIPTION的初始内容。 表1 PG_DESCRIPTION字段 名称 类型 引用 描述 objoid oid 任意OID属性 描述所属对象的OID。 classoid oid PG_CLASS.oid 对象显示的系统表的OID。 objsubid integer - 对于一个表字段的注释,为字段号(objoid和classoid指向表自身)。对于其它对象类型,为0。 description text - 对该对象描述的任意文本。 父主题: 系统表
  • PG_CAST PG_CAST系统表存储数据类型之间的转化关系。 表1 PG_CAST字段 名称 类型 描述 castsource oid 源数据类型的OID。 casttarget oid 目标数据类型的OID。 castfunc oid 转化函数的OID。0表示不需要转化函数。 castcontext "char" 源数据类型和目标数据类型间的转化方式: e表示只能进行显式转化(使用CAST或::语法)。 i表示只能进行隐式转化。 a表示类型间同时支持隐式和显式转化。 castmethod "char" 转化方法: f表示使用castfunc字段中指定的函数进行转化。 b表示类型间是二进制强制转化,不使用castfunc。 父主题: 系统表
  • 开发规范 如果用户在APP的开发中,使用了连接池机制,那么需要遵循如下规范: 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。 否则,连接池里面的连接就是有状态的,会对用户后续使用连接池进行操作的正确性带来影响。 父主题: JDBC二次开发
  • 参数说明 block_name表示语句块的block_name,详细说明请参考block_name。 #,+,-,*,进行行数估算hint的四种操作符号。#表示直接使用后面的行数进行hint。+,-,*表示对原来估算的行数进行加、减、乘操作,运算后的行数最小值为1行。table_list为hint对应的单表或多表join结果集,与Join方式的Hint中table_list相同。 const可以是任意非负数,支持科学计数法。
  • 建议 推荐使用两个表*的hint。对于两个表的采用*操作符的hint,只要两个表出现在join的两端,都会触发hint。例如:设置hint为rows(t1 t2 * 3),对于(t1 t3 t4)和(t2 t5 t6)join时,由于t1和t2出现在join的两端,所以其join的结果集也会应用该hint规则乘以3。 rows hint支持在单表、多表、function table及subquery scan table的结果集上指定hint。
  • 其他因素对SMP性能的影响 除了资源因素外,还有一些因素也会对SMP并行性能造成影响。例如分区表中分区数据不均,以及系统并发度等因素。 数据倾斜对SMP性能的影响 当数据中存在严重数据倾斜时,并行效果较差。例如某表join列上某个值的数据量远大于其他值,开启并行后,根据join列的值对该表数据做hash重分布,使得某个并行线程的数据量远多于其他线程,造成长尾问题,导致并行后效果差。 系统并发度对SMP性能的影响 SMP特性会增加资源的使用,而在高并发场景下资源剩余较少。所以,如果在高并发场景下,开启SMP并行,会导致各查询之间严重的资源竞争问题。一旦出现了资源竞争的现象,无论是CPU、I/O、内存或者网络资源,都会导致整体性能的下降。因此在高并发场景下,开启SMP经常不能达到性能提升的效果,甚至可能引起性能劣化。
  • SMP适用场景与限制 SMP适用场景: 支持并行的算子 计划中存在以下算子支持并行: Scan:支持行存普通表和行存分区表顺序扫描、列存普通表和列存分区表顺序扫描、HDFS内外表顺序扫描;支持GDS数据导入的外表扫描并行。以上均不支持复制表。 Join:HashJoin、NestLoop Agg:HashAgg、SortAgg、PlainAgg、WindowAgg(只支持partition by,不支持order by) Stream:Redistribute、Broadcast 其他:Result、Subqueryscan、Unique、Material、Setop、Append、VectoRow、RowToVec SMP特有算子 为了实现并行,新增了并行线程间的数据交换Stream算子供SMP特性使用。以下新增的算子可以看做Stream算子的子类: Local Gather:实现DN内部并行线程的数据汇总 Local Redistribute:在DN内部各线程之间,按照分布键进行数据重分布 Local Broadcast:将数据广播到DN内部的每个线程 Local RoundRobin:在DN内部各线程之间实现数据轮询分发 Split Redistribute:在集群跨DN的并行线程之间实现数据重分布 Split Broadcast:将数据广播到集群所有DN的并行线程 上述新增算子可以分为Local与非Local两类,Local类算子实现了DN内部并行线程间的数据交换,而非Local类算子实现了跨DN的并行线程间的数据交换。 示例说明 以TPCH Q1的并行计划为例: 在这个计划中,实现了Foreign Scan以及HashAgg算子的并行,并且新增了Split Redistribute数据交换算子。 其中5号算子为Split Redistribute算子,上面标有的“dop: 1/4”表明Split Redistribute的发送端和接收端线程的并行度分别为4和1,即下层的6号Hash Aggregate算子按照4并行度执行,而上层的1~4号算子按照串行执行。 通过计划Stream算子上标明的dop信息即可看出各个算子的并行情况。 非适用场景:
  • 资源对SMP性能的影响 SMP架构是一种利用富余资源来换取时间的方案,计划并行之后必定会引起资源消耗的增加,包括CPU、内存、I/O和网络带宽等资源的消耗都会出现明显的增长,而且随着并行度的增大,资源消耗也随之增大。当上述资源成为瓶颈的情况下,SMP无法提升性能,反而可能导致集群整体性能的劣化。SMP支持自适应特性,该特性会根据当前资源和查询特征,动态选取最优的并行度。下面对各种资源对SMP性能的影响情况分别进行说明: CPU资源 在一般客户场景中,系统CPU利用率不高的情况下,利用SMP并行架构能够更充分地利用系统CPU资源,提升系统性能。但当数据库服务器的CPU核数较少,CPU利用率已经比较高的情况下,如果打开SMP并行,不仅性能提升不明显,反而可能因为多线程间的资源竞争而导致性能劣化。 内存资源 查询并行后会导致内存使用量的增长,但每个算子使用内存上限仍受到work_mem等参数的限制。假设work_mem为4GB,并行度为2,那么每个并行线程所分到的内存上限为2GB。在work_mem较小或者系统内存不充裕的情况下,使用SMP并行后,可能出现数据下盘,导致查询性能劣化的问题。 网络带宽资源 为了实现查询并行执行,会新增并行线程间的数据交换算子。对于Local类Stream算子,所需要进行数据交换的线程在同一个DN内,通过内存交换,不会增加网络负担。而非Local类算子,需要通过网络进行数据交换,因此会加重网络负担。当网络资源成为瓶颈的情况下,并行可能会导致一定程度的劣化。 I/O资源 要实现并行扫描必定会增加I/O的资源消耗,因此只有在I/O资源充足的情况下,并行扫描才能够提高扫描性能。
  • polygon(npts, circle) 描述:圆转换成npts点多边形。 返回类型:polygon 示例: 1 2 3 4 5 6 SELECT polygon(12, circle '((0,0),2.0)') AS RESULT; result ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22464679914735e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.44929359829471e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67394039744206e-16,-2),(-0.999999999999999,-1.73205080756888),(-1.73205080756888,-1)) (1 row)
  • polygon(circle) 描述:圆转换成12点多边形。 返回类型:polygon 示例: 1 2 3 4 5 6 SELECT polygon(circle '((0,0),2.0)') AS RESULT; result ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22464679914735e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.44929359829471e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67394039744206e-16,-2),(-0.999999999999999,-1.73205080756888),(-1.73205080756888,-1)) (1 row)
  • box(circle) 描述:将圆转换成矩形。 返回类型:box 示例: 1 2 3 4 5 SELECT box(circle '((0,0),2.0)') AS RESULT; result --------------------------------------------------------------------------- (1.41421356237309,1.41421356237309),(-1.41421356237309,-1.41421356237309) (1 row)
  • 自动收集统计信息 当配置参数autoanalyze打开时,查询语句走到优化器发现表不存在统计信息或数据变化超过阈值时,会自动触发统计信息收集,以满足优化器的需求。 基于代价的优化器模型(CBO,cost base optimizer)中,统计信息决定了查询计划生成的好坏。因此,统计信息的及时有效很重要。 表级统计信息,存储在pg_class的relpages、reltuples中。 列级统计信息,存储在pg_statistics中,可以通过pg_stats视图查看。包括:NULL值比例,distinct值占比,高频值MCV,直方图histgram等。 收集条件:当数据量发生较大变化,默认是变化10%,认为数据特征已经有了变化,需要重新收集统计信息。
  • 准确性 表1 准确性 分类 说明 采样大小 可配置为按表大小自适应。由参数default_statistics_target控制。 采样随机性 analyze_sample_mode参数设置新支持优化蓄水池和range采样随机性更优。 random_function_version参数增强了随机数计算函数的随机性。 统计信息推算 enable_extrapolation_stats参数可以控制估算失真时,基于旧的统计信息自动推算更准确地统计信息。
  • 背景信息 ANALYZE语句可收集与数据库中表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC中。查询优化器会使用这些统计数据,以生成最有效的执行计划。 建议在执行了大批量插入/删除操作后,例行对表或全库执行ANALYZE语句更新统计信息。目前默认收集统计信息的采样比例是30000行(即:guc参数default_statistics_target默认设置为100),如果表的总行数超过一定行数(大于1600000),建议设置guc参数default_statistics_target为-2,即按2%收集样本估算统计信息。 对于在批处理脚本或者存储过程中生成的中间表,也需要在完成数据生成之后显式地调用ANALYZE。 对于表中多个列有相关性且查询中有同时基于这些列的条件或分组操作的情况,可尝试收集多列统计信息,以便查询优化器可以更准确地估算行数,并生成更有效的执行计划。
  • 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。 父主题: 系统表
  • ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) 描述:文档查询排名。 返回类型:float4 示例: 1 2 3 4 5 SELECT ts_rank('hello world'::tsvector, 'world'::tsquery); ts_rank ---------- .0607927 (1 row)
  • ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) 描述:排序文件查询使用覆盖密度。 返回类型:float4 示例: 1 2 3 4 5 SELECT ts_rank_cd('hello world'::tsvector, 'world'::tsquery); ts_rank_cd ------------ 0 (1 row)
  • ts_rewrite(query tsquery, target tsquery, substitute tsquery) 描述:替换目标tsquery类型的单词。 返回类型:tsquery 示例: 1 2 3 4 5 SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'foo|bar'::tsquery); ts_rewrite ------------------------- 'b' & ( 'foo' | 'bar' ) (1 row)
  • to_tsvector([ config regconfig , ] document text) 描述:去除文件信息,并转换为tsvector类型。 返回类型:tsvector 示例: 1 2 3 4 5 SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3 (1 row)
  • ts_rewrite(query tsquery, select text) 描述:使用SELECT命令的结果替代目标中tsquery类型的单词。 返回类型:tsquery 示例: 1 2 3 4 5 SELECT ts_rewrite('world'::tsquery, 'select ''world''::tsquery, ''hello''::tsquery'); ts_rewrite ------------ 'hello' (1 row)
共100000条