华为云用户手册

  • 注意事项 Sequence是一个存放等差数列的特殊表,该表受DBMS控制。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。 被授予CREATE ANY SEQUENCE权限的用户,可以在public模式和用户模式下创建序列。
  • 语法格式 1234 CREATE SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] [ OWNED BY { table_name.column_name | NONE } ];
  • 示例 创建一个名为serial的递增序列,从101开始: 123 openGauss=# CREATE SEQUENCE serial START 101 CACHE 20; 从序列中选出下一个数字: 1234 openGauss=# SELECT nextval('serial'); nextval --------- 101 从序列中选出下一个数字: 1234 openGauss=# SELECT nextval('serial'); nextval --------- 102 创建与表关联的序列: 1 2 3 4 5 6 7 8 910111213141516171819202122232425 openGauss=# CREATE TABLE customer_address( ca_address_sk integer not null, ca_address_id char(16) not null, ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) );openGauss=# CREATE SEQUENCE serial1 START 101 CACHE 20OWNED BY customer_address.ca_address_sk;--删除序列openGauss=# DROP TABLE customer_address;openGauss=# DROP SEQUENCE serial cascade;openGauss=# DROP SEQUENCE serial1 cascade;
  • 示例 1 2 3 4 5 6 7 8 9101112131415 --建立外表,用来以TEXT格式导入GDS服务器192.168.0.90和192.168.0.91上的数据,导入过程错误信息将记录到err_HR_staffS中。openGauss=# CREATE FOREIGN TABLE foreign_HR_staffS( staff_ID NUMBER(6) , FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4)) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'TEXT', delimiter E'\x20', null '') WITH err_HR_staffS; 1 2 3 4 5 6 7 8 9101112131415 --建立外表,用来以TEXT格式导入GDS服务器192.168.0.90和192.168.0.91上的数据,导入过程错误信息将记录到err_HR_staffS中。本次数据导入允许出现的数据格式错误个数为2。CREATE FOREIGN TABLE foreign_HR_staffS_ft3( staff_ID NUMBER(6) , FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4)) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'TEXT', delimiter E'\x20', null '',reject_limit '2') WITH err_HR_staffS_ft3; 1 2 3 4 5 6 7 8 9101112131415 --建立外表,用来以 CS V格式导入input_data目录下存放在各个节点名文件下的所有文件。openGauss=# CREATE FOREIGN TABLE foreign_HR_staffS_ft1( staff_ID NUMBER(6) , FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4)) SERVER gsmpp_server OPTIONS (location 'file:///input_data/*', format 'csv', mode 'private', delimiter ',') WITH err_HR_staffS_ft1; 1 2 3 4 5 6 7 8 9101112131415 --建立外表,用来以CSV格式导出数据到output_data目录下。openGauss=# CREATE FOREIGN TABLE foreign_HR_staffS_ft2( staff_ID NUMBER(6) , FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, employment_ID VARCHAR2(10), SALARY NUMBER(8,2), COMMISSION_PCT NUMBER(2,2), MANAGER_ID NUMBER(6), section_ID NUMBER(4)) SERVER gsmpp_server OPTIONS (location 'file:///output_data/', format 'csv', delimiter '|', header 'on') WRITE ONLY; 12345 --删除外表。openGauss=# DROP FOREIGN TABLE foreign_HR_staffS;openGauss=# DROP FOREIGN TABLE foreign_HR_staffS_ft1;openGauss=# DROP FOREIGN TABLE foreign_HR_staffS_ft2;openGauss=# DROP FOREIGN TABLE foreign_HR_staffS_ft3;
  • 参数概览 创建外表语法提供了多个参数,常用参数分类如下。 必需参数 table_name column_name type_name SERVER gsmpp_server OPTIONS可选参数 可选参数 外表的数据源位置参数location 数据格式参数 format header(仅支持CSV,FIXED格式) fileheader(仅支持CSV,FIXED格式) out_filename_prefix delimiter quote(仅支持CSV格式) escape(仅支持CSV格式) null noescaping(仅支持TEXT格式) encoding eol 容错性参数 fill_missing_fields ignore_extra_data reject_limit compatible_illegal_chars WITH error_table_name LOG INTO error_table_nam... REMOTE LOG 'name' PER NODE REJECT LIMIT 'v...
  • 语法格式 123456789 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name POSITION ( offset, length ) | LIKE source_table } [, ...] ] ) SERVER gsmpp_server OPTIONS ( { option_name ' value ' } [, ...] ) [ { WRITE ONLY | READ ONLY }] [ WITH error_table_name | LOG INTO error_table_name] [REMOTE LOG 'name'] [PER NODE REJECT LIMIT 'value'] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ];
  • 参数说明 server_name server的名称。 取值范围:长度必须小于等于63。 FOREIGN DATA WRAPPER fdw_name 指定外部数据封装器的名称。 取值范围:fdw_name是数据库初始化时系统创建的数据封装器,对于其他同构集群,fdw_name为gc_fdw。还可以创建dist_fdw、file_fdw、log_fdw。 OPTIONS ( { option_name ' value ' } [, ...] ) 用于指定外部服务器的各类参数,详细的参数说明如下所示。 encrypt 是否对数据进行加密,该参数仅支持type为OBS时设置。默认值为on。 取值范围: on表示对数据进行加密,使用HTTPS协议通信。 off表示不对数据进行加密,使用HTTP协议通信。 access_key OBS访问协议对应的AK值(OBS云服务界面由用户获取),创建外表时AK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 secret_access_key OBS访问协议对应的SK值(OBS云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。
  • 示例 建立一个obs_server,其中dfs_fdw为数据库中存在的foreign data wrapper。 1 2 3 4 5 6 7 8 910 --创建obs_server。openGauss=# CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( address 'obs.abc.com', access_key 'xxxxxxxxx', secret_access_key 'yyyyyyyyyyyyy', type 'obs');--删除obs_server。openGauss=# DROP SERVER obs_server; 建立另外一个同构集群的server,其中gc_fdw为数据库中存在的foreign data wrapper。 1 2 3 4 5 6 7 8 910 --创建server。openGauss=# CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '10.146.187.231:8000,10.180.157.130:8000' , dbname 'test', username 'test', password 'xxxxxxxx');--删除server。openGauss=# DROP SERVER server_remote; 相关链接 ALTER SERVER, DROP SERVER
  • 注意事项 默认只有系统管理员才可以创建外部服务器,否则需要对所使用的FOREIGN DATA WRAPPER授权才可以创建,授权语法为: GRANT USAGE ON FOREIGN DATA WRAPPER fdw_name TO username 其中fdw_name为FOREIGN DATA WRAPPER的名称,username为创建SERVER的用户名。 OPTIONS中的敏感字段(如password、secret_access_key)在使用多层引号时,语义和不带引号的场景是不同的,因此不会被识别为敏感字段进行脱敏。
  • 参数说明 schema_name 模式名称。 模式名不能和当前数据库里其他的模式重名。 模式的名称不可以“pg_”开头。 取值范围:字符串,要符合标识符的命名规范。 AUTHORIZATION user_name 指定模式的所有者。当不指定schema_name时,把user_name当作模式名,此时user_name只能是角色名。 取值范围:已存在的用户名/角色名。 WITH BLOCKCHAIN 指定模式的防篡改属性。防篡改模式下的普通行存表为防篡改用户表。 schema_element 在模式里创建对象的SQL语句。目前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE PARTITION、GRANT子句。 子命令所创建的对象都被AUTHORIZATION子句指定的用户所拥有。 如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。
  • 示例 1 2 3 4 5 6 7 8 910111213 --创建一个角色role1。openGauss=# CREATE ROLE role1 IDENTIFIED BY 'xxxxxxxxxxx';-- 为用户role1创建一个同名schema,子命令创建的表films和winners的拥有者为role1。openGauss=# CREATE SCHEMA AUTHORIZATION role1 CREATE TABLE films (title text, release date, awards text[]) CREATE VIEW winners AS SELECT title, release FROM films WHERE awards IS NOT NULL;--删除schema。openGauss=# DROP SCHEMA role1 CASCADE;--删除用户。openGauss=# DROP USER role1 CASCADE;
  • 语法格式 根据指定的名称创建模式。 12 CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [WITH BLOCKCHAIN] [ schema_element [ ... ] ]; 根据用户名创建模式。 1 CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ];
  • 参数说明 pool_name 资源池名称。 资源池名称不能和当前数据库里已有的资源池重名。 取值范围:字符串,要符合标识符的命名规范。 group_name 控制组名称。 设置控制组名称时,语法可以使用双引号,也可以使用单引号。 group_name对大小写敏感。 不指定group_name时,默认指定的字符串为 "Medium",代表指定DefaultClass控制组的"Medium" Timeshare控制组。 若数据库管理员指定自定义Class组下的Workload控制组,如control_group的字符串为:"class1:workload1";代表此资源池指定到class1控制组下的workload1控制组。也可同时指定Workload控制组的层次,如control_group的字符串为:"class1:workload1:1"。 若数据库用户指定Timeshare控制组代表的字符串,即"Rush"、"High"、"Medium"或"Low"其中一种,如control_group的字符串为"High";代表资源池指定到DefaultClass控制组下的"High" Timeshare控制组。 多租户场景下,组资源池关联的控制组为Class级别,业务资源池关联Workload控制组。且不允许在各种资源池间相互切换。 取值范围:字符串,要符合说明中的规则,其指定已创建的控制组。 stmt 资源池语句执行的最大并发数量。 取值范围:数值型,-1~2147483647‬。 dop 资源池最大并发度,语句执行时能够创建的最多线程数量。 取值范围:数值型,1~2147483647‬ memory_size 资源池最大使用内存。 取值范围:字符串,内容范围1KB~2047GB mem_percent 资源池可用内存占全部内存或者组用户内存使用的比例。 在多租户场景下,组用户和业务用户的mem_percent范围1-100,默认为20。 在普通场景下,普通用户的mem_percent范围为0-100,默认值为0。 mem_percent和memory_limit同时指定时,只有mem_percent起作用。 io_limits 资源池每秒可触发IO次数上限。 对于行存,以万次为单位计数,而列存则以正常次数计数。 io_priority IO利用率高达90%时,重消耗IO作业进行IO资源管控时关联的优先级等级。 包括三档可选:Low、Medium和High。不控制时可设置为None。默认为None。 io_limits和io_priority的设置都仅对复杂作业有效。包括批量导入(INSERT INTO SELECT, COPY FROM, CREATE TABLE AS等),单DN数据量大约超过500MB的复杂查询和VACUUM FULL等操作。 nodegroup 在逻辑集群(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)模式下,指定逻辑集群名称。必须是存在的逻辑集群。 如果逻辑集群名称包含大写字符、特殊符号或以数字开头,SQL语句中对逻辑集群名称需要加双引号。 is_foreign 在逻辑集群(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)模式下,指定当前资源池用于控制没有关联本逻辑集群的普通用户的资源。这里的逻辑集群是由资源池nodegroup字段指定的。 nodegroup必须是存在的逻辑集群,不能是elastic_group和安装的nodegroup (group_version1)。 如果指定了is_foreign为true,则资源池不能再关联用户,即不允许通过CREATE USER ... RESOURCE POOL语句来将该资源池配置给用户。该资源池自动检查用户是否关联到资源池指定的逻辑集群,如果用户没有关联到该逻辑集群,则这些用户在逻辑集群所包含的DN上运行将受到该资源池的资源控制。
  • 示例 本示例假定用户已预先成功创建控制组。 1 2 3 4 5 6 7 8 9101112131415161718192021 --创建一个默认资源池,其控制组为"DefaultClass"组下属的"Medium" Timeshare Workload控制组。openGauss=# CREATE RESOURCE POOL pool1;-- 创建一个资源池,其控制组指定为"DefaultClass"组下属的"High" Timeshare Workload控制组。openGauss=# CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High");-- 创建一个资源池,其控制组指定为"class1"组下属的"Low" Timeshare Workload控制组。openGauss=# CREATE RESOURCE POOL pool3 WITH (CONTROL_GROUP="class1:Low");-- 创建一个资源池,其控制组指定为"class1"组下属的"wg1" Workload控制组。openGauss=# CREATE RESOURCE POOL pool4 WITH (CONTROL_GROUP="class1:wg1");-- 创建一个资源池,其控制组指定为"class1"组下属的"wg2" Workload控制组。openGauss=# CREATE RESOURCE POOL pool5 WITH (CONTROL_GROUP="class1:wg2:3");--删除资源池。openGauss=# DROP RESOURCE POOL pool1;openGauss=# DROP RESOURCE POOL pool2;openGauss=# DROP RESOURCE POOL pool3;openGauss=# DROP RESOURCE POOL pool4;openGauss=# DROP RESOURCE POOL pool5;
  • 语法格式 12 CREATE RESOURCE POOL pool_name [WITH ({MEM_PERCENT=pct | CONTROL_GROUP="group_name" | ACTIVE_STATEMENTS=stmt | MAX_DOP = dop | MEMORY_LIMIT='memory_size' | io_limits=io_limits | io_priority='io_priority' | nodegroup="nodegroupname" | is_foreign=boolean }[, ... ])];
  • 语法格式 1 2 3 4 5 6 7 8 9101112131415 openGauss=# CREATE [ OR REPLACE ] PROCEDURE procedure_name [ ( {[ argname ] [ argmode ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ] [ { IMMUTABLE | STABLE | VOLATILE } | { SHIPPABLE | NOT SHIPPABLE } | {PACKAGE} | [ 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 | SET configuration_parameter { [ TO | = ] value | FROM CURRENT } ][ ... ] { IS | AS } plsql_body /
  • 参数说明 OR REPLACE 当存在同名的存储过程时,替换原来的定义。 procedure_name 创建的存储过程名称,可以带有模式名。 取值范围:字符串,要符合标识符的命名规范。 argmode 参数的模式。 VARIADIC用于声明数组类型的参数。 取值范围: IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的过程定义中。 argname 参数的名称。 取值范围:字符串,要符合标识符的命名规范。 argtype 参数的数据类型。可以使用%ROWTYPE间接引用表的类型,或者使用%TYPE间接引用表或复合类型中某一列的类型。 取值范围:可用的数据类型。 IMMUTABLE、STABLE等 行为约束可选项。各参数的功能与CREATE FUNCTION类似,详细说明见CREATE FUNCTION plsql_body PL/SQL存储过程体。 当在存储过程体中进行创建用户等涉及用户密码相关操作时,系统表及csv日志中会记录密码的明文。因此不建议用户在存储过程体中进行涉及用户密码的相关操作。 argname和argmode的顺序没有严格要求,推荐按照argname、argmode、argtype的顺序使用。
  • 示例 1 2 3 4 5 6 7 8 91011121314151617181920212223242526 --创建一个表tb_for_labelopenGauss=# CREATE TABLE tb_for_label(col1 text, col2 text, col3 text);--创建一个模式schema_for_labelopenGauss=# CREATE SCHEMA schema_for_label;--创建一个视图view_for_labelopenGauss=# CREATE VIEW view_for_label AS SELECT 1;--创建一个函数func_for_labelopenGauss=# CREATE FUNCTION func_for_label RETURNS TEXT AS $$ SELECT col1 FROM tb_for_label; $$ LANGUAGE SQL;--基于表创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS table_label add TABLE(public.tb_for_label);--基于列创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS column_label add COLUMN(public.tb_for_label.col1);--基于模式创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS schema_label add SCHEMA(schema_for_label);--基于视图创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS view_label add VIEW(view_for_label);--基于函数创建资源标签openGauss=# CREATE RESOURCE LABEL IF NOT EXISTS func_label add FUNCTION(func_for_label);
  • 语法格式 123 CREATE NODE GROUP groupname [WITH ( nodename [, ... ] )] [bucketcnt bucket_cnt] [ BUCKETS [ ( bucketnumber [, ... ] ) ] ] [VCGROUP] [DISTRIBUTE FROM src_group_name] [groupparent parent_group_name];
  • 参数说明 groupname 节点组名称。 取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。 节点组命名支持ASCII字符集上所有字符,但是建议用户按照标识符命名规范命名。 nodename 节点名称。 取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。 不指定该参数时,需要指定bucketcnt值,表示创建属于installation node group的child node group bucketcnt bucket_cnt bucket_cnt表示bucket桶数量。 取值范围:[32,16384),并且必须是2的幂次方。 不指定该参数时,需要指定WITH的值。 BUCKETS [ ( bucketnumber [, ... ] ) ] BUCKETS子句是集群管理工具的内部用法,该子句不建议用户直接使用,以免对集群的正常使用造成影响。 VCGROUP 创建一个逻辑集群(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)类型的节点组。 DISTRIBUTE FROM src_group_name 创建一个逻辑集群(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)节点组,用于从src_group_name指定的逻辑集群节点组重分布数据。该子句不建议用户直接使用,以免导致数据分布错误和逻辑集群不可用。 groupparent parent_group_name parent_group_name表示当前child node group所属的parent node group名字。
  • 示例 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。
  • 语法格式 1 2 3 4 5 6 7 8 9101112131415 CREATE NODE nodename WITH ( [ TYPE = nodetype,] [ HOST = hostname,] [ PORT = portnum,] [ HOST1 = 'hostname',] [ PORT1 = portnum,] [ HOSTPRIMARY [ = boolean ],] [ PRIMARY [ = boolean ],] [ PREFERRED [ = boolean ],] [ SCTP_PORT = portnum,] [ CONTROL_PORT = portnum,] [ SCTP_PORT1 = portnum,] [ CONTROL_PORT1 = portnum ] );
  • 参数说明 nodename 节点名称。 取值范围:字符串,要符合标识符的命名规范。 TYPE = nodetype 指定节点的类型。 取值范围: 'coordinator' 'datanode' HOST = hostname 指定节点对应的主机名称或者IP地址。 PORT = portnum 指定节点绑定的主机端口号。 HOST1 = hostname 指定节点对应的备机名称或者IP地址。 PORT1 = portnum 指定节点绑定的备机端口号。 HOSTPRIMARY PRIMARY = boolean 声明该节点是否为主节点。主节点允许做读写操作,否则只允许读操作。 取值范围: true false(默认值) PREFERRED = boolean 声明该节点是否为读操作的首选节点。 取值范围: true false(默认值) SCTP_PORT = portnum 主机TCP代理通信库或SCTP通信库(由于规格变更,当前版本已经不再支持本特性,请不要使用)使用的数据传输通道侦听端口,使用TCP协议侦听连接。
  • 优化建议 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索引不能超过页面大小的三分之一。 分区表上不支持创建部分索引。 在分区表上创建唯一索引时,索引项中必须包含分布列。索引项不包含分区键只能创建全局分区索引。
  • 参数说明 UNIQUE 创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将导致一个错误。 目前只有行存表B-tree及UBtree索引支持唯一索引。 CONCURRENTLY 以不阻塞DML的方式创建索引(加ShareUpdateExclusiveLock锁)。创建索引时,一般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现创建过程中不阻塞DML。 此选项只能指定一个索引的名称。 普通CREATE INDEX命令可以在事务内执行,但是CREATE INDEX CONCURRENTLY不可以在事务内执行。 列存表、分区表不支持CONCURRENTLY方式创建索引,对于临时表,支持使用CONCURRENTLY关键字创建索引,但是实际创建过程中,采用的是阻塞式的创建方式,因为没有其他会话会并发访问临时表,并且阻塞式创建成本更低。 创建索引时指定此关键字,需要执行先后两次对该表的全表扫描来完成build,第一次扫描的时候创建索引,不阻塞读写操作;第二次扫描的时候合并更新第一次扫描到目前为止发生的变更。 由于需要执行两次对表的扫描和build,而且必须等待现有的所有可能对该表执行修改的事务结束。这意味着该索引的创建比正常耗时更长,同时因此带来的CPU和I/O消耗对其他业务也会造成影响。 如果在索引构建时发生失败,那会留下一个“不可用”的索引。这个索引会被查询忽略,但它仍消耗更新开销。这种情况推荐的恢复方法是通过DROP INDEX IF EXISTS语法删除该索引并尝试再次CONCURRENTLY建索引。 由于在第二次扫描之后,索引构建必须等待任何持有早于第二次扫描拿的快照的事务终止,而且建索引时加的ShareUpdateExclusiveLock锁(4级)会和大于等于4级的锁冲突,在创建这类索引时,容易引发卡住(hang)或者死锁问题。例如: 两个会话对同一个表创建CONCURRENTLY索引,会引起死锁问题。 两个会话,一个对表创建CONCURRENTLY索引,一个drop table,会引起死锁问题。 三个会话,会话1先对表a加锁,不提交,会话2接着对表b创建CONCURRENTLY索引,会话3接着对表a执行写入操作,在会话1事务未提交之前,会话2会一直被阻塞。 创建CONCURRENTLY索引与同一个表的TRUNCATE操作并发,会引起死锁问题。 将事务隔离级别设置成可重复读(默认为读已提交),起两个会话,会话1起事务对表a执行写入操作,不提交,会话2对表b创建CONCURRENTLY索引,在会话1事务未提交之前,会话2会一直被阻塞。 索引构建过程中或者构建失败的情况下,需要确认索引进度或状态,可以通过查询函数gs_get_index_status('schema_name', 'index_name')来确认当前所有节点上索引的状态,其中入参为schema_name和index_name,分别用来指定索引的模式名称和索引名称,返回值为node_name,indisready和indisvalid,分别表示节点名称,索引在该节点上是否可插入,以及索引在该节点上是否可用,只有当所有节点indisready和indisvalid均为true的情况下,索引才是“可用的”,否则请等待索引创建完成,或者构建失败情况下,删除索引重新创建。 schema_name 模式的名称。 取值范围:已存在模式名。 index_name 要创建的索引名,不能包含模式名,索引的模式与表相同。 取值范围:字符串,要符合标识符的命名规范。 table_name 需要为其创建索引的表的名称,可以用模式修饰。 取值范围:已存在的表名。 USING method 指定创建索引的方法。 取值范围: btree:B-tree索引使用一种类似于B+树的结构来存储数据的键值,通过这种结构能够快速的查找索引。btree适合支持比较查询以及查询范围。 gin:GIN索引是倒排索引,可以处理包含多个键的值(比如数组)。 gist:Gist索引适用于几何和地理等多维数据类型和集合数据类型。 Psort:Psort索引。针对列存表进行局部排序索引。 行存表支持的索引类型:btree(行存表缺省值)、gin、gist。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。全局临时表不支持GIN索引和Gist索引。 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排序时,本选项为默认的。 WITH ( {storage_parameter = value} [, ... ] ) 指定索引方法的存储参数。 取值范围: 只有GIN索引支持FASTUPDATE,GIN_PENDING_LIST_LIMIT参数。GIN和Psort之外的索引都支持FILLFACTOR参数。 FILLFACTOR 一个索引的填充因子(fillfactor)是一个介于10和100之间的百分数。 取值范围:10~100 FASTUPDATE GIN索引是否使用快速更新。 取值范围:ON,OFF 默认值:ON GIN_PENDING_LIST_LIMIT 当GIN索引启用fastupdate时,设置该索引pending list容量的最大值。 取值范围:64~2147483647‬,单位KB。 默认值:gin_pending_list_limit的默认取决于GUC中gin_pending_list_limit的值(默认为4MB) CROSSBUCKET 索引是否使用跨hashbucket索引。仅支持B-Tree索引。 取值范围:ON,OFF 默认值:ON 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 索引分区的名称。 取值范围:字符串,要符合标识符的命名规范。 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索引时不支持创建部分索引。
  • 语法格式 在表上创建索引。 12345 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [schemaname.]index_name ] ON table_name [ USING method ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ]; 在分区表上创建索引。 123456 CREATE [ UNIQUE ] INDEX [ [schemaname.]index_name ] ON table_name [ USING method ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ LOCAL [ ( { PARTITION index_partition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] | GLOBAL ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ] [ WHERE predicate ];
  • 注意事项 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 在分区表上创建唯一索引时,索引项必须包含分布列。索引项不包含分区键只能创建全局分区索引。 列存表支持的PSORT和B-tree索引都不支持创建表达式索引、部分索引和唯一索引。 列存表支持的GIN索引支持创建表达式索引,但表达式不能包含空分词、空列和多列,不支持创建部分索引和唯一索引。 被授予CREATE ANY INDEX权限的用户,可以在public模式和用户模式下创建索引。 如果表达式索引中调用的是用户自定义函数,按照函数创建者权限执行表达式索引函数。
共100000条