金仓数据库 KingbaseES插件参考手册 C

11. citext

11.1. 插件citext简介

citext定义了citext类型以及其相关函数。

  • 插件名为citext

  • 插件版本 V1.0

11.2. 插件citext加载方式

使用时需要create extension citext。

示例:

create extension citext;

11.3. 插件citext参数配置

无需配置任何参数

11.4. 插件citext使用方法

11.4.1. regexp_matches

regexp_matches-获得匹配的模式串集合

语法

regexp_matches(c1 citext, c2 citext ) RETURNS SETOF TEXT[]。
regexp_matches(c1 citext, c2 citext, t1 text ) RETURNS SETOF TEXT[]。

描述

regexp_matches会返回匹配的模式串集合。

参数

  • c1 待匹配的字符串

  • c2 正则表达式

  • t1 匹配的模式

返回值

返回计算完成的特定的日期类型值。

注解

regexp_matches(c1 citext, c2 citext ) 相当于 regexp_matches(c1 citext, c2 citext, t1 text ) 的t1的值为'i'。 t1的参数为'c'代表大小写敏感,'g'允许输出多行等。

示例

SELECT regexp_matches('foobarbequebaz'citext, '(BAR)(BEQUE)') = ARRAY[ 'bar', 'beque' ] AS t;
 t
---
 t
(1 row)

SELECT regexp_matches('foobarbequebaz'citext, '(BAR)(BEQUE)'citext) = ARRAY[ 'bar', 'beque' ] AS t;
 t
---
 t
(1 row)

11.4.2. citext

citext-将输入转换为citext类型并输出

语法

citext(bpchar) RETURNS citext。
citext(boolean) RETURNS citext。
citext(inet) RETURNS citext。

示例

select citext('abc'bpchar);
 citext
--------
 abc
(1 行记录)

11.4.3. citext_eq

citext_eq-对两个输入的citext类型进行比较,相等返回true,不相等返回false。。

语法

citext_eq(citext, citext) RETURNS bool。

示例

select citext_eq('as','ab');
 citext_eq
-----------
 f
(1 行记录)

11.4.4. citext_ne(citext, citext)

与citext_ne的功能相反

11.4.5. citext_hash

citext_hash-将输入的citext转换为hash值并输出。

语法

citext_hash(citext) RETURNS int4。

示例

select citext_hash('ab');
 citext_hash
-------------
  1718550461
(1 行记录)

11.4.6. 支持两个citext类型≥,≤,>,<,=,!=等操作符的操作

示例

TEST=# select 'abd'citext != 'abs'citext;
 ?column?
----------
t
(1 行记录)

TEST=# select 'abd'citext = 'abs'citext;
 ?column?
----------
f
(1 行记录)

TEST=# select 'abd'citext > 'abs'citext;
 ?column?
----------
f
(1 行记录)

TEST=# select 'abd'citext >= 'abs'citext;
 ?column?
----------
f
(1 行记录)

TEST=# select 'abd'citext >= 'abd'citext;
 ?column?
----------
t
(1 行记录)

11.5. 插件citext卸载方法

不需要citext插件只需要卸载插件即可。

示例:

drop extension citext;

11.6. 插件citext升级方法

citext扩展插件通常随KingbaseES安装包一并升级。通常情况下用户无法单独升级插件。

12. cstore_fdw

12.1. 插件cstore_fdw简介

cstore_fdw 是一款列存扩展插件。列存储在数据批量导入的分析场景能够提供更好的性能。cstore_fdw通过只读取磁盘上相关的列数据来提升性能。

同时,由于每列的数据来自同一个域,因此更利于数据压缩,cstore_fdw 提供 6~10 倍的数据压缩能力,从而减小了对磁盘存储的需求。

