华为云用户手册

  • 日期输入 日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式或者其它的格式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。 日期的文本输入需要加单引号包围,语法如下: type [ ( p ) ] 'value' 可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。表2显示了date类型的输入格式。 表2 日期输入格式 例子 描述 1999-01-08 ISO 8601格式(建议格式),任何方式下都是1999年1月8日。 January 8, 1999 在任何datestyle输入模式下都无歧义。 1/8/1999 有歧义,在MDY模式下是1月8日,在DMY模式下是8月1日。 1/18/1999 MDY模式下是1月18日,其它模式下被拒绝。 01/02/03 MDY模式下的2003年1月2日。 DMY模式下的2003年2月1日。 YMD模式下的2001年2月3日。 1999-Jan-08 任何模式下都是1月8日。 Jan-08-1999 任何模式下都是1月8日。 08-Jan-1999 任何模式下都是1月8日。 99-Jan-08 YMD模式下是1月8日,否则错误。 08-Jan-99 1月8日,除了在YMD模式下是错误的之外。 Jan-08-99 1月8日,除了在YMD模式下是错误的之外。 19990108 ISO 8601格式,任何模式下都是1999年1月8日。 990108 ISO 8601格式,任何模式下都是1999年1月8日。 1999.008 年和年里的第几天。 J2451187 儒略日。 January 8, 99 BC 公元前99年。 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637 --创建表。gaussdb=# CREATE TABLE date_type_tab(coll date);--插入数据。gaussdb=# INSERT INTO date_type_tab VALUES (date '12-10-2010');--查看数据。gaussdb=# SELECT * FROM date_type_tab; coll --------------------- 2010-12-10(1 row)--查看日期格式。gaussdb=# SHOW datestyle; DateStyle ----------- ISO, MDY(1 row)--设置日期格式。gaussdb=# SET datestyle='YMD';SET--插入数据。gaussdb=# INSERT INTO date_type_tab VALUES(date '2010-12-11');--查看数据。gaussdb=# SELECT * FROM date_type_tab; coll --------------------- 2010-12-10 2010-12-11(2 rows)--删除表。gaussdb=# DROP TABLE date_type_tab;
  • JSONB高级特性 注意事项 不支持作为分区键。 不支持外表。 JSON和JSONB的主要差异在于存储方式上的不同,JSONB存储的是解析后的二进制,能够体现JSON的层次结构,更方便直接访问等,因此JSONB会有很多JSON所不具有的高级特性。 格式归一化 对于输入的object-json字符串,解析成jsonb二进制后,会天然的丢弃语义上无关紧要的细节,比如空格: gaussdb=# SELECT ' [1, " a ", {"a" :1 }] '::jsonb; jsonb---------------------- [1, " a ", {"a": 1}](1 row) 对于object-json,会删除重复的键值,只保留最后一个出现的,如: gaussdb=# SELECT '{"a" : 1, "a" : 2}'::jsonb; jsonb---------- {"a": 2}(1 row) 对于object-json,键值会重新进行排序,排序规则:长度长的在后、长度相等则ascii码大的在后,如: gaussdb=# SELECT '{"aa" : 1, "b" : 2, "a" : 3}'::jsonb; jsonb--------------------------- {"a": 3, "b": 2, "aa": 1}(1 row)
  • 数据库级字符集和字符序 创建一个新的数据库时,可以指定数据库的字符集字符序,创建数据库操作请参见CREATE DATABASE。 CREATE DATABASE [IF NOT EXISTS] database_name [ ENCODING [=] encoding ] | [ LC_COLLATE [=] lc_collate ] | [ LC_CTYPE [=] lc_ctype ] |; 参数说明: database_name 数据库名称。 取值范围:字符串,要符合标识符的命名规范。 ENCODING [ = ] encoding 指定数据库使用的字符编码,可以是字符串(如'SQL_ASCII')、整数编号。 LC_COLLATE [ = ] lc_collate 指定新数据库使用的字符集。例如,通过lc_collate = 'zh_CN.gbk'设定该参数。 该参数的使用会影响到对字符串的排序(如使用ORDER BY执行,以及在文本列上使用索引的顺序)。默认是使用模板数据库的排序。 取值范围:操作系统支持的字符集。 LC_CTYPE [ = ] lc_ctype 指定新数据库使用的字符分类。例如,通过lc_ctype = 'zh_CN.gbk'设定该参数。该参数的使用会影响到字符的分类,如大写、小写和数字。默认是使用模板数据库的字符分类。 取值范围:操作系统支持的字符分类。 数据库级字符集、字符序语法所有模式均可使用,详细语法参考CREATE DATABASE 。 LC_COLLATE/LC_CTYPE语法不支持指定MYSQL模式特有的字符序,参数的取值范围取决于本地环境支持的字符集,可通过locale -a查看。 父主题: 字符集与字符序
  • 伪类型 GaussDB 数据类型中包含一系列特殊用途的类型,这些类型按照类别被称为伪类型,如表1所示。伪类型不能作为字段的数据类型,但是可以用于声明函数的参数或者结果类型。 当一个函数不仅是简单地接受并返回某种SQL数据类型的情况下伪类型是很有用的。表1列出了所有的伪类型。 表1 伪类型 名称 描述 any 表示函数接受任何输入数据类型。 anyelement 表示函数接受任何数据类型。 anyarray 表示函数接受任意数组数据类型。 anynonarray 表示函数接受任意非数组数据类型。 anyenum 表示函数接受任意枚举数据类型。 anyrange 表示函数接受任意范围数据类型。 cstring 表示函数接受或者返回一个空结尾的C字符串。 internal 表示函数接受或者返回一种服务器内部的数据类型。 language_handler 声明一个过程语言调用句柄返回language_handler。 fdw_handler 声明一个外部数据封装器返回fdw_handler。 record 标识函数返回一个未声明的行类型。 trigger 声明一个触发器函数返回trigger。 void 表示函数不返回数值。 opaque 一个已经过时的类型,以前用于所有上面这些用途。 声明用C语言编写的函数(无论是内置的还是动态装载的)都可以接受或者返回任何这样的伪数据类型。当伪类型作为参数类型使用时,用户需要保证函数的正常运行。 用过程语言编写的函数只能使用实现语言允许的伪类型。目前,过程语言都不允许使用作为参数类型的伪类型,并且只允许使用void和record作为结果类型。一些多态的函数还支持使用anyelement、anyarray、anynonarray、anyenum和anyrange类型。 每一个被声明为anyelement的位置(参数或返回值)都允许具有任意特定的实际数据类型,但是在任何给定的查询中必须全部是相同的实际类型。 伪类型internal用于声明只能在数据库系统内部调用的函数,这些函数不能直接在SQL查询里调用。如果函数至少有一个internal类型的参数,则不能从SQL里调用。建议不要创建任何声明返回internal的函数,除非其至少有一个internal类型的参数。 示例: 1 2 3 4 5 6 7 8 91011121314151617181920212223 --创建表。gaussdb=# CREATE TABLE t1 (a int);--插入两条数据。gaussdb=# INSERT INTO t1 values(1),(2);--创建函数showall()。gaussdb=# CREATE OR REPLACE FUNCTION showall() RETURNS SETOF recordAS $$ SELECT count(*) from t1; $$LANGUAGE SQL;--调用函数showall()。gaussdb=# SELECT showall(); showall --------- (2)(1 row)--删除函数。gaussdb=# DROP FUNCTION showall();--删除表。gaussdb=# DROP TABLE t1; 父主题: 数据类型
  • 示例 -- 生成一个UUID类型的序列号gaussdb=# SELECT uuid(); uuid -------------------------------------- 846b9d00-172d-c63d-4a03-e8b4700370e0(1 row)-- 创建表gaussdb=# CREATE TABLE uuid_test(id int, test uuid) DISTRIBUTE BY HASH(test);-- 插入数据,使用系统生成的uuid插入数据gaussdb=# INSERT INTO uuid_test VALUES(1, uuid()::uuid);-- 插入数据,使用示例格式插入数据gaussdb=# INSERT INTO uuid_test VALUES(2, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');gaussdb=# INSERT INTO uuid_test VALUES(3, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');gaussdb=# INSERT INTO uuid_test VALUES(4, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');gaussdb=# INSERT INTO uuid_test VALUES(5, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');-- 查看数据,输出时以标准格式输出gaussdb=# SELECT * FROM uuid_test; id | test ----+-------------------------------------- 1 | 1b52051c-1731-c63d-4a03-e8b4700370e0 2 | a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 3 | a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 4 | a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 5 | a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11(5 rows)-- 删除表gaussdb=# DROP TABLE uuid_test;
  • 对象标识符类型 GaussDB在内部使用对象标识符(OID)作为各种系统表的主键。系统不会给用户创建的表增加一个OID系统字段,OID类型代表一个对象标识符。对象标识符类型如表1所示。 目前OID类型用一个四字节的无符号整数实现。因此不建议在创建的表中使用OID字段做主键。 表1 对象标识符类型 名称 引用 描述 示例 OID - 数字化的对象标识符。 564182 CID - 命令标识符。它是系统字段cmin和cmax的数据类型。命令标识符是32位的量。 - XID - 事务标识符。它是系统字段xmin和xmax的数据类型。事务标识符是64位的量。 - TID - 行标识符。它是系统表字段ctid的数据类型。行ID是一对数值(块号,块内的行索引),它标识该行在其所在表内的物理位置。 - REGCONFIG pg_ts_config 文本搜索配置。 english REGDICTIONARY pg_ts_dict 文本搜索字典。 simple REGOPER pg_operator 操作符名。 - REGOPERATOR pg_operator 带参数类型的操作符。 *(integer,integer)或-(NONE,integer) REGPROC pg_proc 函数名称。 sum REGPROCEDURE pg_proc 带参数类型的函数。 sum(int4) REGCLASS pg_class 关系名。 pg_type REGTYPE pg_type 数据类型名。 integer OID类型:主要作为数据库系统表中字段使用。 示例: 12345 gaussdb=# SELECT oid FROM pg_class WHERE relname = 'pg_type'; oid ------ 1247(1 row) OID别名类型REGCLASS:主要用于对象OID值的简化查找。 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243 gaussdb=# SELECT attrelid,attname,atttypid,attstattarget FROM pg_attribute WHERE attrelid = 'pg_type'::REGCLASS; attrelid | attname | atttypid | attstattarget ----------+------------+----------+--------------- 1247 | xc_node_id | 23 | 0 1247 | tableoid | 26 | 0 1247 | cmax | 29 | 0 1247 | xmax | 28 | 0 1247 | cmin | 29 | 0 1247 | xmin | 28 | 0 1247 | oid | 26 | 0 1247 | ctid | 27 | 0 1247 | typname | 19 | -1 1247 | typnamespace | 26 | -1 1247 | typowner | 26 | -1 1247 | typlen | 21 | -1 1247 | typbyval | 16 | -1 1247 | typtype | 18 | -1 1247 | typcategory | 18 | -1 1247 | typispreferred | 16 | -1 1247 | typisdefined | 16 | -1 1247 | typdelim | 18 | -1 1247 | typrelid | 26 | -1 1247 | typelem | 26 | -1 1247 | typarray | 26 | -1 1247 | typinput | 24 | -1 1247 | typoutput | 24 | -1 1247 | typreceive | 24 | -1 1247 | typsend | 24 | -1 1247 | typmodin | 24 | -1 1247 | typmodout | 24 | -1 1247 | typanalyze | 24 | -1 1247 | typalign | 18 | -1 1247 | typstorage | 18 | -1 1247 | typnotnull | 16 | -1 1247 | typbasetype | 26 | -1 1247 | typtypmod | 23 | -1 1247 | typndims | 23 | -1 1247 | typcollation | 26 | -1 1247 | typdefaultbin | 194 | -1 1247 | typdefault | 25 | -1 1247 | typacl | 1034 | -1 1247 | typelemmod | 23 | -1(39 rows) 父主题: 数据类型
  • inet inet类型在一个数据区域内保存主机的IPv4或IPv6地址,以及一个可选子网。主机地址中网络地址的位数表示子网(“子网掩码”)。如果子网掩码是32并且地址是IPv4,则这个值不表示任何子网,只表示一台主机。在IPv6里,地址长度是128位,因此128位表示唯一的主机地址。 该类型的输入格式是address/y,address表示IPv4或者IPv6地址,y是子网掩码的二进制位数。如果省略/y,则子网掩码对IPv4是32,对IPv6是128,所以该值表示只有一台主机。如果该值表示只有一台主机,/y将不会显示。 inet和cidr类型之间的基本区别是inet接受子网掩码,而cidr不接受。
  • macaddr macaddr类型存储MAC地址,也就是以太网卡硬件地址(尽管MAC地址还用于其它用途)。可以接受下列格式: '08:00:2b:01:02:03''08-00-2b-01-02-03''08002b:010203''08002b-010203''0800.2b01.0203''08002b010203' 以上示例表示同一个地址。对于数据位a到f,不区分大小写,输出时都是以第一种形式展示。
  • cidr cidr(无类别域间路由,Classless Inter-Domain Routing)类型,保存一个IPv4或IPv6网络地址,如表2所示。声明网络格式为address/y,address表示IPv4或者IPv6地址,y表示子网掩码的二进制位数。如果省略y,则掩码部分使用已有类别的网络编号系统进行计算,但要求输入的数据已经包括了确定掩码所需的所有字节。 表2 cidr类型输入举例 cidr输入 cidr输出 abbrev(cidr) 192.168.100.128/25 192.168.100.128/25 192.168.100.128/25 192.168/24 192.168.0.0/24 192.168.0/24 192.168/25 192.168.0.0/25 192.168.0.0/25 192.168.1 192.168.1.0/24 192.168.1/24 192.168 192.168.0.0/24 192.168.0/24 10.1.2 10.1.2.0/24 10.1.2/24 10.1 10.1.0.0/16 10.1/16 10 10.0.0.0/8 10/8 10.1.2.3/32 10.1.2.3/32 10.1.2.3/32 2001:4f8:3:ba::/64 2001:4f8:3:ba::/64 2001:4f8:3:ba::/64 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:2e0:81ff:fe22:d1f1 ::ffff:127.0.0.0/120 ::ffff:127.0.0.0/120 ::ffff:127.0.0.0/120 ::ffff:127.0.0.0/128 ::ffff:127.0.0.0/128 ::ffff:127.0.0.0/128
  • 位串类型 位串就是一串1和0的字符串。它们可以用于存储位掩码。 GaussDB支持两种位串类型:bit(n)和bit varying(n),这里的n是一个正整数,n最大取值为83886080,相当于10M的容量。 bit类型的数据必须准确匹配长度n,如果存储的数据长度不匹配都会报错。bit varying类型的数据是最长为n的变长类型,长度超过n时会被拒绝。一个没有长度的bit等效于bit(1),没有长度的bit varying表示没有长度限制。 如果用户明确地把一个位串值转换成bit(n),则此位串数值右边超过n位的内容将被截断,或者在位串数值不足n位时右边补齐零到n位,不会提示错误。 如果用户明确地把一个位串数值转换成bit varying(n),但位串数值超过了n位,则位串数值的右边将被截断。 使用ADMS平台8.1.3-200驱动版本及之前版本时,写入bit类型需要用::bit varying进行类型转换,否则可能出现异常报错。 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829 --创建表。gaussdb=# CREATE TABLE bit_type_t1 ( BT_COL1 INTEGER, BT_COL2 BIT(3), BT_COL3 BIT VARYING(5)) DISTRIBUTE BY REPLICATION;--插入数据。gaussdb=# INSERT INTO bit_type_t1 VALUES(1, B'101', B'00');--插入数据的长度不符合类型的标准会报错。gaussdb=# INSERT INTO bit_type_t1 VALUES(2, B'10', B'101');ERROR: bit string length 2 does not match type bit(3)CONTEXT: referenced column: bt_col2--将不符合类型长度的数据进行转换。gaussdb=# INSERT INTO bit_type_t1 VALUES(2, B'10'::bit(3), B'101');--查看数据。gaussdb=# SELECT * FROM bit_type_t1; bt_col1 | bt_col2 | bt_col3 ---------+---------+--------- 1 | 101 | 00 2 | 100 | 101(2 rows)--删除表。gaussdb=# DROP TABLE bit_type_t1; 父主题: 数据类型
  • 优化分析 如果将a作为t1和t2的分布列: 12 CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a);CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (a); 则执行计划将存在“Streaming”,导致DN之间存在较大通信数据量,如图1所示。 图1 选择合适的分布列案例(一) 如果将a作为t1的分布列,将b作为t2的分布列: 12 CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a);CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (b); 则执行计划将不包含“Streaming”,减少DN之间存在的通信数据量,从而提升查询性能,如图2所示。 图2 选择合适的分布列案例(二)
  • 语法格式 1234 predpush_same_level([@queryblock] src, dest)predpush_same_level([@queryblock] src1 src2 ..., dest)[no] nestloop_index([@queryblock] dest[, index_list]) -- 索引方式[no] nestloop_index([@queryblock] dest[,(src1 src2 ...)]) -- 表名方式 predpush_same_level参数仅在rewrite_rule中的predpushforce选项打开时生效。 nestloop_index对rewrite_rule不做要求。
  • 字符类型 GaussDB支持的字符类型如表1所示 。字符串操作符和相关的内置函数请参见字符处理函数和操作符。 表1 字符类型 名称 描述 存储空间 CHAR(n) CHARACTER(n) NCHAR(n) 定长字符串,不足补空格。n是指字节长度,如不带精度n,默认精度为1。 n最大为10485760(即10MB)。 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'、b_format_dev_version = 's1'后: 类型:n指字符长度,区间[0,10485760]。如不带精度n,默认精度为1。定长字符串,不足补充空格。 输入: 作为表列和临时变量的数据类型:输入字符串字符个数在范围内可以正常输入,sql_mode参数值包含“strict_trans_tables”时,超过范围直接报错,否则按n最大字符长度截断处理并告警。 输出: 作为表列和临时变量的数据类型:sql_mode参数值包含“pad_char_to_full_length”时,输出带有尾部空格的字符串,否则输出不带尾部空格的字符串。 作为函数参数和返回值,存储过程的参数:不支持长度校验(例如:自定义函数入参为CHAR(5)类型,输入一个字符串'123456',不校验长度,可以直接传入参数)。 最大为10M个字符。 VARCHAR(n) CHARACTER VARYING(n) 变长字符串。PG兼容模式下,n是字符长度。其他兼容模式下,n是指字节长度。 n最大为10485760(即10MB)。 不带n时,最大存储字节长度为1GB-85-4(存储长度参数的空间)-其余列长度,比如(a int, b varchar, c int),varchar最大长度为1GB-85-4(存储长度参数的空间)-4(a列int的长度)-4(c列int的长度)=1,073,741,727‬。 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'、b_format_dev_version = 's1'后: n指字符长度,区间[0,10485760],如不带精度n,默认为不限制长度,长度与TEXT类型相同。 输入: 作为表列和临时变量的数据类型:输入字符串字符个数在范围内可以正常输入,sql_mode参数值包含“strict_trans_tables”时,超过范围直接报错,否则按n最大字符长度截断处理并告警。 输出:原字符串输出。 n最大为10485760(即10MB)。 不带n时,最大存储字节长度为1GB-85-4(存储长度参数的空间)-其余列长度,比如(a int, b varchar, c int),varchar最大长度为1GB-85-4(存储长度参数的空间)-4(a列int的长度)-4(c列int的长度)=1,073,741,727‬。 VARCHAR2(n) 变长字符串。是VARCHAR(n)类型的别名。 n最大为10485760(即10MB)。 不带n时,最大存储字节长度为1GB-85-4(存储长度参数的空间)-其余列长度,比如(a int, b varchar2, c int),varchar2最大长度为1GB-85-4(存储长度参数的空间)-4(a列int的长度)-4(c列int的长度)=1,073,741,727‬。 NVARCHAR2(n) 变长字符串。在SQL_ASCII字符集下,n表示的字节;在非SQL_ASCII字符集下,n表示的是字符。 n最大为10485760(即10MB)。 不带n时,最大存储字节长度为1GB-85-4(存储长度参数的空间)-其余列长度,比如(a int, b nvarchar2, c int),nvarchar2最大长度为1GB-85-4(存储长度参数的空间)-4(a列int的长度)-4(c列int的长度)=1,073,741,727‬。 TEXT 变长字符串。 最大存储字节长度为1GB-85-4(存储长度参数的空间)-其余列长度,比如(a int, b text, c int),text最大长度为1GB-85-4(存储长度参数的空间)-4(a列int的长度)-4(c列int的长度)=1,073,741,727‬。 CLOB 文本大对象。 在ustore下,最大为1GB-1,但还需要考虑到列描述头信息的大小,以及列所在元组的大小限制(也小于1GB-1),因此CLOB类型最大值可能小于1GB-1。 TINYTEXT MEDIUMTEXT LONGTEXT 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'、b_format_dev_version = 's1'后可以使用这些类型。 类型转换成TEXT类型,使用场景与TEXT类型相同。 最大为1GB-1,但还需要考虑到列描述头信息的大小,以及列所在元组的大小限制(也小于1GB-1),因此TEXT类型最大值可能小于1GB-1。 除了每列的大小限制以外,每个元组的总大小也不可超过1GB-1字节,主要受列的控制头信息、元组控制头信息以及元组中是否存在NULL字段等影响。 NCHAR为bpchar类型的别名,VARCHAR2(n)为VARCHAR(n)类型的别名。 超过1GB的clob只有dbe_lob相关高级包支持,系统函数不支持大于1GB clob。 在A兼容模式下,默认将接收到的空字符串转换为null。 GaussDB还支持另外两种定长字符类型,如表2所示。name类型只用在内部系统表中,作为存储标识符,不建议普通用户使用。该类型长度当前定为64字节(63可用字符加结束符)。类型“char”只用了一个字节的存储空间,在系统内部主要用于系统表,主要作为简单化的枚举类型使用。 表2 特殊字符类型 名称 描述 存储空间 name 用于对象名的内部类型。 64字节。 "char" 单字节内部类型。 1字节。 父主题: 数据类型
  • 示例 显示用字母t和f输出Boolean值。 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728 --创建表。gaussdb=# CREATE TABLE bool_type_t1 ( BT_COL1 BOOLEAN, BT_COL2 TEXT)DISTRIBUTE BY HASH(BT_COL2);--插入数据。gaussdb=# INSERT INTO bool_type_t1 VALUES (TRUE, 'sic est');gaussdb=# INSERT INTO bool_type_t1 VALUES (FALSE, 'non est');--查看数据。gaussdb=# SELECT * FROM bool_type_t1; bt_col1 | bt_col2 ---------+--------- t | sic est f | non est(2 rows)gaussdb=# SELECT * FROM bool_type_t1 WHERE bt_col1 = 't'; bt_col1 | bt_col2 ---------+--------- t | sic est(1 row)--删除表。gaussdb=# DROP TABLE bool_type_t1;
  • 优化说明 通常优化器总会选择最优的执行计划,但是代价估算,尤其是中间结果集的代价估算一般会有比较大的偏差,这种比较大的偏差就可能会导致agg的计算方式出现比较大的偏差,这时候就需要通过best_agg_plan进行agg计算模型的干预。 一般来说,当agg汇聚的收敛度很小时,即结果集的个数在agg之后并没有明显变少(经验上以5倍为临界点),选择redistribute+hashagg执行方式,否则选择hashagg+redistribute+hashagg执行方式。
  • 数据类型 数据类型是数据的一个基本属性,用于区分不同类型的数据。不同的数据类型所占的存储空间不同,能够进行的操作也不相同。数据库中的数据存储在数据表中。数据表中的每一列都定义了数据类型,用户存储数据时,须遵从这些数据类型的属性,否则可能会出错。 GaussDB支持某些数据类型间的隐式转换,具体转换关系请参见PG_CAST。 数值类型 货币类型 布尔类型 字符类型 二进制类型 日期/时间类型 几何类型 网络地址类型 位串类型 UUID类型 JSON/JSONB类型 HLL数据类型 范围类型 对象标识符类型 伪类型 账本数据库使用的数据类型 XML类型 XMLTYPE类型 aclitem类型 数组类型 向量数据类型 向量化引擎支持的数据类型 父主题: SQL参考
  • 现象描述 查询与销售部所有员工的信息: 1 2 3 4 5 6 7 8 9101112131415161718192021222324 --建表CREATE TABLE staffs (staff_id NUMBER(6) NOT NULL, first_name VARCHAR2(20), last_name VARCHAR2(25), employment_id VARCHAR2(10), section_id NUMBER(4), state_name VARCHAR2(10), city VARCHAR2(10));CREATE TABLE sections(section_id NUMBER(4), place_id NUMBER(4), section_name VARCHAR2(20));CREATE TABLE states(state_id NUMBER(4));CREATE TABLE places(place_id NUMBER(4), state_id NUMBER(4));--优化前查询EXPLAIN SELECT staff_id,first_name,last_name,employment_id,state_name,city FROM staffs,sections,states,places WHERE sections.section_name='Sales' AND staffs.section_id = sections.section_id AND sections.place_id = places.place_id AND places.state_id = states.state_id ORDER BY staff_id;--创建索引CREATE INDEX loc_id_pk ON places(place_id);CREATE INDEX state_c_id_pk ON states(state_id);--优化后查询EXPLAIN SELECT staff_id,first_name,last_name,employment_id,state_name,city FROM staffs,sections,states,places WHERE sections.section_name='Sales' AND staffs.section_id = sections.section_id AND sections.place_id = places.place_id AND places.state_id = states.state_id ORDER BY staff_id;
  • 现象描述 某局点测试过程中EXPLAIN ANALYZE后有如下情况: 从执行信息上比较明确的可以看出HashJoin是整个计划的性能瓶颈点,并且从HashJoin的执行时间信息[2657.406,93339.924](数值的具体含义请参见SQL执行计划详解),上可以看出HashJoin在不同的DN上存在严重的计算倾斜。 同时在Memory Information(如下图)中可以看出各个节点的内存资源消耗也存在极为严重的倾斜。
  • 优化说明 此优化的核心就是消除子查询。分析业务场景发现a.ca_address_sk不为NULL,那么从SQL语义出发,可以等价改写SQL为: 12345 select count(*) from customer_address_001 a4, customer_address_001 awhere a4.ca_address_sk = a.ca_address_skgroup by a.ca_address_sk; 为了保证改写的等效性,在customer_address_001. ca_address_sk加了not null约束。
  • 功能描述 创建一个预备语句。 预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用DEALLOCATE进行删除,会话结束时,PREPARE也会自动删除。
  • 优化分析 上述两个特征表明了此SQL语句存在极为严重的计算倾斜。进一步向HashJoin算子的下层分析发现Seq Scan on s_riskrate_setting也存在极为严重的计算倾斜[38.885,2940.983]。根据Scan的含义推测此计划性能问题的根源在于表s_riskrate_setting数据的分布倾斜。实际分析之后确实发现表s_riskrate_setting存在严重的数据倾斜。整改之后性能从94s提升为50s。
  • 语法格式 LOAD DATA [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [PARTITION (partition_name [, partition_name] ...)] [CHARACTER SET charset_name] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number {LINES | ROWS}] [(col_name_or_user_var [, col_name_or_user_var] ...)] [SET col_name={expr | DEFAULT} [, col_name={expr | DEFAULT}] ...]
  • 参数说明 LOCAL 指定导入文件的位置。 不指定LOCAL时,若file_name为相对路径,则默认导入路径为数据目录。 若指定LOCAL参数则需要指定file_name为绝对路径,当指定为相对路径时默认导入路径为数据库二进制所在路径,即$GAUSSHOME/bin/。 当导入数据与表中数据冲突或文件中字段数小于指定表中字段数时,指定LOCAL与指定IGNORE作用一致。 REPLACE | IGNORE 当导入数据与表中原有数据冲突时,若指定REPLACE,则替换冲突行数据;若指定IGNORE,则跳过冲突行数据,继续导入。若数据冲突但不指定REPLACE、IGNORE或LOCAL中任意一个,则终止导入并报错。 若文件字段数小于指定表列数,指定LOCAL或IGNORE参数会为剩余列赋默认值。不指定IGNORE或LOCAL参数会报错。 PARTITION 当导入表为分区表时,此参数用来指定分区。若数据与指定分区范围不一致,则报错。 CHARACTER SET 指定数据文件的编码格式名称,缺省为当前客户端编码格式。 FIELDS | COLUMNS TERMINATED BY 指定两列之间分隔符,缺省为“\t”。 指定换行符不能与分隔符相同。 [OPTIONALLY] ENCLOSED BY 指定引号字符,缺省为''。 OPTIONALLY参数为可选参数,无实际作用。 引号符仅支持单字符,不支持字符串。 ESCAPED BY 指定转义符,缺省为“\”。 转义字符仅支持单字符,不支持字符串。 LINES STARTING BY 指定导入数据文件起始字段样式。 TERMINATED BY 指定导入数据文件换行符样式。 IGNORE 指定数据导入时,跳过数据文件的前number行。 col_name_or_user_var 可选的待复制字段列表。 取值范围:如果没有声明字段列表,将使用所有字段。 指定列参数不支持重复指定列。 LOAD DATA语法指定列时,col_name_or_user_var仅支持指定为表中存在列,不支持指定为用户变量。 SET 指定列值,可以指定为表达式或DEFAULT。 表达式中不支持列名。 若表达式结果类型与被赋值列对应类型之间不存在隐式转换函数则报错。
  • 注意事项 LOAD DATA语法仅在MYSQL兼容模式(sql_compatibility = 'MYSQL')下支持。 LOAD DATA语法仅在开启b_format_version='5.7'和b_format_dev_version='s2'参数后与MYSQL功能一致。 LOAD DATA语法权限相关GUC参数与COPY FROM语法注意事项一致。 LOAD DATA语法需要拥有表的INSERT和DELETE权限。 执行LOAD DATA语法写入表中的数据若无法转换为表中数据类型格式时,将导致导入失败。 LOAD DATA只能用于表,不能用于视图。
  • 示例 --创建表。gaussdb=# CREATE TABLE load_data_tbl1(load_col1 INT UNIQUE, load_col2 INT, load_col3 CHAR(10));--向表中插入一条数据。gaussdb=# INSERT INTO load_data_tbl1 VALUES(0,0,'load0');--从文件/home/omm/load1.csv中复制数据到load_data_tbl表,指定列名,设置.load_col3列值统一为"load"。gaussdb=# LOAD DATA INFILE '/home/omm/load1.csv' INTO TABLE load_data_tbl1(load_col1, load_col2) SET load_col3 = 'load';--后面导入数据load_col3列值均为'load'gaussdb=# SELECT * FROM load_data_tbl1; load_col1 | load_col2 | load_col3-----------+-----------+------------ 0 | 0 | load0 3 | 3 | load 1 | 1 | load 2 | 2 | load(4 rows)--从文件/home/omm/load2.csv中复制数据到load_data_tbl表.,指定IGNORE忽略冲突gaussdb=# LOAD DATA INFILE '/home/omm/load2.csv' IGNORE INTO TABLE load_data_tbl1;--表load_data_tbl1中数据不变,冲突数据跳过。gaussdb=# SELECT * FROM load_data_tbl1; load_col1 | load_col2 | load_col3-----------+-----------+------------ 0 | 0 | load0 3 | 3 | load 1 | 1 | load 2 | 2 | load(4 rows)--创建分区表gaussdb=# CREATE TABLE load_data_tbl2( load_col_col1 INT, load_col_col2 INT) PARTITION BY RANGE (load_col_col2)( PARTITION load_p1 VALUES LESS THAN(3), PARTITION load_p2 VALUES LESS THAN(9), PARTITION load_p3 VALUES LESS THAN(MAXVALUE));--从文件/home/omm/load3.csv中复制数据到load_data_tbl2表.,指定PARTITION。gaussdb=# LOAD DATA INFILE '/home/omm/load3.csv' INTO TABLE load_data_tbl2 PARTITION (load_p2);--数据导入到load_data_tbl2表中指定分区gaussdb=# SELECT * FROM load_data_tbl2; load_col_col1 | load_col_col2---------------+--------------- 4 | 4 5 | 5(2 rows)--创建表gaussdb=# CREATE TABLE load_data_tbl3(load_col_col1 CHAR(30));--从文件/home/omm/load4.csv中复制数据到load_data_tbl3表.,指定FIELDS ENCLOSED BY;gaussdb=# LOAD DATA INFILE '/home/omm/load4.csv' INTO TABLE load_data_tbl3 FIELDS ENCLOSED BY '"';--数据"load test quote"双引号被去掉,'load test single_quote'单引号保留gaussdb=# select * from load_data_tbl3; load_col_col1-------------------------------- load test quote 'load test single_quote'(2 rows)--删除表。gaussdb=# drop table load_data_tbl1;gaussdb=# DROP TABLE load_data_tbl2;gaussdb=# DROP TABLE load_data_tbl3;
  • 功能描述 显示SQL语句的执行计划。 执行计划将显示SQL语句所引用的表会采用什么样的扫描方式,如:简单的顺序扫描、索引扫描等。如果引用了多个表,执行计划还会显示用到的JOIN算法。 执行计划的最关键的部分是语句的预计执行开销,影响计划生成器估算执行该语句将花费多长的时间。 若指定了ANALYZE选项,则该语句会被执行,然后根据实际的运行结果显示统计数据,包括每个计划节点内时间总开销(毫秒为单位)和实际返回的总行数。这对于判断计划生成器的估计值是否接近实际值非常有用。
  • 参数说明 statement 指定要分析的SQL语句。 ANALYZE boolean | ANALYSE boolean 显示实际运行时间和其他统计数据。当两个参数同时使用时,在option中排在后面的一个生效。 取值范围: TRUE(缺省值):显示实际运行时间和其他统计数据。 FALSE:不显示。 VERBOSE boolean 显示有关计划的额外信息。 取值范围: TRUE(缺省值):显示额外信息。 FALSE:不显示。 COSTS boolean 包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。 取值范围: TRUE(缺省值):显示估计总成本和宽度。 FALSE:不显示。 CPU boolean 打印CPU的使用情况的信息。需要结合ANALYZE或ANALYSE选项一起使用。 取值范围: TRUE(缺省值):显示CPU的使用情况。 FALSE:不显示。 DETAIL boolean 打印DN上的信息。需要结合ANALYZE或ANALYSE选项一起使用。 取值范围: TRUE(缺省值):打印DN的信息。 FALSE:不打印。 NODES boolean 打印query执行的节点信息。 取值范围: TRUE(缺省值):打印执行的节点的信息。 FALSE:不打印。 NUM_NODES boolean 打印执行中的节点的个数信息。 取值范围: TRUE(缺省值):打印DN个数的信息。 FALSE:不打印。 BUFFERS boolean 包括缓冲区的使用情况的信息。需要结合ANALYZE或ANALYSE选项一起使用。 取值范围: TRUE:显示缓冲区的使用情况。 FALSE(缺省值):不显示。 TIMING boolean 包括实际的启动时间和花费在输出节点上的时间信息。需要结合ANALYZE或ANALYSE选项一起使用。 取值范围: TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。 FALSE:不显示。 PLAN boolean 是否将执行计划存储在plan_table中。当该选项开启时,会将执行计划存储在plan_table中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。 取值范围: TRUE(缺省值):将执行计划存储在plan_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUC CES S。 FALSE:不存储执行计划,将执行计划打印到当前屏幕。 BLOCKNAME boolean 是否显示计划的每个操作所处于的查询块。当该选项开启时,会将每个操作所处于的查询块的名字输出在Query Block列上,方便用户获取查询块名字,并使用Hint修改执行计划: TRUE(缺省值):显示计划时,将每个操作所处于的查询块的名字输出在新增列Query Block列上。该选项需要在pretty模式下使用。见指定Hint所处的查询块Queryblock章节。 FALSE:不对计划显示产生影响。 FORMAT 指定输出格式。 取值范围:TEXT,XML,JSON和YAML。 默认值:TEXT。 PERFORMANCE 使用此选项时,即打印执行中的所有相关信息。下述为部分信息描述: ex c/r:代表平均每行使用cpu周期数,等于(ex cyc)/(ex row)。 ex row:执行行数。 ex cyc:代表使用的cpu周期数。 inc cyc:代表包含子节点使用的总cpu周期数。 shared hit:代表算子的share buffer命中情况。 loops:算子循环执行次数。 total_calls:生成元素总数。 remote query poll time stream gather:算子用于侦听各DN数据到达CN的网络poll时间。 deserialize time:反序列化所需时间。 estimated time:估计时间。 Network Poll Time:分布式stream网络通信时,表示libcomm接收侧等待数据耗时。 Stream Send time:分布式stream网络通信时,表示libcomm或libpq发送数据耗时。 OS Kernel Send time:分布式stream网络通信时,表示操作系统层发送数据耗时,大于0才会显示。 Wait Quota time:分布式stream网络通信时,表示libcomm等待对端发送quota流控大小耗时,大于0才会显示。 Data Serialize time:分布式stream网络通信时,表示数据序列化时间 。 Data Copy time:分布式stream网络通信时,表示数据复制时间,大于0才会显示。
  • 语法格式 显示SQL语句的执行计划,支持多种选项,对选项顺序无要求。 1 EXPLAIN [ ( option [, ...] ) ] statement; 其中选项option子句的语法为。 1 2 3 4 5 6 7 8 910111213 ANALYZE [ boolean ] | ANALYSE [ boolean ] | VERBOSE [ boolean ] | COSTS [ boolean ] | CPU [ boolean ] | DETAIL [ boolean ] | NODES [ boolean ] | NUM_NODES [ boolean ] | BUFFERS [ boolean ] | TIMING [ boolean ] | PLAN [ boolean ] | BLOCKNAME [ boolean ] | FORMAT { TEXT | XML | JSON | YAML } 显示SQL语句的执行计划,且要按顺序给出选项。 1 EXPLAIN { [ ANALYZE | ANALYSE ] [ VERBOSE ] | PERFORMANCE } statement;
  • 参数说明 configuration_parameter 运行时参数的名称。 取值范围:可以使用SHOW ALL命令查看运行时参数。 部分通过SHOW ALL查看的参数不能通过SET设置,如max_datanodes。 CURRENT_SCHEMA 当前模式。 TIME ZONE 时区。 TRANSACTION ISOLATION LEVEL 事务的隔离级别。 SESSION AUTHORIZATION 当前会话的用户标识符。 ALL 所有运行时参数。
  • 示例 --设置时区为意大利。gaussdb=# SET timezone TO 'Europe/Rome';--查看当前时区。gaussdb=# SHOW timezone; TimeZone ------------- Europe/Rome(1 row)--将时区设置为缺省值。gaussdb=# RESET timezone;--查看当前时区。gaussdb=# SHOW timezone; TimeZone ---------- PRC(1 row)--如上SQL等效于如下两条SQL,将时区设置为缺省值。gaussdb=# SET timezone TO DEFAULT;gaussdb=# ALTER SESSION SET timezone to DEFAULT;
共99303条