华为云用户手册

  • quote_ident(string text) 描述:返回适用于SQL语句的标识符形式(使用适当的引号进行界定)。只有在必要的时候才会添加引号(字符串包含非标识符字符或者会转换大小写的字符)。返回值中嵌入的引号会被双写。 返回值类型:text 示例: 12345 SELECT quote_ident('hello world'); quote_ident-------------- "hello world"(1 row)
  • 操作符类型解析 从系统表PG_OPERATOR中选出要考虑的操作符。如果可以找到一个参数类型以及参数个数都一致的操作符,那么这个操作符就是最终使用的操作符。如果找到了多个备选的操作符,那么将从中选择一个最合适的。 寻找最优匹配。 丢弃输入类型不匹配以及无法隐式转换成匹配的候选操作符。unknown文本在这种情况下可以转换成任何类型。如果只剩下一个候选操作符,则使用,否则继续下一步。 查看所有候选操作符,并保留输入类型最匹配的操作符。此时,域被看作和其基本类型相同。如果没有完全匹配的操作符,则保留所有候选。如果只剩下一个候选操作符,则使用,否则继续下一步。 查看所有候选操作符,保留需要类型转换时接受(属于输入数据类型的类型范畴的)首选类型位置最多的操作符。如果没有接受首选类型的操作符,则保留所有候选。如果只剩下一个候选操作符,则使用,否则继续下一步。 如果有任何输入参数是unknown类型,请检查其余候选操作符对应参数位置的类型范畴。在每一个能够接受string类型范畴的位置使用string类型(这种偏向字符串的做法合理,因为unknown文本跟字符串相似)。另外,如果所有剩下的候选操作符都接受相同的类型范畴,则选择该类型范畴,否则会报错(因为在没有更多线索的条件下无法作出正确的选择)。现在丢弃不接受选定类型范畴的候选操作符。此外,如果有任意候选操作符接受该范畴中的首选类型,则丢弃该参数接受非首选类型的候选操作符。如果没有一个操作符能被保留,则保留所有候选。如果只剩下一个候选操作符,则使用,否则继续下一步。 如果同时有unknown和已知参数,并且所有已知参数都是相同的类型,那么假设unknown参数也属于该类型,并检查哪些候选操作符在unknown参数位置接受该类型。如果只有一个操作符符合,则使用。否则,报错。
  • substring(string [from int] [for int]) 描述:截取子串。 返回值类型:bytea 示例: 12345 SELECT substring(E'Th\\000omas'::bytea from 2 for 3) AS RESULT; result ---------- \x68006f(1 row) 截取时间,获取小时数: 12345 select substring('2022-07-18 24:38:15',12,2)AS RESULT; result----------- 24(1 row)
  • overlay(string placing string from int [for int]) 描述:替换子串。 返回值类型:bytea 示例: 12345 SELECT overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3) AS RESULT; result ---------------- \x5402036d6173(1 row)
  • btrim(string bytea,bytes bytea) 描述:从string的开头和结尾删除只包含bytes中字节的最长的字符串。 返回值类型:bytea 示例: 12345 SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea) AS RESULT; result ------------ \x7472696d(1 row)
  • kill_snapshot(scope cstring) 描述:中止后台快照线程。该函数向后台快照线程发送中止信号并等待线程结束。 输入参数scope:表示操作范围。该参数取值范围为local和global。 local表示中止当前CN上的快照线程。 global表示不仅会中止当前CN上的快照线程,还会向集群中所有其他CN发送中止快照线程的请求,即中止集群中所有CN上的快照线程。 如果输入其他值,则报错“Scope is invalid, use "local" or "global".”。 输入参数可为空,表示默认取值为local。 返回值类型:无 该函数只有数据库管理员SYSADMIN才有权执行,非管理员执行会提示无权限。 该函数只能在CN上执行,在DN上执行会提示:“kill_snapshot can only be executed on coordinator.”; 执行该函数会向后台快照线程发送中止信号并等待其结束。如果100s内快照线程仍未中止则会报错:“Kill snapshot thread failed”;
  • create_wdr_snapshot() 描述:创建性能数据快照。 返回值类型:text 该函数只有数据库管理员SYSADMIN才可以执行,非管理员执行会提示无权限。 该函数只能在CN上执行,在DN上执行会返回:“WDR snapshot can only be created on coordinator.”。 执行该函数前需确认enable_wdr_snapshot参数处于开启状态。如果enable_wdr_snapshot为off,执行该函数会返回:“WDR snapshot request can't be executed, because GUC parameter 'enable_wdr_snapshot' is off.”。 如果执行该函数时,快照线程由于节点重启等原因尚未启动,会提示错误:“WDR snapshot request can not be accepted, please retry later.”。 如果执行该函数失败,会提示:“Cannot respond to WDR snapshot request.”。 如果执行成功,会返回:“WDR snapshot request has been submitted.”。该提示表明创建快照请求已发送至后台快照线程,但不代表创建快照成功。
  • pg_export_snapshot() 描述:保存当前的快照并返回它的标识符。 返回值类型:text 备注:函数pg_export_snapshot保存当前的快照并返回一个文本字符串标识此快照。这个字符串必须传递给想要导入快照的客户端。可用在set transaction snapshot snapshot_id时导入snapshot,但是应用的前提是该事务设置了REPEATABLE READ隔离级别。该函数的输出不可用做set transaction snapshot的输入。 示例: 12345 SELECT pg_export_snapshot(); pg_export_snapshot-------------------- 00000000000A7128-1(1 row)
  • tsvector tsvector类型表示一个检索单元,通常是一个数据库表中的一行文本字段或者这些字段的组合。 tsvector类型的值是唯一分词的分类列表,把一句话的词格式化为不同的词条,在进行分词处理的时候tsvector会按照一定的顺序录入,并自动去掉分词中重复的词条。 to_tsvector函数通常用于解析和标准化文档字符串。 通过tsvector把一个字符串按照空格进行分词,分词的顺序是按照字母和长短排序的,请看以下例子: 12345 SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; tsvector ---------------------------------------------------- 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'(1 row) 如果词条中包含空格或标点符号,可以用引号包围: 12345 SELECT $$the lexeme ' ' contains spaces$$::tsvector; tsvector ------------------------------------------- ' ' 'contains' 'lexeme' 'spaces' 'the'(1 row) 使用常规的单引号引起来的字符串,字符串中嵌入的单引号(')和反斜杠(\)必须双写进行转义: 12345 SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector; tsvector ------------------------------------------------ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'(1 row) 词条位置常量也可以放到词汇中: 12345 SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector; tsvector ------------------------------------------------------------------------------- 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4(1 row) 位置常量通常表示文档中源字的位置。位置信息可以用于进行排名。位置常量的范围是1到16383,最大值默认是16383。相同词的重复位会被忽略掉。 拥有位置的词汇可以进一步地被标注一个权重,它可以是A,B,C或D。 D是默认权重,因此输出中不会显示: 12345 SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; tsvector ---------------------------- 'a':1A 'cat':5 'fat':2B,4C(1 row) 权重通常被用来反映文档结构,如:将标题标记成与正文词不同。文本检索排序函数可以为不同的权重标记分配不同的优先级。 tsvector类型标准用法示例如下: 12345 SELECT 'The Fat Rats'::tsvector; tsvector -------------------- 'Fat' 'Rats' 'The'(1 row) 但是对于英文全文检索应用来说,上面的单词会被认为非规范化的,所以需要通过to_tsvector函数对这些单词进行规范化处理: 12345 SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3(1 row)
  • tsquery tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)将这些词汇进行组合,圆括号用来强调操作符的分组。如果没有圆括号,(NOT)的优先级最高,其次是&(AND),最后是|(OR)。to_tsquery函数及plainto_tsquery函数会将单词转换为tsquery类型前进行规范化处理。 1 2 3 4 5 6 7 8 91011121314151617 SELECT 'fat & rat'::tsquery; tsquery --------------- 'fat' & 'rat'(1 row)SELECT 'fat & (rat | cat)'::tsquery; tsquery --------------------------- 'fat' & ( 'rat' | 'cat' )(1 row)SELECT 'fat & rat & ! cat'::tsquery; tsquery ------------------------ 'fat' & 'rat' & !'cat'(1 row) tsquery中的词汇可以用一个或多个权重字母来标记,这些权重字母限制词汇只能与匹配权重的tsvector词汇进行匹配。 12345 SELECT 'fat:ab & cat'::tsquery; tsquery ------------------ 'fat':AB & 'cat'(1 row) 同样,tsquery中的词汇可以用*标记来指定前缀匹配。例如:这个查询可以匹配tsvector中以“super”开始的任意单词。 12345 SELECT 'super:*'::tsquery; tsquery ----------- 'super':*(1 row) 需注意,前缀匹配会首先被文本搜索分词器处理。例如:postgres中提取的词干是postgr,匹配到了postgraduate,也就意味着下面的结果为真: 12345 SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ) AS RESULT; result ---------- t(1 row) 12345 SELECT to_tsquery('postgres:*'); to_tsquery ------------ 'postgr':*(1 row) to_tsquery函数会将单词转换为tsquery类型前进行规范化处理。'Fat:ab & Cats'规范化转为tsquery类型结果如下: 12345 SELECT to_tsquery('Fat:ab & Cats'); to_tsquery ------------------ 'fat':AB & 'cat'(1 row)
  • UUID格式 UUID由开放软件基金会标准化,作为分布式计算环境的一部分,在互联网工程任务组(IETF)公布的RFC 4122标准中对UUID进行了标准化。标准的UUID由36个字符组成,其中包括32个16进制数字和4个连字符‘-’,形式为8-4-4-4-12,标准的UUID示例如下: 1 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 除了标准型的UUID, GaussDB (DWS)同样支持以其他方式输入:大写字母和数字、由花括号包围的标准格式、省略部分或所有连字符、在任意一组四位数字之后加一个连字符。示例: 1234 A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}a0eebc999c0b4ef8bb6d6bb9bd380a11a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
  • 常量与宏 GaussDB(DWS)支持的常量和宏请参见表1。 表1 常量和宏 参数 描述 相关SQL语句示例 CURRENT_CATA LOG 当前数据库 1 SELECT CURRENT_CATALOG; CURRENT_ROLE 当前角色 1 SELECT CURRENT_ROLE; CURRENT_SCHEMA 当前数据库模式 1 SELECT CURRENT_SCHEMA; CURRENT_USER 当前用户 1 SELECT CURRENT_USER; LOCALTIMESTAMP 当前会话时间(无时区) 1 SELECT LOCALTIMESTAMP; NULL 空值 - SESSION_USER 当前系统用户 1 SELECT SESSION_USER; SYSDATE 当前系统日期 1 SELECT SYSDATE; 或 SELECT now()::DATE; USER 当前用户,与CURRENT_USER一致。 1 SELECT USER;
  • 列存表支持的数据类型 列存表支持的数据类型如表1所示。其他未列举的数据类型,暂不支持。 表1 列存表支持的数据类型 类别 数据类型 描述 长度 数值类型 smallint 小范围整数,别名为INT2。 2 integer 常用的整数,别名为INT4。 4 bigint 大范围的整数,别名为INT8。 8 decimal 任意精度型。 可变长度 numeric 任意精度型。 可变长度 real 单精度浮点数。 4 double precision 双精度浮点数。 8 smallserial 二字节序列整型。 2 serial 四字节序列整型。 4 bigserial 八字节序列整型。 8 货币类型 money 货币金额。 8 字符类型 character varying(n), varchar(n) 变长字符串。 可变长度 character(n), char(n) 定长字符串。 n character、char 单字节内部类型。 1 text 变长字符串。 可变长度 nvarchar2 变长字符串。 可变长度 clob 文本大对象。 可变长度 日期/时间类型 timestamp with time zone 日期和时间,带时区。 8 timestamp without time zone 日期和时间。 8 date Oracle兼容模式下记录日期和时间;其他兼容模式下,记录日期。 Oracle兼容模式下,占存储空间8字节;其他兼容模式下,占存储空间4字节。 time without time zone 只用于一日内时间。 8 time with time zone 只用于一日内时间,带时区。 12 interval 时间间隔。 16 RoaringBitmap - 高效位图,支持int类型数据集位图计算。 可变长度 父主题: 数据类型
  • 注意事项 只有系统管理员才能执行EXECUTE DIRECT。 为了各个节点上数据的一致性,SQL语句仅支持SELECT,不允许执行事务语句、DDL、DML。 使用此类型语句在指定的DN执行AVG聚集计算时,返回结果集是以数组形式返回,如{4,2},表示sum结果为4,count结果为2。 由于CN节点不存储用户表数据,没有必要指定CN节点执行用户表上的SELECT查询。如果查询语句中含有隐藏的远程调用开启事务逻辑,则会报错“Cannot send begin to other nodes as I'm not execute cn”。 不允许执行嵌套的EXECUTE DIRECT语句,即执行的SQL语句不能同样是EXECUTE DIRECT语句,此时可直接执行最内层EXECUTE DIRECT语句代替。
  • 示例 创建表reason,并向表中插入数据: 123456789 DROP TABLE IF EXISTS reason;CREATE TABLE reason( a int primary key, b int, c int);INSERT INTO reason VALUES (1, 2, 3); 开始一个事务: 1 START TRANSACTION; 定义一个名为cursor1的游标: 1 CURSOR cursor1 FOR SELECT * FROM reason; 忽略游标cursor1的前3行: 1 MOVE FORWARD 3 FROM cursor1; 抓取游标cursor1的前4行: 1 FETCH 4 FROM cursor1; 关闭游标: 1 CLOSE cursor1; 结束一个事务: 1 END;
  • 语法格式 1 MOVE [ direction [ FROM | IN ] ] cursor_name; 其中direction子句为可选参数。 1 2 3 4 5 6 7 8 91011121314 NEXT | PRIOR | FIRST | LAST | ABSOLUTE count | RELATIVE count | count | ALL | FORWARD | FORWARD count | FORWARD ALL | BACKWARD | BACKWARD count | BACKWARD ALL
  • get_db_source_datasize() 描述:估算当前数据库非压缩态的数据总容量。 返回值类型:bigint 备注:(1)调用该函数前需要做analyze;(2)通过估算列存的压缩率计算非压缩态的数据总容量。 示例: 1234567 analyze;ANALYZESELECT get_db_source_datasize(); get_db_source_datasize------------------------ 35384925667(1 row)
  • pg_database_size(name) 描述:指定名称的数据库使用的磁盘空间。 返回值类型:bigint 备注:pg_database_size接收一个数据库的OID或者名字,然后返回该对象使用的全部磁盘空间。 示例: 12345 SELECT pg_database_size('gaussdb'); pg_database_size ------------------ 51590112(1 row)
  • 参数说明 IF NOT EXISTS 如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。 partition_table_name 分区表的名称。 取值范围:字符串,要符合标识符的命名规范。 column_name 新表中要创建的字段名。 取值范围:字符串,要符合标识符的命名规范。 data_type 字段的数据类型。 COLLATE collation COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。 可排列的数据类型有char、varchar、text、nchar、nvarchar。 CONSTRAINT constraint_name 列约束或表约束的名字。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。 定义约束有两种方法: 列约束:作为一个列定义的一部分,仅影响该列。 表约束:不和某个列绑在一起,可以作用于多个列。 LIKE source_table [ like_option ... ] LIKE子句声明一个表,新表自动从声明的表中继承所有字段名及其数据类型和非空约束。 新表与原来的表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。 字段缺省表达式只有在声明了INCLUDING DEFAULTS之后才会包含进来。缺省是不包含缺省表达式的,即新表中所有字段的缺省值都是NULL。 非空约束将总是复制到新表中,CHECK约束则仅在指定了INCLUDING CONSTRAINTS的时候才复制,而其他类型的约束则永远也不会被复制。此规则同时适用于表约束和列约束。 被复制的列和约束并不使用相同的名字进行融合。如果明确的指定了相同的名字或者在另外一个LIKE子句中,将会报错。 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置也将被复制,默认情况下不包含STORAGE设置。 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释也会被复制过来。默认情况下,不复制源表的注释。 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)也将复制至新表。默认情况下,不复制源表的存储参数。 如果指定了INCLUDING DISTRIBUTION,则新表将复制源表的分布信息,包括分布类型和分布列,同时新表将不能再使用DISTRIBUTE BY子句。默认情况下,不复制源表的分布信息。 INCLUDING ALL是INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS INCLUDING RELOPTIONS INCLUDING DISTRIBUTION的简写形式。 WITH ( storage_parameter [= value] [, ... ] ) 这个子句为表或索引指定一个可选的存储参数。参数的详细描述如下所示: FILLFACTOR 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是优良选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。 取值范围:10~100 ORIENTATION 决定了表的数据的存储方式。 取值范围: COLUMN:表的数据将以列式存储。 ROW(缺省值):表的数据将以行式存储。 ORC:表的数据将以ORC格式存储(仅HDFS表)。 orientation不支持修改。 COMPRESSION 列存表的有效值为YES/NO和LOW/MIDDLE/HIGH,默认值为LOW。 暂不支持行存表压缩功能。 MAX_BATCHROW 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 取值范围:10000~60000 默认值:60000 PARTIAL_CLUSTER_ROWS 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。 取值范围:其有效值为大于等于10万。此值是MAX_BATCHROW的倍数。 enable_delta 指定了在列存表是否开启delta表。该参数只对列存表有效。 默认值:off DELTAROW_THRESHOLD 预留参数。该参数只对列存表有效。 取值范围:0~60000,默认值为6000 COLD_TABLESPACE 指定冷分区保存的obs tablespace,仅冷热表支持。该参数仅支持列存分区表,且该参数不支持修改,需与storage_policy同时使用。在指定STORAGE_POLICY时,可不设置该参数,默认为default_obs_tbs。 取值范围:有效的OBS TABLESPACE名。 STORAGE_POLICY 指定冷热分区切换规则,仅冷热表支持。该参数需与cold_tablespace同时使用。 取值范围:"冷热切换策略名称:冷热切换的阈值",目前冷热切换的策略名称只支持LMT和HPN,LMT指按分区的最后更新时间切换,HPN指保留热分区的个数切换。 LMT:[day]:表示切换[day]时间前修改的热分区数据为冷分区,将该数据迁至OBS表空间中。其中[day]为整型,范围[0, 36500],单位为天。 HPN: [hot_partition_num]:表示保留[hot_partition_num]个有数据的分区为热分区。保留规则为查找出有数据的分区的最大的Sequence ID,大于Sequence ID的无数据分区为热分区,并按这个Sequence ID从大到小保留[hot_partition_num]个分区为热分区;分区Sequence ID小于保留的最小热分区的Sequence ID的分区为冷分区,在冷热切换时,需要将数据迁移至OBS表空间中。其中[hot_partition_num]为整型,范围为[0,1600]。 实时数仓(单机部署)暂不支持冷热分区切换功能。 对于LIST分区,建议谨慎使用HPN策略,否则可能出现新增分区不是热分区的情况。 PERIOD 指定分区管理中自动创建分区的周期,并开启自动创建分区功能。仅支持行存、列存范围分区表、时序表以及冷热表;分区键唯一并且类型仅支持TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE;不支持存在maxvalue分区;(nowTime - boundaryTime) / PERIOD需要小于分区个数上限,其中nowTime为当前时间,boundaryTime为现有分区中最早的分区边界时间;不支持在小型机、加速集群、单机集群上使用。 取值范围:1 hour ~ 100 years 在兼容Teradata或MySQL的数据库中,分区键类型为DATE时,PERIOD不能小于1 day。 建分区表时,如果设置了PERIOD,则可以只指定分区键不指定分区。建表时将创建两个默认分区,这两个默认分区的分区时间范围均为PERIOD。其中,第一个默认分区的边界时间是大于当前时间的第一个整时/整天/整周/整月/整年的时间,具体选择哪种整点时间取决于PERIOD的最大单位;第二个默认分区的边界时间是第一个分区边界时间加PERIOD。假设当前时间是2022-02-17 16:32:45,各种情况的第一个默认分区的分区边界选择如表1。 有关默认分区的更多内容,请参见示例5。 实时数仓(单机部署)暂不支持自动创建分区功能。 表1 分区边界选择 period period最大单位 第一个默认分区的分区边界 1hour Hour 2022-02-17 17:00:00 1day Day 2022-02-18 00:00:00 1month Month 2022-03-01 00:00:00 13month Year 2023-01-01 00:00:00 TTL 指定分区管理中分区过期的时间,并开启自动删除分区功能。不支持单独设置,必须要提前或同时设置PERIOD,并且要大于或等于PERIOD。 取值范围:1 hour ~ 100 years PERIOD指明按照时间划分的周期对数据进行分区,分区的大小可能对查询性能有影响,同时每隔周期时间会创建一个新的周期大小的分区,具体做法是以period周期,自动调用proc_add_partition函数。TTL(Time To Live)指明该表的数据保存周期,超过TTL周期的数据将被清理,具体做法是以period周期,自动调用proc_drop_partition函数。PERIOD和TTL的值为Interval类型,例如:“1 hour”, “1 day”, “1 week”, “1 month” ,“1 year”, “1 month 2 day 3 hour”。 实时数仓(单机部署)暂不支持自动删除分区功能。 COLVERSION 指定列存存储格式的版本,支持不同存储格式版本之间的切换,但分区表不支持存储格式版本切换。 取值范围: 1.0:列存表的每列以一个单独的文件进行存储,文件名以relfilenode.C1.0、relfilenode.C2.0、relfilenode.C3.0等命名。 2.0:列存表的每列合并存储在一个文件中,文件名以relfilenode.C1.0命名。 默认值:2.0 需注意,OBS冷热表仅支持colversion 2.0格式。 在建列存表时选择COLVERSION=2.0,相比于1.0存储格式,在以下场景中性能有明显提升: 创建列存宽表场景下,建表时间显著减少。 roach备份数据场景下,备份时间显著减少。 build、catch up耗时显著减少。 占用磁盘空间大小显著减少。 SKIP_FPI_HINT 顺序扫描过程中,若需要写FPW(full page writes)日志时,该参数控制是否跳过设置HintBits操作。 默认值:false 设置SKIP_FPI_HINT=true时,在对某表执行checkpoint操作后,若对该表进行顺序扫描,将不再产生Xlog。适用于查询次数较少的中间表,有效减少Xlog的大小,提升查询性能。 COMPRESS / NOCOMPRESS 创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 缺省值为NOCOMPRESS,即不对元组数据进行压缩。 DISTRIBUTE BY 指定表如何在节点之间分布或者复制。 取值范围: REPLICATION:表的每一行存在所有数据节点( DN )中,即每个数据节点都有完整的表数据。 ROUNDROBIN:表的每一行被轮番地发送给各个DN,因此数据会被均匀地分布在各个DN中。(ROUNDROBIN仅8.1.2及以上版本支持) HASH (column_name ) :对指定的列进行Hash,通过映射,把数据分布到指定DN。 当指定DISTRIBUTE BY HASH (column_name)参数时,创建主键和唯一索引必须包含“ column_name”列。 当被参照表指定DISTRIBUTE BY HASH (column_name)参数时,参照表的外键必须包含“ column_name”列。 默认值:由GUC参数default_distribution_mode控制。 当default_distribution_mode=roundrobin时,DISTRIBUTE BY的默认值按如下规则选取: 若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。 若建表时不包含主键/唯一约束,则选取ROUNDROBIN分布。 当default_distribution_mode=hash时,DISTRIBUTE BY的默认值按如下规则选取: 若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。 若建表时不包含主键/唯一约束,但存在数据类型支持作分布列的列,则选取HASH分布,分布列为第一个数据类型支持作分布列的列。 若建表时不包含主键/唯一约束,也不存在数据类型支持作分布列的列,选取ROUNDROBIN分布。 以下数据类型支持作为分布列: INTEGER TYPES:TINYINT,SMALLINT,INT,BIGINT,NUMERIC/DECIMAL CHARACTER TYPES:CHAR,BPCHAR,VARCHAR,VARCHAR2,NVARCHAR2,TEXT DATE/TIME TYPES:DATE,TIME,TIMETZ,TIMESTAMP,TIMESTAMPTZ,INTERVAL,SMALLDATETIME TO { GROUP groupname | NODE ( nodename [, ... ] ) } TO GROUP指定创建表所在的Node Group,目前不支持hdfs表使用。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 PARTITION BY RANGE(partition_key) 指定范围分区策略语法,partition_key为分区键的名称。 (1)对于从句是VALUES LESS THAN的语法格式: 对于从句是VALUE LESS THAN的语法格式,范围分区策略的分区键最多支持4列,且分区键只能是列名。当存在多个分区键时,一个列名只能出现一次,且相邻的两个分区键要使用逗号隔开。 该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、CHARACTER VARYING(n)、VARCHAR(n)、CHARACTER(n)、CHAR(n)、CHARACTER、CHAR、TEXT、NVARCHAR2、NAME、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。 (2)对于从句是START END的语法格式: 对于从句是START END的语法格式,范围分区策略的分区键仅支持1列。 该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。 PARTITION BY LIST (partition_key,[...]) 指定列表分区策略语法,partition_key为分区键的名称。 列表分区策略的分区键最多支持4列。 列表分区策略分区键支持的数据类型为:TINYINT、SMALLINT、INTEGER、BIGINT、NUMERIC/DECIMAL、TEXT、NVARCHAR2、VARCHAR(n)、CHAR、BPCHAR、TIME、TIME WITH TIMEZONE、TIMESTAMP、TIMESTAMP WITH TIME ZONE、DATE、INTERVAL、SMALLDATETIME partition_less_than_item 1 PARTITION partition_name VALUES LESS THAN ( { partition_value | DEFAULT } ) 范围分区策略下分区(简称为范围分区)的定义语法。partition_name为范围分区的名称。partition_value为范围分区的上边界,取值依赖于partition_key的类型。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。 每个分区都需要指定一个上边界。 分区上边界的类型应当和分区键的类型一致。 分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。 如果分区键由多个字段组成,比较大小时,先比较第一个字段,当第一个字段相等时比较第二个字段,以此类推。 partition_start_end_item 1234 PARTITION partition_name {START (partition_value) END (partition_value) EVERY (interval_value)} | {START (partition_value) END (partition_value|MAXVALUE)} | {START(partition_value)} | {END (partition_value| MAXVALUE)} 使用起始值以及间隔值定义范围分区的语法,各参数含义如下: partition_name:范围分区的名称或名称前缀,除以下情形外(假定其中的partition_name是p1),均为分区的名称。 若该定义是START+END+EVERY从句,则语义上定义的分区的名称依次为p1_1, p1_2, ...。例如对于定义“PARTITION p1 START(1) END(4) EVERY(1)”,则生成的分区是:[1, 2), [2, 3) 和 [3, 4),名称依次为p1_1, p1_2和p1_3,即此处的p1是名称前缀。 若该定义是第一个分区定义,且该定义有START值,则范围(MINVALUE, START)将自动作为第一个实际分区,其名称为p1_0,然后该定义语义描述的分区名称依次为p1_1, p1_2, ...。例如对于完整定义“PARTITION p1 START(1), PARTITION p2 START(2)”,则生成的分区是:(MINVALUE, 1), [1, 2) 和 [2, MAXVALUE),其名称依次为p1_0, p1_1和p2,即此处p1是名称前缀,p2是分区名称。这里MINVALUE表示最小值。 partition_value:范围分区的端点值(起始或终点),取值依赖于partition_key的类型,不可是MAXVALUE。 interval_value:对[START,END) 表示的范围进行切分,interval_value是指定切分后每个分区的宽度,不可是MAXVALUE;如果(END-START)值不能整除以EVERY值,则仅最后一个分区的宽度小于EVERY值。 MAXVALUE:表示最大值,它通常用于设置最后一个范围分区的上边界。 在创建分区表若第一个分区定义含START值,则范围(MINVALUE,START)将自动作为实际的第一个分区。 START END语法需要遵循以下限制: 每个partition_start_end_item中的START值(如果有的话,下同)必须小于其END值; 相邻的两个partition_start_end_item,第一个的END值必须等于第二个的START值; 每个partition_start_end_item中的EVERY值必须是正向递增的,且必须小于(END-START)值; 每个分区包含起始值,不包含终点值,即形如:[起始值,终点值),起始值是MINVALUE时则不包含; 一个partition_start_end_item创建的每个分区所属的TABLESPACE一样; partition_name作为分区名称前缀时,其长度不要超过57字节,超过时自动截断; 在创建、修改分区表时请注意分区表的分区总数不可超过最大限制(32767); 在创建分区表时START END与LESS THAN语法不可混合使用。 即使创建分区表时使用START END语法,备份(gs_dump)出的SQL语句也是VALUES LESS THAN语法格式。 list_partition_item 1 PARTITION partition_name VALUES ( { (partition_value) [, ... ] | DEFAULT } ) 列表分区策略下分区(简称为列表分区)的定义语法。partition_name为分区的名称。partition_value为列表分区边界的一个枚举值,取值依赖于partition_key的类型。DEFAULT表示默认分区的边界。 对于列表分区表,存在以下约定和约束: 边界值为DEFAULT的分区,称之为默认分区。 每个列表分区表只能有一个DEFAULT分区。 分区表的所有分区数不超过32767个,所有分区的边界值个数不大于32767个。 不管分区键的个数,DEFAULT分区的边界只能是一个DEFAULT。 如果分区键由多个字段组成,每个partition_value需要包含所有分区键的值,当分区键只有一列时,partition_value两侧的括号可以省略,参见示例4:创建多个分区键的列表分区表。 如果分区键由多个字段组成,比较大小时,先逐个字段比较大小,任何一个字段值不一样即可认为是不一样的键值。 边界中不同的partition_value值不能重复。 数据插入时,如果数据的分区键值能匹配任何非DEFAULT分区的边界,那么数据会写入对应的分区;否则数据会写入DEFAULT分区。 { ENABLE | DISABLE } ROW MOVEMENT 行迁移开关。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 取值范围: ENABLE:行迁移开关打开。 DISABLE(缺省值):行迁移开关关闭。 分区表不显示指定则默认不开启ROW MOVEMENT,此时不允许跨分区更新。ENABLE ROW MOVEMENT开启则允许跨分区更新,但此时如果有SELECT FOR UPDATE查询该分区表并发执行,存在查询结果瞬时不一致的可能性,需要谨慎使用。
  • 语法格式 1 2 3 4 5 6 7 8 910111213141516 CREATE TABLE [ IF NOT EXISTS ] partition_table_name( [ { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] }[, ... ]] ) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ COMPRESS | NOCOMPRESS ] [ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [ HASH ] ( column_name ) } } ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] PARTITION BY { {VALUES (partition_key)} | {RANGE (partition_key) ( partition_less_than_item [, ... ] )} | {RANGE (partition_key) ( partition_start_end_item [, ... ] )} | {LIST (partition_key) (list_partition_item [, ...])} } [ { ENABLE | DISABLE } ROW MOVEMENT ]; 列约束column_constraint: 12345678 [ CONSTRAINT constraint_name ]{ NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | UNIQUE index_parameters | PRIMARY KEY index_parameters }[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 表约束table_constraint: 12345 [ CONSTRAINT constraint_name ]{ CHECK ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters}[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] like选项like_option: 1 { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS | DISTRIBUTION | ALL } 索引存储参数index_parameters: 1 [ WITH ( {storage_parameter = value} [, ... ] ) ]
  • 功能描述 创建分区表。逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。 常见的分区策略包括:范围分区(Range Partitioning)、哈希分区(Hash Partitioning)、列表分区(List Partitioning)和数值分区(Value Partitioning)。 范围分区是根据表的一列或者多列,将要插入表的记录分为若干个范围,这些范围在不同的分区里没有重叠。为每个范围创建一个分区,用来存储相应的数据。 范围分区策略是指记录插入分区的方式,根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。这是最常用的分区策略。目前范围分区仅支持范围分区策略。 列表分区是根据表的一列,将要插入表的记录通过每一个分区中出现的键值划分到对应的分区中,这些键值在不同的分区里没有重叠。为每组键值创建一个分区,用来存储相应的数据。 列表分区策略是根据分区键值将记录映射到已创建的某个分区上,如果可以映射到已创建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。 常见的分区策略都是按照某一列或者某几列定义一些数据分布范围,然后每个分区承载一个范围的数据,这些列称之为分区键。 目前GaussDB(DWS)行存表、列存表仅支持范围分区和列表分区。 列表分区(List Partitioning)仅8.1.3及以上集群版本支持。
  • 分区的优势 某些类型的查询性能可以得到极大提升,特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下。分区可以减少数据的搜索空间,提高数据访问效率。 当查询或更新一个分区的大部分记录时,连续扫描对应分区而不是访问整个表可以获得巨大的性能提升。 如果需要大量加载或者删除的记录位于单独的分区上,则可以通过直接读取或删除那个分区以获得巨大的性能提升,同时还可以避免由于大量DELETE导致的VACUUM超载(仅范围分区)。
  • day 如果source为timestamp,表示月份里的日期(1-31)。 12345 SELECT EXTRACT(day FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16(1 row) 如果source为interval,表示天数。 12345 SELECT EXTRACT(day FROM INTERVAL '40 days 1 minute'); date_part ----------- 40(1 row)
  • isoyear 日期中的ISO 8601标准年(不适用于间隔)。 每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。 12345 SELECT EXTRACT(isoyear FROM DATE '2006-01-01'); date_part ----------- 2005(1 row) 12345 SELECT EXTRACT(isoyear FROM DATE '2006-01-02'); date_part ----------- 2006(1 row)
  • week 该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。 在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2005-01-01是2004年的第53周,而2006-01-01是2005年的第52周,2012-12-31是2013年的第一周。建议isoyear字段和week一起使用以得到一致的结果。 12345 SELECT EXTRACT(week FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 7(1 row)
  • epoch 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数); 如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数; 如果source为interval,表示时间间隔的总秒数。 12345 SELECT EXTRACT(epoch FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); date_part -------------- 982384720.12(1 row) 12345 SELECT EXTRACT(epoch FROM interval '5 days 3 hours'); date_part ----------- 442800(1 row) 将epoch值转换为时间戳的方法。 12345 SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * interval '1 second' AS RESULT; result --------------------------- 2001-02-17 12:38:40.12+08(1 row)
  • month 如果source为timestamp,表示一年里的月份数(1-12)。 12345 SELECT EXTRACT(month FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 2(1 row) 如果source为interval,表示月的数目,然后对12取模(0-11)。 12345 SELECT EXTRACT(month FROM interval '2 years 13 months'); date_part ----------- 1(1 row)
  • 示例 授予用户webuser对模式tpcds下视图的所有操作权限: 12345678 DO $$DECLARE r record;BEGIN FOR r IN SELECT c.relname,n.nspname FROM pg_class c,pg_namespace n WHERE c.relnamespace = n.oid AND n.nspname = 'tpcds' AND relkind IN ('r','v') LOOP EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser'; END LOOP;END$$;
  • 参数说明 INDEX 重新建立指定的索引。 TABLE 重新建立指定表的所有索引,如果表有从属的"TOAST"表,则这个表也会重建索引。 DATABASE 重建当前数据库里的所有索引。 SYSTEM 在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。 name 需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。 REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。 FORCE 无效选项,会被忽略。 partition_name 需要重建索引的分区的名字或者索引分区的名字。 取值范围: 如果前面是REINDEX INDEX,则这里应该指定索引分区的名字; 如果前面是REINDEX TABLE,则这里应该指定分区的名字; REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。
  • 示例 重建分区表customer_address分区P1的分区索引: DROP TABLE IF EXISTS customer_address;CREATE TABLE customer_address( ca_address_sk INTEGER NOT NULL , ca_address_id CHARACTER(16) NOT NULL , ca_street_number CHARACTER(10) , ca_street_name CHARACTER varying(60) , ca_street_type CHARACTER(15) , ca_suite_number CHARACTER(10) )DISTRIBUTE BY HASH (ca_address_sk)PARTITION BY RANGE(ca_address_sk)( PARTITION P1 VALUES LESS THAN(2450815), PARTITION P2 VALUES LESS THAN(2451179), PARTITION P3 VALUES LESS THAN(2451544), PARTITION P4 VALUES LESS THAN(MAXVALUE));CREATE INDEX customer_address_index on customer_address(CA_ADDRESS_SK) LOCAL;REINDEX TABLE customer_address PARTITION P1;
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全