cstore_fdw 采用 Optimized Row Columnar (ORC) 格式作为其数据的物理存储格式。ORC 优化了 Facebook 的 RCFile 存储格式,并具有以下优点:

  • 压缩 (Compression) - 大约减少了 2~4 倍的内存和磁盘存储空间。易于扩展以支持不同的编码。

  • 列投影 (Column Projections) - 仅仅读取与该查询有关的数据列,提高了 I/O 效率。

  • 跳跃索引 (Skip Indexes) - 为每个行组 (Row Groups) 存储其最大值和最小值,并利用他们来跳过不相关的数据行。

KingbaseES中通过cstore_fdw插件来实现列式存储及压缩。

  • 插件名为 cstore_fdw

  • 插件版本 V1.7

12.2. 插件cstore_fdw加载方式

启动KingbaseES数据库后执行SQL命令创建插件。

示例:

CREATE EXTENSION cstore_fdw;

12.3. 插件cstore_fdw的参数配置

无需配置任何参数

12.4. 插件cstore_fdw的使用方法

以下四个选项可以在创建 cstore 外部表的时候指定:

  • filename (可选)

该参数存放列存表数据的绝对路径,如果没有指定该选项,那么 cstore_fdw 则采用默认的 $PGHOME/cstore_fdw 来存储列存表数据。如果为该参数指定了值,则使用该值作为前缀来存储列存表数据信息。例如,当指定的 filename 值为 /cstore_fdw/my_table,那么 cstore_fdw 将使用 /cstore_fdw/my_table 来存储列存表用户数据,同时,使用 /cstore_fdw/my_table.footer 来存储列存表的元数据信息。

  • compression (可选)

该参数用于指定用户数据的压缩算法,支持 none,pglz,zstd(Zstandard压缩,可通过cstore_fdw.zstd_compression_level设置压缩级别,级别范围0~9,默认级别1)和dict(字典压缩)四个值,默认值为 none。

  • stripe_row_count (可选)

该参数指定每个 stripe 中行记录数,默认值为 150000。该值越小,加载数据或者查询时使用的内存也就越小,相反,其性能也就越低。

  • block_row_count (可选) - 该参数指定每个列数据块 (column block) 中的行记录数,默认为 10000。cstore_fdw 压缩数据、创建跳跃索引以及磁盘读取时都是以块 (block) 为最小单元。该值越大,则利用数据压缩,并可以减少磁盘读取的次数量,然而,这将影响到跳过不相关的数据块的概率。

cstore_fdw 提供了两种方式用于向其导入数据:

  • 使用 COPY 命令将文件、程序或者标准输入中导入数据;

  • 使用 INSERT INTO cstore_table SELECT ... 语法从其他表导入数据。

我们可以使用 ANALYZE 命令收集列存表的统计信息,从而帮助优化器选择最优的查询计划。

注意

  1. cstore_fdw 目前并不支持使用 UPDATE 或 DELETE 命令来对表进行更新。同样,他也不支持单条记录的插入,这是由于每次导入数据都会形成至少一个数据块,若是支持单条记录插入,那么每个 INSERT 命令插入一条记录,将导致数据块过多从而影响性能,为此,cstore_fdw 不支持单条记录的插入。

  2. cstore_fdw 目前不支持创建字段约束。如果在创建cstore外部表时定义了约束,该创建语句不会报错,但约束条件无效。

12.4.1. 示例

-- 安装cstore_fdw
CREATE EXTENSION cstore_fdw;
CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;

-- 加载参数
LOAD 'cstore_fdw';

-- 查看当前zstd压缩级别参数值
show cstore_fdw.zstd_compression_level;
cstore_fdw.zstd_compression_level
-----------------------------------
1
(1 row)

-- 设置zstd压缩级别
SET cstore_fdw.zstd_compression_level = 3;
show cstore_fdw.zstd_compression_level;
cstore_fdw.zstd_compression_level
-----------------------------------
3
(1 row)

-- 创建无压缩列式存储外部表并指定存储文件
CREATE FOREIGN TABLE contestant (handle TEXT, birthdate DATE, rating INT,
      percentile FLOAT, country CHAR(3), achievements TEXT[])
      SERVER cstore_server
      OPTIONS(filename '/home/test/data/contestant.cstore');

