华为云用户手册

  • 选择分布列 Hash分布表的分布列选取至关重要,需要满足以下原则: 列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列。 在满足上述条件的情况下,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量。 对于Hash分表策略,如果分布列选择不当,可能导致数据倾斜,查询时出现部分DN的I/O短板,从而影响整体查询性能。因此在采用Hash分表策略之后需对表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。可以使用以下SQL检查数据倾斜性 1 2 3 4 5 select xc_node_id, count(1) from tablename group by xc_node_id order by xc_node_id desc; 其中xc_node_id对应DN,一般来说,不同DN的数据量相差5%以上即可视为倾斜,如果相差10%以上就必须要调整分布列。 GaussDB 支持多分布列特性,可以更好地满足数据分布的均匀性要求。 Range/List分布表的分布列由用户根据实际需要进行选择。 父主题: 表设计最佳实践
  • 参数说明 SESSION 声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。 如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。 LOCAL 声明的参数只在当前事务中有效。在COMMIT或ROLLBACK之后,会话级别的设置将再次生效。 不论事务是否提交,此命令的影响只持续到当前事务结束。一个特例是:在一个事务里面,即有SET命令,又有SET LOCAL命令,且SET LOCAL在SET后面,则在事务结束之前,SET LOCAL命令会起作用,但事务提交之后,则是SET命令会生效。 TIME ZONE timezone 用于指定当前会话的本地时区。 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 CURRENT_SCHEMA schema CURRENT_SCHEMA用于指定当前的模式。 取值范围:已存在模式名称。 SCHEMA schema 同CURRENT_SCHEMA。此处的schema是个字符串。 例如:set schema 'public'; NAMES encoding_name 用于设置客户端的字符编码。等价于set client_encoding to encoding_name。 取值范围:有效的字符编码。该选项对应的运行时参数名称为client_encoding,默认编码为UTF8。 XML OPTION option 用于设置XML的解析方式。 取值范围:CONTENT(缺省)、DOCUMENT config_parameter 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。 部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。 value config_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。
  • 语法格式 设置所处的时区。 1 SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }; 设置所属的模式。 1 2 3 SET [ SESSION | LOCAL ] {CURRENT_SCHEMA { TO | = } { schema | DEFAULT } | SCHEMA 'schema'}; 设置客户端编码集。 1 SET [ SESSION | LOCAL ] NAMES encoding_name; 设置XML的解析方式。 1 SET [ SESSION | LOCAL ] XML OPTION { DOCUMENT | CONTENT }; 设置其他运行时参数。 1 2 3 SET [ LOCAL | SESSION ] { {config_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }}};
  • 参数说明 statement 指定要分析的SQL语句。 ANALYZE boolean | ANALYSE boolean 显示实际运行时间和其他统计数据。 取值范围: TRUE(缺省值):显示实际运行时间和其他统计数据。 FALSE:不显示。 VERBOSE boolean 显示有关计划的额外信息。 取值范围: TRUE(缺省值):显示额外信息。 FALSE:不显示。 COSTS boolean 包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。 取值范围: TRUE(缺省值):显示估计总成本和宽度。 FALSE:不显示。 CPU boolean 打印CPU的使用情况的信息。 取值范围: TRUE(缺省值):显示CPU的使用情况。 FALSE:不显示。 DETAIL boolean 打印DN上的信息。 取值范围: TRUE(缺省值):打印DN的信息。 FALSE:不打印。 NODES boolean 打印query执行的节点信息。 取值范围: TRUE(缺省值):打印执行的节点的信息。 FALSE:不打印。 NUM_NODES boolean 打印执行中的节点的个数信息。 取值范围: TRUE(缺省值):打印DN个数的信息。 FALSE:不打印。 BUFFERS boolean 包括缓冲区的使用情况的信息。 取值范围: TRUE:显示缓冲区的使用情况。 FALSE(缺省值):不显示。 TIMING boolean 包括实际的启动时间和花费在输出节点上的时间信息。 取值范围: TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。 FALSE:不显示。 PLAN boolean 是否将执行计划存储在plan_table中。当该选项开启时,会将执行计划存储在PLAN_TABLE中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。 取值范围: TRUE(缺省值):将执行计划存储在plan_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUC CES S。 FALSE:不存储执行计划,将执行计划打印到当前屏幕。 FORMAT 指定输出格式。 取值范围:TEXT,XML,JSON和YAML。 默认值:TEXT。 PERFORMANCE 使用此选项时,即打印执行中的所有相关信息。
  • 功能描述 显示SQL语句的执行计划。 执行计划将显示SQL语句所引用的表会采用什么样的扫描方式,如:简单的顺序扫描、索引扫描等。如果引用了多个表,执行计划还会显示用到的JOIN算法。 执行计划的最关键的部分是语句的预计执行开销,这是计划生成器估算执行该语句将花费多长的时间。 若指定了ANALYZE选项,则该语句会被执行,然后根据实际的运行结果显示统计数据,包括每个计划节点内时间总开销(毫秒为单位)和实际返回的总行数。这对于判断计划生成器的估计是否接近现实非常有用。
  • 语法格式 显示SQL语句的执行计划,支持多种选项,对选项顺序无要求。 1 EXPLAIN [ ( option [, ...] ) ] statement; 其中选项option子句的语法为。 1 2 3 4 5 6 7 8 9 10 11 12 ANALYZE [ boolean ] | ANALYSE [ boolean ] | VERBOSE [ boolean ] | COSTS [ boolean ] | CPU [ boolean ] | DETAIL [ boolean ] | NODES [ boolean ] | NUM_NODES [ boolean ] | BUFFERS [ boolean ] | TIMING [ boolean ] | PLAN [ boolean ] | FORMAT { TEXT | XML | JSON | YAML } 显示SQL语句的执行计划,且要按顺序给出选项。 1 EXPLAIN { [ { ANALYZE | ANALYSE } ] [ VERBOSE ] | PERFORMANCE } statement;
  • 优化说明 通常优化器总会选择最优的执行计划,但是众所周知代价估算,尤其是中间结果集的代价估算一般会有比较大的偏差,这种比较大的偏差就可能会导致agg的计算方式出现比较大的偏差,这时候就需要通过best_agg_plan进行agg计算模型的干预。 一般来说,当agg汇聚的收敛度很小时,即结果集的个数在agg之后并没有明显变少时(经验上以5倍为临界点),选择redistribute+hashagg执行方式,否则选择hashagg+redistribute+hashagg执行方式。
  • 示例3:Private策略导入 假设集群共有4台主机,8个主DN,即每个主机上有2个主DN。待导入数据文件有8个,每个50MB。文件格式为 CS V。 使用如下命令连接数据库。 gsql -d postgres -p 8000 postgres为需要连接的数据库名称,8000为CN的端口号。 连接成功后,系统显示类似如下信息: gsql ((GaussDB Kernel VxxxRxxxCxx build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. postgres=# 查询各主机上的DN名称。 1 postgres=# SELECT node_name,node_host FROM pgxc_node WHERE node_type='D'; 示例: 1 2 3 4 5 6 7 8 9 10 11 12 postgres=# SELECT node_name,node_host FROM pgxc_node WHERE node_type='D'; node_name | node_host --------------+---------------- dn_6001_6002 | 192.168.0.11 dn_6003_6004 | 192.168.0.11 dn_6005_6006 | 192.168.0.12 dn_6007_6008 | 192.168.0.12 dn_6009_6010 | 192.168.0.13 dn_6011_6012 | 192.168.0.13 dn_6013_6014 | 192.168.0.14 dn_6015_6016 | 192.168.0.14 (8 rows) 将数据源文件上传每个DN所在的主机。 以普通用户登录集群的每台主机,创建数据文件存放目录“/input_data”,以及以该主机上“DN名称”命名的子目录。 以3.查询各主机上的DN名称。所查到的IP为“192.168.0.11”的节点为例,创建数据存放目录。根据上一步骤查询所得,该节点上存在2个DN,名称分别为“dn_6001_6002”和“dn_6003_6004”。 mkdir -p /input_data mkdir -p /input_data/dn_6001_6002 mkdir -p /input_data/dn_6003_6004 将数据源文件均匀分发到集群各主机上一步骤中所创建的子目录中。 修改各主机上待导入数据源文件及数据文件目录“/input_data”的属主为omm。 chown -R omm:dbgrp /input_data 创建导入的目标表reasons。 1 2 3 4 5 6 postgres=# CREATE TABLE reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ); 创建外表foreign_tpcds_reasons用于接收数据。 其中设置的导入模式信息如下所示: 导入模式为Private模式。 由于数据源文件存放在集群节点上以DN名命令的文件夹下,可以以本地文件方式访问,所以设置参数“location”为“file:///input_data/*”。 设置的数据格式信息是根据导出时设置的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 字段分隔符(delimiter)为逗号。 引号字符(quote)为0x1b。 数据文件中空值(null)为没有引号的空字符串。 设置的导入容错性如下所示: 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息( LOG INTO error_table_name)写入表err_tpcds_reasons。 1 2 3 4 5 6 7 postgres=# CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (location 'file:///input_data/*', format 'CSV', mode 'private', delimiter ',', quote E'\x1b', null '')LOG INTO err_tpcds_reasonS PER NODE REJECT LIMIT 'unlimited'; 将数据导入reasons。 1 postgres=# INSERT INTO reasons SELECT * FROM foreign_tpcds_reasons; 查询错误信息表err_tpcds_reasons,处理数据加载错误。详细请参见处理错误表。 1 postgres=# SELECT * FROM err_tpcds_reasons; 父主题: 示例
  • 步骤4:将数据导入GaussDB 使用如下语句在GaussDB中创建目标表product_info,用于存储导入的数据。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 postgres=# DROP TABLE IF EXISTS product_info; postgres=# CREATE TABLE product_info ( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) WITH ( orientation = column, compression=middle ) DISTRIBUTE BY hash (product_id); (可选)本例步骤1中没有创建索引,不用执行这一步。若目标表存在索引,在数据导入过程中,将增量更新索引信息,影响数据导入性能。建议在执行数据导入前,先删除目标表的索引。在数据导入完成后,再重新创建索引。 假定在导入表“product_info”上的“product_id”字段上存在普通索引“product_idx”。在执行数据导入前,请先删除相关索引。 1 postgres=# DROP INDEX product_idx; 在数据导入完成后,重建索引。 1 postgres=# CREATE INDEX product_idx ON product_info(product_id); 打开enable_stream_operator。 1 postgres=# set enable_stream_operator=on;; 在重建索引过程中,用户可以通过临时增加GUC参数“maintenance_work_mem”/“psort_work_mem”来加快索引的重建。 外表的并行导入需要开启stream算子才能够使用。 enable_stream_operator设置为on会影响性能,如果该会话后续还有别的sql执行,建议设置set enable_stream_operator=off,如果没有,则直接断开会话即可。 将数据源文件中的数据通过外表“product_info_ext”导入到表“product_info”中。 1 postgres=# INSERT INTO product_info SELECT * FROM product_info_ext ; 出现以下信息,说明数据导入成功。 1 INSERT 0 20 执行SELECT命令查询目标表product_info,查看导入到GaussDB中的数据。 1 postgres=# SELECT count(*) FROM product_info; 查询结果显示结果如下,表示导入成功。 1 2 3 4 count ------- 20 (1 row) 父主题: 教程:使用GDS从远端服务器导入数据
  • syslog_facility 参数说明:log_destination设置为syslog时,syslog_facility配置使用syslog记录日志的“设备”。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:枚举类型,有效值有local0、local1、local2、local3、local4、local5、local6、local7。 默认值:local0
  • log_truncate_on_rotation 参数说明:logging_collector设置为on时,log_truncate_on_rotation设置日志消息的写入方式。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 示例如下: 假设日志需要保留7天,每天生成一个日志文件,日志文件名设置为server_log.Mon、server_log.Tue等。第二周的周二生成的日志消息会覆盖写入到server_log.Tue。设置方法:将log_filename设置为server_log.%a ,log_truncate_on_rotation设置为on,log_rotation_age设置为1440,即日志有效时间为1天。 取值范围: 布尔型 on表示GaussDB以覆盖写入的方式写服务器日志消息。 off表示GaussDB将日志消息附加到同名的现有日志文件上。 默认值:off
  • log_destination 参数说明:GaussDB支持多种方法记录服务器日志,log_destination的取值为一个逗号分隔开的列表(如log_destination="stderr,csvlog")。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:字符串 有效值为stderr、csvlog、syslog、eventlog。 取值为stderr,表示日志打印到屏幕。 取值为csvlog,表示日志的输出格式为“逗号分隔值”即CSV (Comma Separated Value)格式。使用csvlog记录日志的前提是将logging_collector设置为on,请参见使用CSV格式写日志。 取值为syslog,表示通过操作系统的syslog记录日志。 GaussDB使用 syslog的LOCAL0 ~ LOCAL7记录日志,请参见syslog_facility。使用syslog记录日志需在操作系统后台服务配置文件中添加代码: 1 local0.* /var/log/postgresql 默认值:stderr
  • log_rotation_age 参数说明:logging_collector设置为on时,log_rotation_age决定创建一个新日志文件的时间间隔。当现在的时间减去上次创建一个服务器日志的时间超过了log_rotation_age的值时,将生成一个新的日志文件。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:整型,0 ~ 35791394,单位为min。其中0表示关闭基于时间的新日志文件的创建。 默认值:1d(即1440min)
  • log_rotation_size 参数说明:logging_collector设置为on时,log_rotation_size决定服务器日志文件的最大容量。当日志消息的总量超过日志文件容量时,服务器将生成一个新的日志文件。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:整型,0 ~ 2097151,单位为KB。 0表示关闭基于容量的新日志文件的创建。 默认值:20MB
  • logging_collector 参数说明:控制开启后端日志收集进程logger进行日志收集。该进程捕获发送到stderr或csvlog的日志消息并写入日志文件。 这种记录日志的方法比将日志记录到syslog更加有效,因为某些类型的消息在syslog的输出中无法显示。例如动态链接库加载失败消息和脚本(例如archive_command)产生的错误消息。 该参数属于POSTMASTER类型参数,请参考重设参数中对应设置方法进行设置。 将服务器日志发送到stderr时可以不使用logging_collector参数,此时日志消息会被发送到服务器的stderr指向的空间。这种方法的缺点是日志回滚困难,只适用于较小的日志容量。 取值范围:布尔型 on表示开启日志收集功能。 off表示关闭日志收集功能。 默认值:on
  • log_filename 参数说明:logging_collector设置为on时,log_filename决定服务器运行日志文件的名称。通常日志文件名是按照strftime模式生成,因此可以用系统时间定义日志文件名,用%转义字符实现,仅sysadmin用户可以访问。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 建议使用%转义字符定义日志文件名称,否则难以对日志文件进行有效的管理。 当log_destination设为csvlog时,系统会生成附加了时间戳的日志文件名,文件格式为csv格式,例如“server_log.1093827753.csv”。 取值范围:字符串 默认值:postgresql-%Y-%m-%d_%H%M%S.log
  • log_file_mode 参数说明:logging_collector设置为on时,log_file_mode设置服务器日志文件的权限。在Windows系统下,此选项无效。通常log_file_mode的取值是能够被chmod和umask系统调用接受的数字。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 使用此选项前请设置log_directory,将日志存储到数据目录之外的地方。 因日志文件可能含有敏感数据,故不能将其设为对外可读。 取值范围:整型,0000~0777 (8进制计数,转化为十进制 0 ~ 511)。 0600表示只允许服务器管理员读写日志文件。 0640表示允许管理员所在用户组成员只能读日志文件。 默认值:0600
  • 停用词 停用词是很常见的词,几乎出现在每一个文档中,并且没有区分值。因此,在全文搜索的语境下可忽视它们。停用词处理逻辑和词典类型相关。例如,Ispell词典会先对标记进行规范化,然后再查看停用词表,而Snowball词典会最先检查输入标记是否为停用词。 例如,每个英文文本包含像a和the的单词,因此没必要将它们存储在索引中。然而,停用词影响tsvector中的位置,同时位置也会影响相关度: 1 2 3 4 postgres=# SELECT to_tsvector('english','in the list of stop words'); to_tsvector ---------------------------- 'list':3 'stop':5 'word':6 位置1、2、4是停用词,所以不显示。为包含和不包含停用词的文档计算出的排序是完全不同的: 1 2 3 4 5 6 7 8 9 postgres=# SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop')); ts_rank_cd ------------ .05 postgres=# SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop')); ts_rank_cd ------------ .1 父主题: 词典
  • 参数说明 cursor_name 将要创建的游标名。 取值范围:遵循数据库对象命名规范。 BINARY 指明游标以二进制而不是文本格式返回数据。 NO SCROLL 声明游标检索数据行的方式。 NO SCROLL:声明该游标不能用于以倒序的方式检索数据行。 未声明:根据执行计划的不同,自动判断该游标是否可以用于以倒序的方式检索数据行。 WITH HOLD WITHOUT HOLD 声明当创建游标的事务结束后,游标是否能继续使用。 WITH HOLD:声明该游标在创建它的事务结束后仍可继续使用。 WITHOUT HOLD:声明该游标在创建它的事务之外不能再继续使用,此游标将在事务结束时被自动关闭。 如果不指定WITH HOLD或WITHOUT HOLD,默认行为是WITHOUT HOLD。 query 使用SELECT或VALUES子句指定游标返回的行。 取值范围:SELECT或VALUES子句。 declare_statements 声明变量,包括变量名和变量类型,如“sales_cnt int”。 execution_statements 匿名块中要执行的语句。 取值范围:已存在的函数名称。
  • 功能描述 DECLARE命令既可以定义一个游标,用于在一个大的查询里面检索少数几行数据,也可以作为一个匿名块的开始。 本节主要描述定义为游标的用法,定义为匿名块的用法见BEGIN。 为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。 通常游标和SELECT一样返回文本格式。因为数据在系统内部是用二进制格式存储的,系统必须对数据做一定转换以生成文本格式。一旦数据是以文本形式返回,客户端应用需要把它们转换成二进制进行操作。使用FETCH语句,游标可以返回文本或二进制格式。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --建立外表,用来以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 9 10 11 12 13 14 15 --建立外表,用来以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 9 10 11 12 13 14 15 --建立外表,用来以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 9 10 11 12 13 14 15 --建立外表,用来以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; 1 2 3 4 5 --删除外表。 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;
  • 语法格式 1 2 3 4 5 6 7 8 9 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 [, ... ] ) } ];
  • 参数概览 创建外表语法提供了多个参数,常用参数分类如下。 必需参数 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...
  • 参数说明 table_name 要更新的表名,可以使用模式修饰。 取值范围:已存在的表名称。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 column_name 要修改的字段名。 支持使用目标表的别名加字段名来引用这个字段。例如: UPDATE foo AS f SET f.col_name = 'postgres'; 取值范围:已存在的字段名。 expression 赋给字段的值或表达式。 DEFAULT 用对应字段的缺省值填充该字段。 如果没有缺省值,则为NULL。 sub_query 子查询。 使用同一数据库里其他表的信息来更新一个表可以使用子查询的方法。其中SELECT子句具体介绍请参考SELECT。 from_list 一个表的表达式列表,允许在WHERE条件里使用其他表的字段。与在一个SELECT语句的FROM子句里声明表列表类似。 目标表不能出现在from_list里,除非在使用一个自连接(此时它必须以from_list的别名出现)。 condition 一个返回Boolean类型结果的表达式。只有这个表达式返回true的行才会被更新。 output_expression 在所有需要更新的行都被更新之后,UPDATE命令用于计算返回值的表达式。 取值范围:使用任何table以及FROM中列出的表的字段。*表示返回所有字段。 output_name 字段的返回名称。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 --创建表student1。 postgres=# CREATE TABLE student1 ( stuno int, classno int ) DISTRIBUTE BY hash(stuno); --插入数据。 postgres=# INSERT INTO student1 VALUES(1,1); postgres=# INSERT INTO student1 VALUES(2,2); postgres=# INSERT INTO student1 VALUES(3,3); --查看数据。 postgres=# SELECT * FROM student1; --直接更新所有记录的值。 postgres=# UPDATE student1 SET classno = classno*2; --查看数据。 postgres=# SELECT * FROM student1; --删除表。 postgres=# DROP TABLE student1;
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] SET {column_name = { expression | DEFAULT } |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...] [ FROM from_list] [ WHERE condition ] [ RETURNING {* | {output_expression [ [ AS ] output_name ]} [, ...] }]; where sub_query can be: SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] { * | {expression [ [ AS ] output_name ]} [, ...] } [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY grouping_element [, ...] ] [ HAVING condition [, ...] ]
  • 注意事项 要修改表,用户必须对该表有UPDATE权限。 对expression或condition条件里涉及到的任何表要有SELECT权限。 不允许对表的分布列(distribute column)进行修改。 对于列存表,暂时不支持RETURNING子句。 列存表不支持结果不确定的更新(non-deterministic update)。试图对列存表用多行数据更新一行时会报错。 列存表的更新操作,旧记录空间不会回收,需要执行VACUUM FULL table_name进行清理。 对于列存复制表,暂不支持UPDATE操作。
  • 示例2 客户端内存占用过多解决 此示例主要使用setFetchSize来调整客户端内存使用,它的原理是通过数据库游标来分批获取服务器端数据,但它会加大网络交互,可能会损失部分性能。 由于游标事务内有效,故需要先关闭自动提交,最后需要执行手动提交。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 // 关闭掉自动提交 conn.setAutoCommit(false); Statement st = conn.createStatement(); // 打开游标,每次获取50行数据 st.setFetchSize(50); ResultSet rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("a row was returned."); } conn.commit(); rs.close(); // 关闭服务器游标。 st.setFetchSize(0); rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("many rows were returned."); } conn.commit(); rs.close(); // Close the statement. st.close(); conn.close(); 执行完毕后可使用如下命令恢复自动提交: conn.setAutoCommit(true);
  • 示例3 常用数据类型使用示例 //bit类型使用示例,注意此处bit类型取值范围[0,1] Statement st = conn.createStatement(); String sqlstr = "create or replace function fun_1()\n" + "returns bit AS $$\n" + "select col_bit from t_bit limit 1;\n" + "$$\n" + "LANGUAGE SQL;"; st.execute(sqlstr); CallableStatement c = conn.prepareCall("{ ? = call fun_1() }"); //注册输出类型,位串类型 c.registerOutParameter(1, Types.BIT); c.execute(); //使用Boolean类型获取结果 System.out.println(c.getBoolean(1));
  • 相同表的并发INSERT 事务T1: 1 2 3 START TRANSACTION; INSERT INTO test VALUES(2,'test2','test123'); COMMIT; 事务T2: 1 2 3 START TRANSACTION; INSERT INTO test VALUES(3,'test3','test123'); COMMIT; 场景1: 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,执行事务T2的INSERT语句,可以执行成功,读已提交和可重复读隔离级别下,此时在事务T1中执行SELECT语句,看不到事务T2中插入的数据,事务T2中执行查询语句看不到事务T1中插入的数据。 场景2: READ COMMITTED级别 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后直接提交,事务T2中执行INSERT语句后执行查询语句,可以看到事务T1中插入的数据。 REPEATABLE READ级别 开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后直接提交,事务T2中执行INSERT语句后执行查询语句,看不到事务T1中插入的数据。 父主题: 并发写入示例
共100000条