华为云用户手册

  • 示例 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 --创建模式ot。postgres=# CREATE SCHEMA ot;--创建表ot.t1及其同义词t1。postgres=# CREATE TABLE ot.t1(id int, name varchar2(10)) DISTRIBUTE BY hash(id);postgres=# CREATE OR REPLACE SYNONYM t1 FOR ot.t1;--使用同义词t1。postgres=# SELECT * FROM t1;postgres=# INSERT INTO t1 VALUES (1, 'ada'), (2, 'bob');postgres=# UPDATE t1 SET t1.name = 'cici' WHERE t1.id = 2;--创建同义词v1及其关联视图ot.v_t1。postgres=# CREATE SYNONYM v1 FOR ot.v_t1;postgres=# CREATE VIEW ot.v_t1 AS SELECT * FROM ot.t1;--使用同义词v1。postgres=# SELECT * FROM v1;--创建重载函数ot.add及其同义词add。postgres=# CREATE OR REPLACE FUNCTION ot.add(a integer, b integer) RETURNS integer AS$$SELECT $1 + $2$$LANGUAGE sql;postgres=# CREATE OR REPLACE FUNCTION ot.add(a decimal(5,2), b decimal(5,2)) RETURNS decimal(5,2) AS$$SELECT $1 + $2$$LANGUAGE sql;postgres=# CREATE OR REPLACE SYNONYM add FOR ot.add;--使用同义词add。postgres=# SELECT add(1,2);postgres=# SELECT add(1.2,2.3);--创建存储过程ot.register及其同义词register。postgres=# CREATE PROCEDURE ot.register(n_id integer, n_name varchar2(10))SECURITY INVOKERASBEGIN INSERT INTO ot.t1 VALUES(n_id, n_name);END;/postgres=# CREATE OR REPLACE SYNONYM register FOR ot.register;--使用同义词register,调用存储过程。postgres=# CALL register(3,'mia');--删除同义词。postgres=# DROP SYNONYM t1;postgres=# DROP SYNONYM IF EXISTS v1;postgres=# DROP SYNONYM IF EXISTS add;postgres=# DROP SYNONYM register;postgres=# DROP SCHEMA ot CASCADE;
  • 注意事项 定义同义词的用户成为其所有者。 若指定模式名称,则同义词在指定模式中创建。否则,在当前模式创建。 支持通过同义词访问的数据库对象包括:表、视图、函数和存储过程。 使用同义词时,用户需要具有对关联对象的相应权限。 支持使用同义词的DML语句包括:SELECT、INSERT、UPDATE、DELETE、EXPLAIN、CALL。 不支持关联函数或存储过程的CREATE SYNONYM语句出现在存储过程中,建议存储过程中使用系统表pg_synonym中已存在的同义词对象。
  • 参数说明 server_name server的名称。 取值范围:长度必须小于等于63。 FOREIGN DATA WRAPPER fdw_name 指定外部数据封装器的名称。 取值范围:fdw_name是数据库初始化时系统创建的数据封装器,对于其他同构集群,fdw_name为gc_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。postgres=# 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。postgres=# DROP SERVER obs_server; 建立另外一个同构集群的server,其中gc_fdw为数据库中存在的foreign data wrapper。 1 2 3 4 5 6 7 8 910 --创建server。postgres=# 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。postgres=# DROP SERVER server_remote; 相关链接 ALTER SERVER, DROP SERVER
  • 注意事项 Sequence是一个存放等差数列的特殊表,该表受DBMS控制。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。
  • 语法格式 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 } ];
  • 参数说明 name 将要创建的序列名称。 取值范围: 仅可以使用小写字母(a~z)、 大写字母(A~Z),数字和特殊字符"#","_","$"的组合。 increment 指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。 缺省值为1。 MINVALUE minvalue | NO MINVALUE| NOMINVALUE 执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。NOMINVALUE等价于NO MINVALUE MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE 执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE start 指定序列的起始值。缺省值:对于递增序列为minvalue,递减序列为maxvalue。 cache 为了快速访问,而在内存中预先存储序列号的个数。 缺省值为1,表示一次只能生成一个值,也就是没有缓存。 不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。如对并发性能有要求,请同时参考guc参数session_sequence_cache。 cache指定了单CN/DN一次向GTM中申请的值;session_sequence_cache指定的是单个会话一次向CN/DN申请缓存的值,会话结束后会自动丢弃。 CYCLE 用于使序列达到maxvalue或者minvalue后可循环并继续下去。 如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。 NOCYCLE的作用等价于NO CYCLE。 缺省值为NO CYCLE。 若定义序列为CYCLE,则不能保证序列的唯一性。 OWNED BY- 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需要注意的是,通过指定OWNED BY,仅仅是建立了表的对应列和sequence之间关联关系,并不会在插入数据时在该列上产生自增序列。 缺省值为OWNED BY NONE,表示不存在这样的关联。 通过OWNED BY创建的Sequence不建议用于其他表,如果希望多个表共享Sequence,该Sequence不应该从属于特定表。
  • 示例 创建一个名为serial的递增序列,从101开始: 123 postgres=# CREATE SEQUENCE serial START 101 CACHE 20; 从序列中选出下一个数字: 1234 postgres=# SELECT nextval('serial'); nextval --------- 101 从序列中选出下一个数字: 1234 postgres=# SELECT nextval('serial'); nextval --------- 102 创建与表关联的序列: 1 2 3 4 5 6 7 8 910111213141516171819202122232425 postgres=# 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) );postgres=# CREATE SEQUENCE serial1 START 101 CACHE 20OWNED BY customer_address.ca_address_sk;--删除序列postgres=# DROP TABLE customer_address;postgres=# DROP SEQUENCE serial cascade;postgres=# DROP SEQUENCE serial1 cascade;
  • 功能描述 对表创建行访问控制策略。 当对表创建了行访问控制策略,只有打开该表的行访问控制开关(ALTER TABLE ... ENABLE ROW LEVEL SECURITY),策略才能生效。否则不生效。 当前行访问控制影响数据表的读取操作(SELECT、UPDATE、DELETE),暂不影响数据表的写入操作(INSERT、MERGE INTO)。表所有者或系统管理员可以在USING子句中创建表达式,在客户端执行数据表读取操作时,数据库后台在查询重写阶段会将满足条件的表达式拼接并应用到执行计划中。针对数据表的每一条元组,当USING表达式返回TRUE时,元组对当前用户可见,当USING表达式返回FALSE或NULL时,元组对当前用户不可见。 行访问控制策略名称是针对表的,同一个数据表上不能有同名的行访问控制策略;对不同的数据表,可以有同名的行访问控制策略。 行访问控制策略可以应用到指定的操作(SELECT、UPDATE、DELETE、ALL),ALL表示会影响SELECT、UPDATE、DELETE三种操作;定义行访问控制策略时,若未指定受影响的相关操作,默认为ALL。 行访问控制策略可以应用到指定的用户(角色),也可应用到全部用户(PUBLIC);定义行访问控制策略时,若未指定受影响的用户,默认为PUBLIC。
  • 语法格式 12345 CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name [ AS { PERMISSIVE | RESTRICTIVE } ] [ FOR { ALL | SELECT | UPDATE | DELETE } ] [ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ] USING ( using_expression )
  • 参数说明 policy_name 行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。 table_name 行访问控制策略的表名。 PERMISSIVE | RESTRICTIVE PERMISSIVE指定行访问控制策略为宽容性策略,宽容性策略的条件用OR表达式拼接。RESTRICTIVE指定行访问控制策略为限制性策略,限制性策略的条件用AND表达式拼接。拼接方式如下: (using_expression_permissive_1 OR using_expression_permissive_2 ...) AND (using_expression_restrictive_1 AND using_expression_restrictive_2 ...) 缺省默认为PERMISSIVE。 command 当前行访问控制影响的SQL操作,可指定操作包括:ALL、SELECT、UPDATE、DELETE。当未指定时,ALL为默认值,涵盖SELECT、UPDATE、DELETE操作。 当command为SELECT时,SELECT类操作受行访问控制的影响,只能查看到满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括SELECT,UPDATE ... RETURNING,DELETE ... RETURNING。 当command为UPDATE时,UPDATE类操作受行访问控制的影响,只能更新满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括UPDATE, UPDATE ... RETURNING, SELECT ... FOR UPDATE/SHARE。 当command为DELETE时,DELETE类操作受行访问控制的影响,只能删除满足条件(using_expression返回值为TRUE)的元组数据,受影响的操作包括DELETE, DELETE ... RETURNING。 行访问控制策略与适配的SQL语法关系参加下表: 表1 ROW LEVEL SECURITY策略与适配SQL语法关系 Command SELECT/ALL policy UPDATE/ALL policy DELETE/ALL policy SELECT Existing row No No SELECT FOR UPDATE/SHARE Existing row Existing row No UPDATE No Existing row No UPDATE RETURNING Existing row Existing row No DELETE No No Existing row DELETE RETURNING Existing row No Existing row role_name 行访问控制影响的数据库用户。 当未指定时,PUBLIC为默认值,PUBLIC表示影响所有数据库用户,可以指定多个受影响的数据库用户。 系统管理员不受行访问控制特性影响。
  • 注意事项 支持对行存表、行存分区表、列存表、列存分区表、复制表、unlogged表、hash表定义行访问控制策略。 不支持HDFS表、外表、临时表定义行访问控制策略。 不支持对视图定义行访问控制策略。 同一张表上可以创建多个行访问控制策略,一张表最多创建100个行访问控制策略。 系统管理员不受行访问控制影响,可以查看表的全量数据。 通过SQL语句、视图、函数、存储过程查询包含行访问控制策略的表,都会受影响。
  • 示例 1 2 3 4 5 6 7 8 910111213 --创建一个角色role1。postgres=# CREATE ROLE role1 IDENTIFIED BY 'xxxxxxxxxxx';-- 为用户role1创建一个同名schema,子命令创建的表films和winners的拥有者为role1。postgres=# 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。postgres=# DROP SCHEMA role1 CASCADE;--删除用户。postgres=# DROP USER role1 CASCADE;
  • 参数说明 schema_name 模式名称。 模式名不能和当前数据库里其他的模式重名。 模式的名称不可以“pg_”开头。 取值范围:字符串,要符合标识符的命名规范。 AUTHORIZATION user_name 指定模式的所有者。当不指定schema_name时,把user_name当作模式名,此时user_name只能是角色名。 取值范围:已存在的用户名/角色名。 schema_element 在模式里创建对象的SQL语句。目前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE PARTITION、GRANT子句。 子命令所创建的对象都被AUTHORIZATION子句指定的用户所拥有。 如果当前搜索路径上的模式中存在同名对象时,需要明确指定引用对象所在的模式。可以通过命令SHOW SEARCH_PATH来查看当前搜索路径上的模式。
  • 示例 本示例假定用户已预先成功创建控制组。 1 2 3 4 5 6 7 8 9101112131415161718192021 --创建一个默认资源池,其控制组为"DefaultClass"组下属的"Medium" Timeshare Workload控制组。postgres=# CREATE RESOURCE POOL pool1;-- 创建一个资源池,其控制组指定为"DefaultClass"组下属的"High" Timeshare Workload控制组。postgres=# CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High");-- 创建一个资源池,其控制组指定为"class1"组下属的"Low" Timeshare Workload控制组。postgres=# CREATE RESOURCE POOL pool3 WITH (CONTROL_GROUP="class1:Low");-- 创建一个资源池,其控制组指定为"class1"组下属的"wg1" Workload控制组。postgres=# CREATE RESOURCE POOL pool4 WITH (CONTROL_GROUP="class1:wg1");-- 创建一个资源池,其控制组指定为"class1"组下属的"wg2" Workload控制组。postgres=# CREATE RESOURCE POOL pool5 WITH (CONTROL_GROUP="class1:wg2:3");--删除资源池。postgres=# DROP RESOURCE POOL pool1;postgres=# DROP RESOURCE POOL pool2;postgres=# DROP RESOURCE POOL pool3;postgres=# DROP RESOURCE POOL pool4;postgres=# 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 }[, ... ])];
  • 参数说明 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 9101112131415 postgres=# CREATE [ OR REPLACE ] PROCEDURE procedure_name [ ( {[ argmode ] [ argname ] 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 参数的数据类型。 取值范围:可用的数据类型。 IMMUTABLE、STABLE等 行为约束可选项。各参数的功能与CREATE FUNCTION类似,详细说明见CREATE FUNCTION plsql_body PL/SQL存储过程体。 当在存储过程体中进行创建用户等涉及用户密码相关操作时,系统表及csv日志中会记录密码的明文。因此不建议用户在存储过程体中进行涉及用户密码的相关操作。 argument_name和argmode的顺序没有严格要求,推荐按照argument_name、argmode、argument_type的顺序使用。
  • 注意事项 如果创建存储过程时参数或返回值带有精度,不进行精度检测。 创建存储过程时,存储过程定义中对表对象的操作建议都显示指定模式,否则可能会导致存储过程执行异常。 在创建存储过程时,存储过程内部通过SET语句设置current_schema和search_path无效。执行完函数search_path和current_schema与执行函数前的search_path和current_schema保持一致。 如果存储过程参数中带有出参,SELECT调用存储过程必须缺省出参,CALL调用存储过程时调用非重载函数必须指定出参,对于重载的package函数,out参数可以缺省,具体信息参见CALL的示例。 存储过程指定package属性时支持重载。 在创建procedure时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 函数定义时如果指定为IMMUTABLE和SHIPPABLE类型,应该尽量避免函数中存在INSERT,UPDATE,DELETE,MERGE和DDL操作,因为上述操作应该由CN判断对应的执行节点,否则执行结果可能产生错误。 存储过程中不支持需要return集合的操作。 在存储过程内部调用其它无参数的存储过程时,可以省略括号,直接使用存储过程名进行调用。
  • 示例 1 2 3 4 5 6 7 8 91011121314151617181920212223242526 --创建一个表tb_for_labelpostgres=# CREATE TABLE tb_for_label(col1 text, col2 text, col3 text);--创建一个模式schema_for_labelpostgres=# CREATE SCHEMA schema_for_label;--创建一个视图view_for_labelpostgres=# CREATE VIEW view_for_label AS SELECT 1;--创建一个函数func_for_labelpostgres=# CREATE FUNCTION func_for_label RETURNS TEXT AS $$ SELECT col1 FROM tb_for_label; $$ LANGUAGE SQL;--基于表创建资源标签postgres=# CREATE RESOURCE LABEL IF NOT EXISTS table_label add TABLE(public.tb_for_label);--基于列创建资源标签postgres=# CREATE RESOURCE LABEL IF NOT EXISTS column_label add COLUMN(public.tb_for_label.col1);--基于模式创建资源标签postgres=# CREATE RESOURCE LABEL IF NOT EXISTS schema_label add SCHEMA(schema_for_label);--基于视图创建资源标签postgres=# CREATE RESOURCE LABEL IF NOT EXISTS view_label add VIEW(view_for_label);--基于函数创建资源标签postgres=# CREATE RESOURCE LABEL IF NOT EXISTS func_label add FUNCTION(func_for_label);
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233 --将tpcds.ship_mode中的数据拷贝到/home/omm/ds_ship_mode.dat文件中。postgres=# COPY tpcds.ship_mode TO '/home/omm/ds_ship_mode.dat';--将tpcds.ship_mode 输出到stdout。postgres=# COPY tpcds.ship_mode TO stdout;--创建tpcds.ship_mode_t1表。postgres=# CREATE TABLE tpcds.ship_mode_t1( SM_SHIP_MODE_SK INTEGER NOT NULL, SM_SHIP_MODE_ID CHAR(16) NOT NULL, SM_TYPE CHAR(30) , SM_CODE CHAR(10) , SM_CARRIER CHAR(20) , SM_CONTRACT CHAR(20))WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)DISTRIBUTE BY HASH(SM_SHIP_MODE_SK );--从stdin拷贝数据到表tpcds.ship_mode_t1。postgres=# COPY tpcds.ship_mode_t1 FROM stdin;--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1。postgres=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat';--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为TEXT(format 'text'),分隔符为'\t'(delimiter E'\t'),忽略多余列(ignore_extra_data 'true'),不指定转义(noescaping 'true')。postgres=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' WITH(format 'text', delimiter E'\t', ignore_extra_data 'true', noescaping 'true');--从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header)。postgres=# COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' FIXED FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)) header ignore_extra_data;--删除tpcds.ship_mode_t1。postgres=# DROP TABLE tpcds.ship_mode_t1;
  • 注意事项 执行COPY FROM FILENAME或COPY TO FILENAME语句需要SYSADMIN权限,但默认禁止SYSADMIN用户对数据库配置文件,密钥文件,证书文件和审计日志执行COPY FROM FILENAME或COPY TO FILENAME,以防止SYSADMIN用户越权查看或修改敏感文件。放开这一权限需要通过更改enable_copy_server_files的设定来完成。 COPY只能用于表,不能用于视图。 对任何要插入数据的表必须有插入权限。 如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。如果表中有任何不在字段列表里的字段,COPY FROM将为那些字段插入缺省值。 如果声明了数据源文件,服务器必须可以访问该文件;如果指定了STDIN,数据将在客户前端和服务器之间流动,输入时,表的列与列之间使用TAB键分隔,在新的一行中以反斜杠和句点(\.)表示输入结束。 如果数据文件的任意行包含比预期多或者少的字段,COPY FROM将抛出一个错误。 数据的结束可以用一个只包含反斜杠和句点(\.)的行表示。如果从文件中读取数据,数据结束的标记是不必要的;如果在客户端应用之间拷贝数据,必须要有结束标记。 COPY FROM中\N为空字符串,如果要输入实际数据值\N ,使用\\N。
  • 语法格式 从一个文件拷贝数据到一个表。 123456789 COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | STDIN } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ LOG ERRORS ] [ REJECT LIMIT 'limit' ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ ( option [, ...] ) | copy_option [ ...] ] 可以任意排列组合。 把一个表的数据拷贝到一个文件。 1 2 3 4 5 6 7 8 91011121314 COPY table_name [ ( column_name [, ...] ) ] TO { 'filename' | STDOUT } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ];COPY query TO { 'filename' | STDOUT } [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; COPY TO语法形式约束如下: (query)与[USING] DELIMITER不兼容,即若COPY TO的数据来自于一个query的查询结果,那么COPY TO语法不能再指定[USING] DELIMITERS语法子句。 对于FIXED FORMATTTER语法后面跟随的copy_option是以空格进行分隔的。 copy_option是指COPY原生的参数形式,而option是兼容外表导入的参数形式。 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ ( option [, ...] ) | copy_option [ ...] ] 可以任意排列组合。 其中可选参数option子句语法为: 1 2 3 4 5 6 7 8 9101112131415161718192021 FORMAT 'format_name'| OIDS [ boolean ]| DELIMITER 'delimiter_character'| NULL 'null_string'| HEADER [ boolean ]| FILEHEADER 'header_file_string'| FREEZE [ boolean ]| QUOTE 'quote_character'| ESCAPE 'escape_character'| EOL 'newline_character'| NOESCAPING [ boolean ]| FORCE_QUOTE { ( column_name [, ...] ) | * }| FORCE_NOT_NULL ( column_name [, ...] )| ENCODING 'encoding_name'| IGNORE_EXTRA_DATA [ boolean ]| FILL_MISSING_FIELDS [ boolean ]| COMPATIBLE_ILLEGAL_CHARS [ boolean ]| DATE_FORMAT 'date_format_string'| TIME_FORMAT 'time_format_string'| TIMESTAMP_FORMAT 'timestamp_format_string'| SMALLDATETIME_FORMAT 'smalldatetime_format_string' 其中可选参数copy_option子句语法为: 1 2 3 4 5 6 7 8 91011121314151617181920 OIDS | NULL 'null_string' | HEADER | FILEHEADER 'header_file_string' | FREEZE | FORCE_NOT_NULL column_name [, ...]| FORCE_QUOTE { column_name [, ...] | * }| BINARY | CS V | QUOTE [ AS ] 'quote_character' | ESCAPE [ AS ] 'escape_character' | EOL 'newline_character'| ENCODING 'encoding_name' | IGNORE_EXTRA_DATA | FILL_MISSING_FIELDS| COMPATIBLE_ILLEGAL_CHARS | DATE_FORMAT 'date_format_string' | TIME_FORMAT 'time_format_string' | TIMESTAMP_FORMAT 'timestamp_format_string' | SMALLDATETIME_FORMAT 'smalldatetime_format_string'
  • 优化建议 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后的字段。 约束限制: 分区表上不支持创建部分索引、不支持NULL FIRST特性。 在分区表上创建唯一索引时,索引项中必须包含分布列和所有分区键。
  • 参数说明 UNIQUE 创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将导致一个错误。 目前只有行存表B-tree索引支持唯一索引。 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。 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) TABLESPACE tablespace_name 指定索引的表空间,如果没有声明则使用默认的表空间。 取值范围:已存在的表空间名。 WHERE predicate 创建一个部分索引。部分索引是一个只包含表的一部分记录的索引,通常是该表中比其他部分数据更有用的部分。例如,有一个表,表里包含已记账和未记账的定单,未记账的定单只占表的一小部分而且这部分是最常用的部分,此时就可以通过只在未记账部分创建一个索引来改善性能。另外一个可能的用途是使用带有UNIQUE的WHERE强制一个表的某个子集的唯一性。 取值范围:predicate表达式只能引用表的字段,它可以使用所有字段,而不仅是被索引的字段。目前,子查询和聚集表达式不能出现在WHERE子句里。 PARTITION index_partition_name 索引分区的名称。 取值范围:字符串,要符合标识符的命名规范。 TABLESPACE index_partition_tablespace 索引分区的表空间。 取值范围:如果没有声明,将使用分区表索引的表空间index_tablespace。
  • 语法格式 在表上创建索引。 12345 CREATE [ UNIQUE ] INDEX [ [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 ]; 在分区表上创建索引。 12345 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 ] } [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ];
  • 功能描述 在指定的表上创建索引。 索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如分区表上不支持并行创建索引、不支持创建部分索引、不支持NULL FIRST特性。
  • 注意事项 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 在分区表上创建唯一索引时,索引项中必须包含分布列和所有分区键。 列存表支持的PSORT和B-tree索引都不支持创建表达式索引、部分索引和唯一索引。 列存表支持的GIN索引支持创建表达式索引,但表达式不能包含空分词、空列和多列,不支持创建部分索引和唯一索引。
  • 示例 1 2 3 4 5 6 7 8 9101112131415 --建立外表,用来以TEXT格式导入GDS服务器192.168.0.90和192.168.0.91上的数据,导入过程错误信息将记录到err_HR_staffS中。postgres=# 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'\x08', 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'\x08', null '',reject_limit '2') WITH err_HR_staffS_ft3; 1 2 3 4 5 6 7 8 9101112131415 --建立外表,用来以CSV格式导入input_data目录下存放在各个节点名文件下的所有文件。postgres=# 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目录下。postgres=# 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 --删除外表。postgres=# DROP FOREIGN TABLE foreign_HR_staffS;postgres=# DROP FOREIGN TABLE foreign_HR_staffS_ft1;postgres=# DROP FOREIGN TABLE foreign_HR_staffS_ft2;postgres=# DROP FOREIGN TABLE foreign_HR_staffS_ft3;
共100000条