-- 创建基于pglz压缩的列式存储外部表
CREATE FOREIGN TABLE contestant_compressed (handle TEXT, birthdate DATE, rating INT,
      percentile FLOAT, country CHAR(3), achievements TEXT[])
      SERVER cstore_server
      OPTIONS(compression 'pglz');

-- 创建基于zstd压缩算法的列式存储外部表
CREATE FOREIGN TABLE contestant_zstd (handle TEXT, birthdate DATE, rating INT,
      percentile FLOAT, country CHAR(3), achievements TEXT[])
      SERVER cstore_server
      OPTIONS(compression 'zstd');

-- 创建字典压缩算法的列式存储外部表
CREATE FOREIGN TABLE contestant_dict (handle TEXT, birthdate DATE, rating INT,
      percentile FLOAT, country CHAR(3), achievements TEXT[])
      SERVER cstore_server
      OPTIONS(compression 'dict');

-- 导入数据
-- 从文件导入
COPY contestant FROM '/home/test/input/data/contestants.1.csv' WITH CSV;
-- 从程序导入
COPY contestant FROM PROGRAM 'cat /home/test/input/data/contestants.2.csv' WITH CSV;
--从标准输入导入
copy contestant (handle, birthdate, rating, percentile, country, achievements)
from STDIN WITH CSV;
c,1988-11-01,2907,99.4,XB ,"{w,y}"
d,1985-05-05,2314,98.3,XB ,{}
e,1995-05-05,2236,98.2,XC ,{a}
\.

-- 解析
ANALYZE contestant;

--卸载
--卸载cstore_fdw之前,需要删除所有的cstore列存表、server和扩展
DROP FOREIGN TABLE contestant;
DROP FOREIGN TABLE contestant_compressed;
DROP SERVER cstore_server;
DROP EXTENSION cstore_fdw;

注意

cstore_fdw 会自动的创建目录来存储列存相关的数据,我们可以执行下面的命令来删除:

$ rm -rf $KESDATA/cstore_fdw

上面给出的是 cstore_fdw 的默认路径,若在建表的时候指定了 filename,其位置可能不同。 另外还需要移除kingbase.conf文件中shared_preload_libraries 中的 cstore_fdw。

12.4.2. 升级

cstore表在使用sys_upgrade工具升级默认行为如下:

  • 传输模式为拷贝(copy)

用户指定filename:在指定文件目录下,拷贝一份与成原文件相同的文件,文件名为加_upg。新库继续使用原文件。

用户不指定filename:使用默认位置将旧库的数据目录下的cstroe_fdw目录下的数据文件拷贝到新库数据目录下cstore_fdw目录下,新库使用新文件。

  • 传输模式为克隆(clone)

用户指定filename:在指定文件目录下,克隆一份与成原文件相同的文件,文件名为加_upg。新库继续使用原文件。

用户不指定filename,使用默认位置将旧库的数据目录下的cstroe_fdw目录下的数据文件克隆到新库数据目录下cstore_fdw目录下,新库使用新文件。

  • 传输模式为连接(link)

用户指定filename:在指定文件目录下,连接一份与成原文件相同的文件,文件名为加_upg。新库继续使用原文件。这里要注意,由于是连接,upg文件也将随原文件一起变更。

用户不指定filename:使用默认位置将旧库的数据目录下的cstroe_fdw目录下的数据文件连接到新库数据目录下cstore_fdw目录下,新库使用新文件,这里要注意,由于是连接,新旧文件相互影响。

12.5. 插件cstore_fdw卸载方法

在数据库中执行SQL命令卸载插件。

DROP EXTENSION cstore_fdw;

12.6. 插件cstore_fdw升级方法

cstore_fdw扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级插件。

13. cube

13.1. 插件cube简介

这个模块实现了一种数据类型cube来表示多维立方体。

  • 插件名为 cube

  • 插件版本 V1.4

13.2. 插件cube加载方式

create extension cube;

13.3. 插件cube的参数配置

无需配置任何参数

13.4. 插件cube的使用方法

13.4.1. 外部表示

