华为云用户手册

  • 优化建议 create index 建议仅在匹配如下条件之一时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 约束限制: 普通表的索引支持最大列数为32列;分区表的GLOBAL索引支持最大列数为31列。 单个索引大小不能超过索引页面大小(8k),其中B-tree、UBtree及Gin索引不能超过页面大小的三分之一。 分区表上不支持创建部分索引。 分区表创建GLOBAL索引时,存在以下约束条件: 不支持表达式索引、部分索引 不支持列存表 仅支持B-tree索引 在相同属性列上,分区LOCAL索引与GLOBAL索引不能共存。 如果alter语句不带有UPDATE GLOBAL INDEX,那么原有的GLOBAL索引将失效,查询时将使用其他索引进行查询;如果alter语句带有UPDATE GLOBAL INDEX,原有的GLOBAL索引仍然有效,并且索引功能正确。
  • 注意事项 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 分区表索引分为LOCAL索引与GLOBAL索引,LOCAL索引与某个具体分区绑定,而GLOBAL索引则对应整个分区表。 列存表支持的PSORT和B-tree索引都不支持创建表达式索引、部分索引,PSORT不支持创建唯一索引,B-tree支持创建唯一索引。 列存表支持的GIN索引支持创建表达式索引,但表达式不能包含空分词、空列和多列,不支持创建部分索引和唯一索引。 被授予CREATE ANY INDEX权限的用户,可以在public模式和用户模式下创建索引。 如果表达式索引中调用的是用户自定义函数,按照函数创建者权限执行表达式索引函数。
  • 语法格式 在表上创建索引。 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [schema_name.]index_name ] ON table_name [ USING method ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ INCLUDE ( column_name [, ...] )] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ]; 在分区表上创建索引。 CREATE [ UNIQUE ] INDEX [ [schema_name.]index_name ] ON table_name [ USING method ] ( {{ column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] }[, ...] ) [ LOCAL [ ( { PARTITION index_partition_name | SUBPARTITION index_subpartition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] | GLOBAL ] [ INCLUDE ( column_name [, ...] )] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ];
  • 参数说明 UNIQUE 创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将导致一个错误。 目前只有B-tree及UBtree索引支持唯一索引。 CONCURRENTLY 以不阻塞DML的方式创建索引(加ShareUpdateExclusiveLock锁)。创建索引时,一般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现创建过程中不阻塞DML。 此选项只能指定一个索引的名称。 普通CREATE INDEX命令可以在事务内执行,但是CREATE INDEX CONCURRENTLY不可以在事务内执行。 列存表、分区表不支持CONCURRENTLY方式创建索引。对于临时表,支持使用CONCURRENTLY关键字创建索引,但是实际创建过程中,采用的是阻塞式的创建方式,因为没有其他会话会并发访问临时表,并且阻塞式创建成本更低。 创建索引时指定此关键字,需要执行先后两次对该表的全表扫描来完成build,第一次扫描的时候创建索引,不阻塞读写操作;第二次扫描的时候合并更新第一次扫描到目前为止发生的变更。 由于需要执行两次对表的扫描和build,而且必须等待现有的所有可能对该表执行修改的事务结束。这意味着该索引的创建比正常耗时更长,同时因此带来的CPU和I/O消耗对其他业务也会造成影响。 如果在索引构建时发生失败,那会留下一个“不可用”的索引。这个索引会被查询忽略,但它仍消耗更新开销。这种情况推荐的恢复方法是删除该索引并尝试再次CONCURRENTLY建索引。 由于在第二次扫描之后,索引构建必须等待任何持有早于第二次扫描拿的快照的事务终止,而且建索引时加的ShareUpdateExclusiveLock锁(4级)会和大于等于4级的锁冲突,在创建这类索引时,容易引发卡住(hang)或者死锁问题。例如: 两个会话对同一个表创建CONCURRENTLY索引,会引起死锁问题; 两个会话,一个对表创建CONCURRENTLY索引,一个drop table,会引起死锁问题; 三个会话,会话1先对表a加锁,不提交,会话2接着对表b创建CONCURRENTLY索引,会话3接着对表a执行写入操作,在会话1事务未提交之前,会话2会一直被阻塞; 将事务隔离级别设置成可重复读(默认为读已提交),起两个会话,会话1起事务对表a执行写入操作,不提交,会话2对表b创建CONCURRENTLY索引,在会话1事务未提交之前,会话2会一直被阻塞。 schema_name 模式的名称。 取值范围:已存在模式名。 index_name 要创建的索引名,索引的模式与表相同。 取值范围:字符串,要符合标识符的命名规范。 table_name 需要为其创建索引的表的名称,可以用模式修饰。 取值范围:已存在的表名。 USING method 指定创建索引的方法。 取值范围: btree:B-tree索引使用一种类似于B+树的结构来存储数据的键值,通过这种结构能够快速的查找索引。btree适合支持比较查询以及查询范围。 gin:GIN索引是倒排索引,可以处理包含多个键的值(比如数组)。 gist:Gist索引适用于几何和地理等多维数据类型和集合数据类型。目前支持的数据类型有box、point、poly、circle、tsvector、tsquery、range。 Psort:Psort索引。针对列存表进行局部排序索引。 ubtree:仅供ustore表使用的多版本B-tree索引,索引页面上包含事务信息,能并自主回收页面。ubtree索引默认开启insertpt功能。 行存表(ASTORE存储引擎)支持的索引类型:btree(行存表缺省值)、gin、gist。行存表(USTORE存储引擎)支持的索引类型:ubtree。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。全局临时表不支持GIN索引和Gist索引。 列存表对GIN索引支持仅限于对于tsvector类型的支持,即创建列存GIN索引入参需要为to_tsvector函数(的返回值)。此方法为GIN索引比较普遍的使用方式。 column_name 表中需要创建索引的列的名称(字段名)。 如果索引方式支持多字段索引,可以声明多个字段。全局索引最多可以声明31个字段,其他索引最多可以声明32个字段。 expression 创建一个基于该表的一个或多个字段的表达式索引,通常必须写在圆括弧中。如果表达式有函数调用的形式,圆括弧可以省略。 表达式索引可用于获取对基本数据的某种变形的快速访问。比如,一个在upper(col)上的函数索引将允许WHERE upper(col) = 'JIM'子句使用索引。 在创建表达式索引时,如果表达式中包含IS NULL子句,则这种索引是无效的。此时,建议用户尝试创建一个部分索引。 COLLATE collation COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 opclass 操作符类的名称。对于索引的每一列可以指定一个操作符类,操作符类标识了索引那一列的使用的操作符。例如一个B-tree索引在一个四字节整数上可以使用int4_ops;这个操作符类包括四字节整数的比较函数。实际上对于列上的数据类型默认的操作符类是足够用的。操作符类主要用于一些有多种排序的数据。例如,用户想按照绝对值或者实数部分排序一个复数。能通过定义两个操作符类然后当建立索引时选择合适的类。 ASC 指定按升序排序(默认)。 DESC 指定按降序排序。 NULLS FIRST 指定空值在排序中排在非空值之前,当指定DESC排序时,本选项为默认的。 NULLS LAST 指定空值在排序中排在非空值之后,未指定DESC排序时,本选项为默认的。 LOCAL 指定创建的分区索引为LOCAL索引。 GLOBAL 指定创建的分区索引为GLOBAL索引,当不指定LOCAL、GLOBAL关键字时,默认创建GLOBAL索引。 INCLUDE ( column_name [, ...] ) 可选的 INCLUDE 子句指定将一些非键列(non-key columns)包含在索引中。非键列不能用于作为索引扫描的加速搜索条件,同时在检查索引的唯一性约束时会忽略它们。 仅索引扫描 (Index Only Scan) 可以直接返回非键列中的内容,而不必去访问索引所对应的堆表。 将非键列添加为 INCLUDE 列需要保守一些,尤其是对于宽列。如果索引元组超过索引类型允许的最大大小,数据将插入失败。需要注意的是,任何情况下为索引添加非键列都会增加索引的空间占用,从而可能减慢搜索速度。 目前只有ubtree索引访问方式支持该特性。非键列会被保存在与堆元组对应的索引叶子元组中,不会包含在索引上层页面的元组中。 WITH ( {storage_parameter = value} [, ... ] ) 指定索引方法的存储参数。 取值范围: 只有GIN索引支持FASTUPDATE,GIN_PENDING_LIST_LIMIT参数。GIN和Psort之外的索引都支持FILLFACTOR参数。只有UBTREE索引支持INDEXSPLIT参数。 FILLFACTOR 一个索引的填充因子(fillfactor)是一个介于10和100之间的百分数。 取值范围:10~100 FASTUPDATE GIN索引是否使用快速更新。 取值范围:ON,OFF 默认值:ON GIN_PENDING_LIST_LIMIT 当GIN索引启用fastupdate时,设置该索引pending list容量的最大值。 取值范围:64~INT_MAX,单位KB。 默认值:gin_pending_list_limit的默认取决于GUC中gin_pending_list_limit的值(默认为4MB) INDEXSPLIT UBTREE索引选择采取哪种分裂策略。其中DEFAULT策略指的是与BTREE相同的分裂策略。INSERTPT策略能在某些场景下显著降低索引空间占用。 取值范围:INSERTPT, DEFAULT 默认值:INSERTPT TABLESPACE tablespace_name 指定索引的表空间,如果没有声明则使用默认的表空间。 取值范围:已存在的表空间名。 WHERE predicate 创建一个部分索引。部分索引是一个只包含表的一部分记录的索引,通常是该表中比其他部分数据更有用的部分。例如,有一个表,表里包含已记账和未记账的定单,未记账的定单只占表的一小部分而且这部分是最常用的部分,此时就可以通过只在未记账部分创建一个索引来改善性能。另外一个可能的用途是使用带有UNIQUE的WHERE强制一个表的某个子集的唯一性。 取值范围:predicate表达式只能引用表的字段,它可以使用所有字段,而不仅是被索引的字段。目前,子查询和聚集表达式不能出现在WHERE子句里。不建议使用int等数值类型作为predicate,因为int等数值类型可以隐式转换为bool值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。 对于分区表索引,当创建索引带GLOBAL/LOCAL关键字,或者最终创建的索引类型为GLOBAL索引时,不支持带WHERE子句创建索引。 PARTITION index_partition_name 索引分区的名称。 取值范围:字符串,要符合标识符的命名规范。 SUBPARTITION index_subpartition_name 索引二级分区的名称。 取值范围:字符串,要符合标识符的命名规范。 TABLESPACE index_partition_tablespace 索引分区的表空间。 取值范围:如果没有声明,将使用分区表索引的表空间index_tablespace。
  • 功能描述 在指定的表上创建索引。 索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如当索引带GLOBAL/LOCAL关键字或者创建索引为GLOBAL索引时不支持创建部分索引。
  • 语法格式 兼容PostgreSQL风格的创建自定义函数语法。 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' } A数据库风格的创建自定义函数的语法。 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 | LANGUAGE lang_name ][...] { IS | AS} plsql_body/
  • 参数说明 function_name 要创建的函数名称(可以用模式修饰)。 取值范围:字符串,要符合标识符的命名规范。且最多为63个字符。若超过63个字符,数据库会截断并保留前63个字符当做函数名称。 argname 函数参数的名称。 取值范围:字符串,要符合标识符的命名规范。且最多为63个字符。若超过63个字符,数据库会截断并保留前63个字符当做函数参数名称。 argmode 函数参数的模式。 取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。 VARIADIC用于声明数组类型的参数。 argtype 函数参数的类型。可以使用%TYPE或%ROWTYPE间接引用变量或表的类型,详细可参考存储过程章节定义变量。 expression 参数的默认表达式。 rettype 函数返回值的数据类型。 如果存在OUT或INOUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。 SETOF修饰词表示该函数将返回一个集合,而不是单独一项。 与argtype相同,同样可以使用%TYPE或%ROWTYPE间接引用类型。 PACKAGE外FUNCTION argtype和rettype中%TYPE不支持引用PACKAGE变量的类型。 column_name 字段名称。 column_type 字段类型。 definition 一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名称、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。 DETERMINISTIC SQL语法兼容接口,未实现功能,不推荐使用。 LANGUAGE lang_name 用以实现函数的语言的名称。可以是SQL,internal,或者是用户定义的过程语言名称。为了保证向下兼容,该名称可以用单引号(包围)。若采用单引号,则引号内必须为大写。 由于兼容性问题,A数据库风格的语法无论指定任何语言,最终创建的语言都为plpgsql。 WINDOW 表示该函数是窗口函数。替换函数定义时不能改变WINDOW属性。 自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 VOLATILE 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 SHIPPABLE|NOT SHIPPABLE 表示该函数是否可以下推执行。预留接口,不推荐使用。 FENCED|NOT FENCED 声明用户定义的C函数是在保护模式还是非保护模式下执行。预留接口,不推荐使用。 PACKAGE 表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对其它风格的函数。 不允许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的功能相同。 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存储过程体。 当在函数体中创建用户时,日志中会记录密码的明文。因此不建议用户在函数体中创建用户。
  • 语法格式 CREATE OPERATOR name ( PROCEDURE = function_name [, LEFTARG = left_type ] [, RIGHTARG = right_type ] [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ] [, RESTRICT = res_proc ] [, JOIN = join_proc ] [, HASHES ] [, MERGES ])
  • 示例 下面命令定义一个新操作符:面积相等,用于box数据类型。 CREATE OPERATOR === ( LEFTARG = box, RIGHTARG = box, PROCEDURE = area_equal_procedure, COMMUTATOR = ===, NEGATOR = !==, RESTRICT = area_restriction_procedure, JOIN = area_join_procedure, HASHES, MERGES);
  • 注意事项 如果创建函数时参数或返回值带有精度,不进行精度检测。 创建函数时,函数定义中对表对象的操作建议都显式指定模式,否则可能会导致函数执行异常。 在创建函数时,函数内部通过SET语句设置current_schema和search_path无效。执行完函数search_path和current_schema与执行函数前的search_path和current_schema保持一致。 如果函数参数中带有出参,SELECT调用函数必须缺省出参,CALL调用函数必须指定出参,对于调用重载的带有PACKAGE属性的函数,CALL调用函数可以缺省出参,具体信息参见CALL的示例。 兼容Postgresql风格的函数或者带有PACKAGE属性的函数支持重载。在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有函数,而是会建立新的函数。 SELECT调用可以指定不同参数来进行同名函数调用。由于语法不支持调用不带有PACKAGE属性的同名函数。 在创建function时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 新创建的函数默认会给PUBLIC授予执行权限(详见GRANT)。用户默认继承PUBLIC角色权限,因此其他用户也会有函数的执行权限并可以查看函数的定义,另外执行函数时还需要具备函数所在schema的USAGE权限。用户在创建函数时可以选择收回PUBLIC默认执行权限,然后根据需要将执行权限授予其他用户,为了避免出现新函数能被所有人访问的时间窗口,应在一个事务中创建函数并且设置函数执行权限。开启数据库对象隔离属性后,普通用户只能查看有权限执行的函数定义,设置方法请参考《安全加固指南》。 在函数内部调用其它无参数的函数时,可以省略括号,直接使用函数名进行调用。 在函数内部调用其他有出参的函数,如果在赋值表达式中调用时,被调函数的出参可以省略,给出了也会被忽略。 兼容Oracle风格的函数支持参数注释的查看与导出、导入。 兼容Oracle风格的函数支持介于IS/AS与plsql_body之间的注释的查看与导出、导入。 被授予CREATE ANY FUNCTION权限的用户,可以在用户模式下创建/替换函数。 函数默认为SECURITY INVOKER权限,如果想将默认行为改为SECURITY DEFINER权限,需要设置guc参数behavior_compat_options='plsql_security_definer'。 对于plpgsql函数,打开参数behavior_compat_options='proc_outparam_override'后,out/inout的行为会改变,函数中如果return和out/inout,可以同时返回,参数打开前只会返回return,见示例。 对于plpgsql函数,打开参数behavior_compat_options='proc_outparam_override'后,有以下限制: 如果同一schema和package中已存在带有out/inout参数函数,不能再次创建带有out/inout参数的同名函数。 无论使用select还是call调用存储过程,都必须加上out参数。 部分场景不支持函数参与表达式(与参数打开前相比),如存储过程中左赋值,call function等,见示例。 不支持调用无return的函数,perform function调用。 存储过程中调用函数,不支持out/inout参数传入常量,见示例。
  • 参数说明 name 要定义的操作符。可用的字符见上文。其名字可以用模式修饰, 比如CREATE OPERATOR myschema.+ (...)。如果没有模式, 则在当前模式中创建操作符。同一个模式中的两个操作符可以有一样的名字, 只要他们操作不同的数据类型。这是一个重载过程。 function_name 用于实现该操作符的函数。 left_type 操作符左边的参数数据类型,如果存在的话。如果是左目操作符,这个参数可以省略。 right_type 操作符右边的参数数据类型,如果存在的话。如果是右目操作符,这个参数可以省略。 com_op 该操作符对应的交换操作符。 neg_op 该操作符对应的负操作符。 res_proc 此操作符约束选择性评估函数。 join_proc 此操作符连接选择性评估函数。 HASHES 表明此操作符支持 Hash 连接。 MERGES 表明此操作符可以支持一个融合连接。 使用OPERATOR()语法在com_op 或者其它可选参数里给出一个模式修饰的操作符名,比如: COMMUTATOR = OPERATOR(myschema.===) ,
  • 语法格式 CREATE MODEL model_name USING algorithm_name [FEATURES { {expression [ [ AS ] output_name ]} [, ...] }][TARGET { {expression [ [ AS ] output_name ]} [, ...] }]FROM { table_name | select_query }WITH hyperparameter_name = { hyperparameter_value | DEFAULT } [, ...] }
  • 示例 CREATE TABLE houses (id INTEGER,tax INTEGER,bedroom INTEGER,bath DOUBLE PRECISION,price INTEGER,size INTEGER,lot INTEGER,mark text);insert into houses(id, tax, bedroom, bath, price, size, lot, mark) VALUES(1,590,2,1,50000,770,22100,'a+'),(2,1050,3,2,85000,1410,12000,'a+'),(3,20,2,1,22500,1060,3500,'a-'),(4,870,2,2,90000,1300,17500,'a+'),(5,1320,3,2,133000,1500,30000,'a+'),(6,1350,2,1,90500,850,25700,'a-'),(7,2790,3,2.5,260000,2130,25000,'a+'),(8,680,2,1,142500,1170,22000,'a-'),(9,1840,3,2,160000,1500,19000,'a+'),(10,3680,4,2,240000,2790,20000,'a-'),(11,1660,3,1,87000,1030,17500,'a+'),(12,1620,3,2,118500,1250,20000,'a-'),(13,3100,3,2,140000,1760,38000,'a+'),(14,2090,2,3,148000,1550,14000,'a-'),(15,650,3,1.5,65000,1450,12000,'a-');CREATE MODEL price_model USING logistic_regression FEATURES size, lot TARGET mark FROM HOUSES WITH learning_rate=0.88, max_iterations=default;
  • 注意事项 package只支持集中式,无法在分布式中使用。 在package specification中声明过的函数或者存储过程,必须在package body中找到定义。 在实例化中,无法调用带有commit/rollback的存储过程。 不能在Trigger中调用package函数。 不能在外部SQL中直接使用package当中的变量。 不允许在package外部调用package的私有变量和存储过程。 不支持其它存储过程不支持的用法,例如,在function中不允许调用commit/rollback,则package的function中同样无法调用commit/rollback。 不支持schema与package同名。 只支持A风格的存储过程和函数定义。 不支持package内有同名变量,包括包内同名参数。 package的全局变量为session级,不同session之间package的变量不共享。 package中调用自治事务的函数,不允许使用package中的cursor变量,以及递归的使用package中cursor变量的函数。 package中不支持声明ref cursor变量。 package默认为SECURITY INVOKER权限,如果想将默认行为改为SECURITY DEFINER权限,需要设置guc参数behavior_compat_options='plsql_security_definer'。 被授予CREATE ANY PACKAGE权限的用户,可以在public模式和用户模式下创建PACKAGE。 如果需要创建带有特殊字符的package名,特殊字符中不能含有空格,并且最好设置GUC参数behavior_compat_options="skip_insert_gs_source",否则可能引起报错。
  • 参数说明 model_name 对训练模型进行命名,模型名称具有唯一性约束。 取值范围:字符串,需要符合标识符的命名规范。 architecture_name 训练模型的算法类型。 取值范围:字符型,当前支持:logistic_regression、linear_regression、svm_classification、kmeans。 attribute_list 枚举训练模型的输入列名。 取值范围:字符型,需要符合数据属性名的命名规范。 attribute_name 在监督学习任务重训练模型的目标列名(可进行简单的表达式处理)。 取值范围:字符型,需要符合数据属性名的命名规范。 subquery 数据源。 取值范围:字符串,符合数据库SQL语法。
  • 示例 CREATE PACKAGE SPECIFICATION示例 CREATE OR REPLACE PACKAGE emp_bonus ISvar1 int:=1;--公有变量var2 int:=2;PROCEDURE testpro1(var3 int);--公有存储过程,可以被外部调用END emp_bonus;/ CREATE PACKAGE BODY示例 drop table if exists test1;create or replace package body emp_bonus isvar3 int:=3;var4 int:=4;procedure testpro1(var3 int)isbegincreate table if not exists test1(col1 int);insert into test1 values(var1);insert into test1 values(var4);end;begin --实例化开始var4:=9;testpro1(var4);end emp_bonus;/ ALTER PACKAGE OWNER示例 ALTER PACKAGE emp_bonus OWNER TO omm;--将PACKAGE emp_bonus的所属者改为omm 调用PACKAGE示例 call emp_bonus.testpro1(1); --使用call调用package存储过程select emp_bonus.testpro1(1); --使用select调用package存储过程--匿名块里调用package存储过程beginemp_bonus.testpro1(1);end;/
  • 语法格式 CREATE PACKAGE SPECIFICATION语法格式 CREATE [ OR REPLACE ] PACKAGE [ schema ] package_name [ invoker_rights_clause ] { IS | AS } item_list_1 END package_name;invoker_rights_clause可以被声明为AUTHID DEFINER或者AUTHID INVOKER,分别为定义者权限和调用者权限。item_list_1可以为声明的变量或者存储过程以及函数。 PACKAGE SPECIFICATION(包规格)声明了包内的公有变量、函数、异常等,可以被外部函数或者存储过程调用。在PACKAGE SPECIFICATION中只能声明存储过程,函数,不能定义存储过程或者函数。 CREATE PACKAGE BODY语法格式。 CREATE [ OR REPLACE ] PACKAGE BODY [ schema ] package_name { IS | AS } declare_section [ initialize_section ] END package_name; PACKAGE BODY(包体内)定义了包的私有变量,函数等。如果变量或者函数没有在PACKAGE SPECIFICATION中声明过,那么这个变量或者函数则为私有变量或者函数。 PACKAGE BODY也可以声明实例化部分,用来初始化package,详见示例。
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718 --创建dev_mask和bob_mask用户。openGauss=# CREATE USER dev_mask PASSWORD 'dev@1234';openGauss=# CREATE USER bob_mask PASSWORD 'bob@1234';--创建一个表tb_for_maskingopenGauss=# CREATE TABLE tb_for_masking(col1 text, col2 text, col3 text);--创建资源标签标记敏感列col1openGauss=# CREATE RESOURCE LABEL mask_lb1 ADD COLUMN(tb_for_masking.col1);--创建资源标签标记敏感列col2openGauss=# CREATE RESOURCE LABEL mask_lb2 ADD COLUMN(tb_for_masking.col2);--对访问敏感列col1的操作创建脱敏策略openGauss=# CREATE MASKING POLICY maskpol1 maskall ON LABEL(mask_lb1);--创建仅对用户dev_mask和bob_mask,客户端工具为psql和gsql,IP地址为'10.20.30.40', '127.0.0.0/24'场景下生效的脱敏策略。openGauss=# CREATE MASKING POLICY maskpol2 randommasking ON LABEL(mask_lb2) FILTER ON ROLES(dev_mask, bob_mask), APP(psql, gsql), IP('10.20.30.40', '127.0.0.0/24');
  • 语法格式 1 CREATE MASKING POLICY policy_name masking_clause[, ...]* policy_filter [ENABLE | DISABLE]; masking_clause: 1 masking_function ON LABEL(label_name[, ...]*) masking_function: maskall不是预置函数,硬编码在代码中,不支持\df展示。 预置时脱敏方式如下: maskall | randommasking | creditcardmasking | basicemailmasking | fullemailmasking | shufflemasking | alldigitsmasking | regexpmasking
  • 参数说明 policy_name 审计策略名称,需要唯一,不可重复。 取值范围:字符串,要符合标识符的命名规范。 label_name 资源标签名称。 masking_clause 指出使用何种脱敏函数对被label_name标签标记的数据库资源进行脱敏,支持用schema.function的方式指定脱敏函数。 policy_filter 指出该脱敏策略对何种身份的用户生效,若为空表示对所有用户生效。 FILTER_TYPE 描述策略过滤的条件类型,包括IP | APP | ROLES。 filter_value 指具体过滤信息内容,例如具体的IP,具体的APP名称,具体的用户名。 ENABLE|DISABLE 可以打开或关闭脱敏策略。若不指定ENABLE|DISABLE,语句默认为ENABLE。
  • 语法格式 CREATE DATABASE database_name [ [ WITH ] { [ OWNER [=] user_name ] | [ TEMPLATE [=] template ] | [ ENCODING [=] encoding ] | [ LC_COLLATE [=] lc_collate ] | [ LC_CTYPE [=] lc_ctype ] | [ DBCOMPATIBILITY [=] compatibilty_type ] | [ TABLESPACE [=] tablespace_name ] | [ CONNECTION LIMIT [=] connlimit ]}[...] ];
  • 示例 --创建jim和tom用户。openGauss=# CREATE USER jim PASSWORD 'xxxxxxxxx';openGauss=# CREATE USER tom PASSWORD 'xxxxxxxxx';--创建一个GBK编码的数据库music(本地环境的编码格式必须也为GBK)。openGauss=# CREATE DATABASE music ENCODING 'GBK' template = template0;--创建数据库music2,并指定所有者为jim。openGauss=# CREATE DATABASE music2 OWNER jim;--用模板template0创建数据库music3,并指定所有者为jim。openGauss=# CREATE DATABASE music3 OWNER jim TEMPLATE template0;--设置music数据库的连接数为10。openGauss=# ALTER DATABASE music CONNECTION LIMIT= 10;--将music名称改为music4。openGauss=# ALTER DATABASE music RENAME TO music4;--将数据库music2的所属者改为tom。openGauss=# ALTER DATABASE music2 OWNER TO tom;--设置music3的表空间为PG_DEFAULT。openGauss=# ALTER DATABASE music3 SET TABLESPACE PG_DEFAULT;--关闭在数据库music3上缺省的索引扫描。openGauss=# ALTER DATABASE music3 SET enable_indexscan TO off;--重置enable_indexscan参数。openGauss=# ALTER DATABASE music3 RESET enable_indexscan;--删除数据库。openGauss=# DROP DATABASE music2;openGauss=# DROP DATABASE music3;openGauss=# DROP DATABASE music4;--删除jim和tom用户。openGauss=# DROP USER jim;openGauss=# DROP USER tom;--创建兼容TD格式的数据库。openGauss=# CREATE DATABASE td_compatible_db DBCOMPATIBILITY 'C';--创建兼容A格式的数据库。openGauss=# CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'A';--删除兼容TD、A格式的数据库。openGauss=# DROP DATABASE td_compatible_db;openGauss=# DROP DATABASE ora_compatible_db;
  • 参数说明 mv_name 要创建的物化视图的名称(可以被模式限定)。 取值范围:字符串,要符合标识符的命名规范。 column_name 新物化视图中的一个列名。物化视图支持指定列,指定列需要和后面的查询语句结果的列数量保持一致;如果没有提供列名,会从查询的输出列名中获取列名。 取值范围:字符串,要符合标识符的命名规范。 TABLESPACE tablespace_name 指定新建物化视图所属表空间。如果没有声明,将使用默认表空间。 AS query 一个SELECT或者TABLE命令。这个查询将在一个安全受限的操作中运行。
  • 功能描述 CREATE INCREMENTAL MATERIALIZED VIEW会创建一个增量物化视图,并且后续可以使用REFRESH MATERIALIZED VIEW(全量刷新)和REFRESH INCREMENTAL MATERIALIZED VIEW(增量刷新)刷新物化视图的数据。 CREATE INCREMENTAL MATERIALIZED VIEW类似于CREATE TABLE AS,不过它会记住被用来初始化该视图的查询, 因此它可以在后续中进行数据刷新。一个物化视图有很多和表相同的属性,但是不支持临时物化视图。
  • 示例 --创建一个普通表openGauss=# CREATE TABLE my_table (c1 int, c2 int);--创建全量物化视图openGauss=# CREATE MATERIALIZED VIEW my_mv AS SELECT * FROM my_table;--基表写入数据openGauss=# INSERT INTO my_table VALUES(1,1),(2,2);--对全量物化视图my_mv进行全量刷新openGauss=# REFRESH MATERIALIZED VIEW my_mv;
  • 示例 --创建一个普通表openGauss=# CREATE TABLE my_table (c1 int, c2 int);--创建增量物化视图openGauss=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table;--基表写入数据openGauss=# INSERT INTO my_table VALUES(1,1),(2,2);--对增量物化视图my_imv进行增量刷新openGauss=# REFRESH INCREMENTAL MATERIALIZED VIEW my_imv;
  • 参数说明 mv_name 要创建的物化视图的名称(可以被模式限定)。 取值范围:字符串,要符合标识符的命名规范。 column_name 新物化视图中的一个列名。物化视图支持指定列,指定列需要和后面的查询语句结果的列数量保持一致;如果没有提供列名,会从查询的输出列名中获取列名。 取值范围:字符串,要符合标识符的命名规范。 WITH ( storage_parameter [= value] [, ... ] ) 这个子句为表或索引指定一个可选的存储参数。详见CREATE TABLE。 TABLESPACE tablespace_name 指定新建物化视图所属表空间。如果没有声明,将使用默认表空间。 AS query 一个SELECT、TABLE 或者VALUES命令。这个查询将在一个安全受限的操作中运行。
  • 语法格式 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ column_name type_name [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ] [, ... ]] ) SERVER server_name[ OPTIONS ( option 'value' [, ... ] ) ]这里column_constraint 可以是:[ CONSTRAINT constraint_name ]{ NOT NULL | NULL | DEFAULT default_expr }
  • 参数说明 IF NOT EXISTS 如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。 table_name 外表的表名。 取值范围:字符串,要符合标识符的命名规范。 column_name 外表中的字段名。 取值范围:字符串,要符合标识符的命名规范。 type_name 字段的数据类型。 SERVER server_name 外表的server名称。 OPTIONS ( option 'value' [, ... ] ) 选项与新外部表或外部表中的字段有关。允许的选项名称和值,是由每一个外部数据封装器指定的。 也是通过外部数据封装器的验证函数来验证。重复的选项名称是不被允许的(尽管表选项和表字段选项可以有相同的名字)。 file_fdw支持的options包括: filename 指定要读取的文件,必需的参数,且必须是一个绝对路径名。 format 远端server的文件格式,支持text/csv/binary/fixed四种格式,和COPY语句的FORMAT选项相同。 header 指定的文件是否有标题行,与COPY语句的HEADER选项相同。 delimiter 指定文件的分隔符,与COPY的DELIMITER选项相同。 quote 指定文件的引用字符,与COPY的QUOTE选项相同。 escape 指定文件的转义字符,与COPY的ESCAPE选项相同。 null 指定文件的null字符串,与COPY的NULL选项相同。 encoding 指定文件的编码,与COPY的ENCODING选项相同。 force_not_null 这是一个布尔选项。如果为真,则声明字段的值不应该匹配空字符串(也就是, 文件级别null选项)。与COPY的 FORCE_NOT_NULL选项里的字段相同。
  • 注意事项 在使用CREATE EXTENSION载入扩展到数据库中之前, 必须先安装好该扩展的支持文件。 CREATE EXTENSION命令安装一个新的扩展到一个数据库中,必须保证没有同名的扩展已经被安装。 安装一个扩展意味着执行一个扩展的脚本文件,这个脚本会创建一个新的SQL实体,例如函数,、数据类型、操作符、和索引支持的方法。 安装扩展需要有和创建他的组件对象相同的权限。对于大多数扩展这意味着需要超户或者数据库所有者的权限,对于后续的权限检查和该扩展脚本所创建的实体,运行CREATE EXTENSION命令的角色将变为扩展的所有者。 CREATE EXTENSION时如果数据库中存在与EXTENSION内同名的PACKAGE、同义词、操作符、目录、函数、存储过程、视图、表这些数据库对象,将会导致CREATE EXTENSION失败。
共100000条