在 表 13.4.2 展示了cube类型有效的外部表示。x、y等表示浮点数。

表 13.4.2 立方体外部表示

外部语法

含义

x

一个一维点(或者长度为零的一维区间)

( x )

同上

x1,x2,...,xn

n-维空间中的一个点,内部表示为一个零容积立方体

(x1,x2,...,xn)

同上

(x),(y)

开始于x并且结束于y的一个一维区间,反之亦然。顺序并不重要

[(x),(y)]

同上

(x1,...,xn),(y1,...,yn)

一个 n-维立方体,用它的对角顶点对表示

[(x1,...,xn),(y1,...,yn)]

同上

一个立方体的对角录入的顺序无关紧要。如果需要创建一种统一的“左下 — 右上”的内部表示,cube函数会自动地交换值。当角重合时,cube只存储一个角和一个“is point”标志,这样避免浪费空间。

输入中的空白空间会被忽略,因此[(x),(y)]与[ ( x ), ( y ) ]相同。

13.4.2. 精度

值在内部被存储为 64 位浮点数。这意味着超过 16 位有效位的数字将被截断。

13.4.3. 操作符

在 表 13.4.3 展示了为类型cube提供的操作符。

表 13.4.3 立方体操作符

操作符

结果

描述

a = b

boolean

立方体 a 和 b 相同。

a && b

boolean

立方体 a 和 b 重叠。

a @> b

boolean

立方体 a 包含 立方体 b。

a <@ b

boolean

立方体 a 被包含在立方体 b 中。

a < b

boolean

立方体 a 小于立方体 b。

a <= b

boolean

立方体 a 小于或者等于立方体 b。

a > b

boolean

立方体 a 大于立方体 b。

a >= b

boolean

立方体 a 大于或者等于立方体 b。

a <> b

boolean

立方体 a 不等于立方体 b。

a -> n

float8

得到立方体的第n个坐标(从 1 开始数)。

a ~> n

float8

以下列方式获取多维数据集的第n个坐标 n = 2 * k - 1表示第k维度的下限, n = 2 * k表示第k维度的上限。 负的n表示相应正坐标的倒数值。 此运算符专为KNN-GiST支持而设计。

标量排序操作符(<、>=等)除了用来排序之外没有什么实际用途。这些操作符首先比较第一个坐标,如果它们相等再比较第二个坐标等等。它们主要为支持cube的 b-树索引操作符类而存在,这类操作符对支持cube列上的 UNIQUE 约束等很有用。

cube模块也为cube值提供了一个 GiST 索引操作符类。cube GiST 索引可以被用于在WHERE子句中通过=、&&、@>以及<@操作符来搜索值。

此外,cube GiST 索引可以被用在ORDER BY子句中通过度量操作符<->、<#>和<=>来查找最近邻。例如, 3-D 点(0.5, 0.5, 0.5)的最近邻可以用下面的查询很快地找到:

create table test (c cube);

insert into test values(cube(array[2,2,2])),(cube(array[3,3,3]));

SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
    c
-----------
(2, 2, 2)
(1 row)

也可以用这种方式使用~>操作符来高效地检索通过选定坐标排序后的前几个值。例如,可以用下面的查询得到通过第一个坐标(左下角)升序排列后的前几个立方体:

SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
    c
-----------
(2, 2, 2)
(3, 3, 3)
(2 rows)

以及得到通过右上角第一个坐标降序排列后的二维立方体:

SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
    c
-----------
(3, 3, 3)
(2, 2, 2)
(2 rows)

13.4.4. 函数

表 13.4.4 显示了可用的函数:

表 13.4.4 立方体函数

函数

结果

描述

例子

cube(float8)

cube

制造一个一维立方体,坐标都是相同的。

cube(1) == '(1)'

cube(float8, float8)

cube

制造一个一维立方体。

cube(1,2) == '(1),(2)'

cube(float8[])

cube

使用数组定义的坐标制造一个零容积的立方体。

cube(ARRAY[1,2]) == '(1,2)'

cube(float8[], float8[])

cube

用由两个数组定义的右上和左下坐标制造一个立方体, 两个数组必须等长。

cube(ARRAY[1,2], ARRAY[3,4]) == '(1,2),(3,4)'

cube(cube, float8)

cube

在一个现有的立方体上增加一维来制造一个新立方体, 对新坐标的各个端点都采用相同的值。 这可以用于从计算得到的值逐渐地构建立方体。

cube('(1,2),(3,4)'::cube, 5) == '(1,2,5),(3,4,5)'

cube(cube, float8, float8)

cube

在一个现有的立方体上增加一维来制造一个新立方体。 这可以用于从计算得到的值逐渐地构建立方体。

cube('(1,2),(3,4)'::cube, 5, 6) == '(1,2,5),(3,4,6)'

cube_dim(cube)

integer

返回该立方体的维数

cube_dim('(1,2),(3,4)') == '2'

cube_ll_coord(cube, integer)

float8

返回一个立方体的左下角的第 n个坐标值

cube_ll_coord('(1,2),(3,4)', 2) == '2'

cube_ur_coord(cube, integer)

float8

返回一个立方体的右上角的第n个坐标值

cube_ur_coord('(1,2),(3,4)', 2) == '4'

cube_is_point(cube)

boolean

如果一个立方体是一个点则返回真, 也就是两个定义点相同。

cube_distance(cube, cube)

float8

返回两个立方体之间的距离。 如果两个都是点,这就是普通距离函数。

cube_subset(cube, integer[])

cube

从一个现有的立方体制造一个新立方体, 使用来自于一个数组的维索引列表。 它可以被用来抽取一个单一维度的端点, 或者它可以被用来去除维度, 或者按照需要对它们重新排序。

cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2]) == '(3),(7)' cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]) == '(5,3,1,1),(8,7,6,6)'

cube_union(cube, cube)

cube

产生两个立方体的并

cube_inter(cube, cube)

cube

产生两个立方体的交

cube_enlarge(c cube, r double, n integer)

cube

用一个指定的半径r在至少n个维度上增加立方体的尺寸。 如果该半径是负值,则该立方体会收缩。 这有助于围绕一个点创建一个外包盒来搜索附近点。 所有已定义的维度都会按照半径r被改变。 左下坐标按照r被减小并且右上坐标按照r被增加。 如果一个左下坐标被增加得超过对应的右上坐标 (这只会发生在r< 0 时), 则两个坐标会被设置为它们的均值。 如果n大于已定义的维度数 并且该立方体被增加(r >= 0), 则额外的维度会被加入以让维度数达到n, 对于额外的坐标将使用 0 作为初始值。 这个函数可用来创建围绕一个点的外包盒以搜索临近点。

cube_enlarge('(1,2),(3,4)', 0.5, 3) == '(0.5,1.5,-0.5),(3.5,4.5,0.5)'

13.4.5. 默认值

以下为并操作:

select cube_union('(0,5,2),(2,3,1)', '0');
cube_union
-------------------
(0, 0, 0),(2, 5, 2)
(1 row)

以下为交操作:

select cube_inter('(0,-1),(1,1)', '(-2),(2)');
cube_inter
-------------
(0, 0),(1, 0)
(1 row)

在所有不同维度立方体的二元操作中,我假定低纬度的那一个要做笛卡尔投影,即为字符串表示中被省略的坐标取零。上面的例子等同于:

cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');
cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');

下列包含谓词使用点语法,不过实际上第二个参数在内部被表示为一个盒体。这种语法让我们不必定义一种单独的点类型以及用于(盒体, 点)谓词的函数。

select cube_contains('(0,0),(1,1)', '0.5,0.5');
cube_contains
--------------
t
(1 row)

注意

用法的例子可见回归测试sql/cube.sql。为了不容易出问题,对于立方体的维度数有 100 的限制。如果你想要更大的立方体,可以在cubedata.h中修改。

13.5. 插件cube的卸载方法

drop extension cube;

13.6. 插件cube升级方法

cube扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级些插件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值