暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

金仓数据库 KingbaseES 插件参考手册 K (1)

数据猿 2022-08-29
1349

38. kbcrypto 

38.1. 插件kbcrypto简介 

kbcrypto是KingbaseES的一个扩展插件,可以提供如rc4,sm3,sm4等加密函数的访问,可以提供明文的加密打印输出到前端。

  • 插件名为 kbcrypto

  • 插件版本 V1.3

38.2. 插件kbcrypto加载方式 

KingbaseES数据库默认将它添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。

示例:

shared_preload_libraries = 'kbcrypto' # (change requires restart)


38.3. 插件kbcrypto的参数配置 

无需配置任何参数。

38.4. 插件kbcrypto的使用方法 

加载kbcrypto插件后,程序可以提供如rc4,sm3,sm4等加密函数的访问,可以提供明文的加密打印输出到前端。

示例:

-- 创建插件

\c test system
create extension kbcrypto ;
CREATE EXTENSION

-- 使用示例

select rc4('1234qwer', '123456789', 0);
        rc4
--------------------
 \x82f68c6109eb0d59
(1 行记录)

select sm3('123456789');
                               sm3
------------------------------------------------------------------
 c7ae0aec3d2f9beb84dc1885aa7a576baa7a07b38060afc64c5600f93a5456b5
(1 行记录)

select sm4('1234qwer', '123456789', 0);
                sm4
------------------------------------
 \x9da0498ecb92d7692cdd264356ede7d8
(1 行记录)


38.5. 插件kbcrypto卸载方法 

修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库。

示例:

shared_preload_libraries = ''


38.6. 插件kbcrypto升级方法 

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

39. kbrowlocks 

39.1. 插件kbrowlocks简介 

kbrowlocks提供了一个函数来显示指定表的行级锁信息。 默认仅限超级用户、pg_stat_scan_tables 角色的成员和在该表上拥有SELECT权限的用户使用。

  • 插件名为 kbrowlocks

  • 插件版本 V1.2

39.2. 插件kbrowlocks加载方式 

CREATE EXTENSION kbrowlocks;


39.3. 插件kbrowlocks的参数配置 

无需配置任何参数。

39.4. 插件kbrowlocks的使用方法 

表 39.4.1 kbrowlocks输出列 

名称

类型

描述

locked_row

tid

该行的tid

locker

xid

持有锁的xid号 (可能是multi xid号)

multi

boolean

locker是否是multi xid

xids

xid[]

持锁的实际xid

modes

text[]

持锁的模式

pids

integer[]

持锁backend的pid

kbrowlocks会为目标表加AccessShareLock并且逐行读取来收集锁信息,对于大表可能很慢。

注意

  1. 如果表被加了排他锁,kbrowlocks将被阻塞。

  2. kbrowlocks没有用一个一致的快照扫描。在执行过程中,数据可能被加上新行锁,也可能有旧行锁被释放。kbrowlocks不显示被锁定行的内容。如果想同时查看行内容,可以这样做

SELECT * FROM accounts AS a, kbrowlocks('accounts') AS p
 WHERE p.locked_row = a.ctid;


但要注意,这样的查询将非常低效。

SELECT * FROM kbrowlocks('test_rowlocks');
 locked_row | locker | multi |  xids   |     modes     |  pids
------------+--------+-------+---------+---------------+--------
 (0,1)      |  19574 | f     | {19574} | {"For Share"} | {5246}
(1 row)


39.5. 插件kbrowlocks卸载方法 

DROP EXTENSION kbrowlocks;


39.6. 插件kbrowlocks升级方法 

通过 ALTER EXTENSION升级插件。

示例,升级到 1.1

ALTER EXTENSION kbrowlocks UPDATE TO '1.1';

40. kbstattuple 

40.1. 插件kbstattuple简介 

kbstattuple提供了多种函数来获得关系中元组的统计信息。 默认情况下,只有角色pg_stat_scan_tables的成员和超级用户可以使用。

  • 插件名为 kbstattuple

  • 插件版本 V1.5

40.2. 插件kbstattuple加载方式 

CREATE EXTENSION kbstattuple;


40.3. 插件kbstattuple的参数配置 

无需配置任何参数。

40.4. 插件kbstattuple的使用方法 

kbstattuple提供以下函数:

pgstattuple(regclass) returns record

返回给定关系的物理长度、“死亡”元组百分比等信息。这些信息可以帮助用户决定是否要对关系做清理。

表 40.4.1 pgstattuple输出列 

名称

类型

描述

table_len

bigint

关系大小,单位字节

tuple_count

bigint

“活着”的元组数

tuple_len

bigint

“活着”的元组总大小,单位字节

tuple_percent

float8

"活着"的元组大小占关系大小百分比

dead_tuple_count

bigint

“死亡”的元组数

dead_tuple_len

bigint

“死亡”的元组总大小,单位字节

dead_tuple_percent

float8

"死亡"的元组大小占关系大小百分比

free_space

bigint

空闲空间大小,单位字节

free_percent

float8 | 空闲空间大小占关系大小百分比

pgstattuple(text) returns record

和pgstattuple(regclass)相同,区别是通过字符串指定关系。

pgstatindex(regclass) returns record

返回B树索引的相关信息。

表 40.4.2 pgstatindex输出列 

名称

类型

描述

version

integer

B树页面类型版本号

tree_level

integer

root页面的高度

index_size

bigint

索引大小,单位字节

root_block_no

bigint

root页面的块号

internal_pages

bigint

中间页面的数量

leaf_pages

bigint

叶子页面的数量

empty_pages

bigint

空页面的数量

deleted_pages

bigint

被删除页面的数量

avg_leaf_density

float8

叶子页面的平均填充度

leaf_fragmentation

float8

叶子页面的碎片化程度

pgstatindex(text) returns record

和pgstatindex(regclass)相同,区别是通过字符串指定关系。

pgstatginindex(regclass) returns record

返回GIN索引的相关信息。

表 40.4.3 pgstatginindex输出列 

名称

类型

描述

version

integer

GIN索引页面类型版本号

pending_pages

integer

pending列表中的页面数

pending_tuples

bigint

pending列表中的元组数

pgstathashindex(regclass) returns record

返回HASH索引的相关信息。

表 40.4.4 pgstathashindex输出列 

名称

类型

描述

version

integer

HASH索引页面类型版本号

bucket_pages

bigint

桶页面的页面数

overflow_pages

bigint

溢出页的页面数

bitmap_pages

bigint

位图页的页面数

unused_pages

bigint

未使用页面的页面数

live_items

bigint

可用元组数

dead_tuples

bigint

无效元组数

free_percent

float

空闲空间占比

pg_relpages(regclass) returns bigint

返回关系的页面数。

pg_relpages(text) returns bigint

和pg_relpages(regclass)相同,区别是通过字符串指定关系。

pgstattuple_approx(regclass) returns record

pgstattuple_approx是pgstattuple的一个更快速的替代,它返回近似的结果。这个函数通过VM页面跳过标记了“全部可见”的页面扫描,并从FSM页面中获取这类页面的空闲空间大小并假设剩余的空间都有“活着的”元组使用。对于不能被跳过的页面,函数会扫描每个元组并进行统计。最后,它会基于已扫描的页面元组数量来估计“活着”的元组总数。除对应pgstattuple的列外,有一个float8类型的列scanned_percent显示扫描的页面占比。

40.5. 插件kbstattuple卸载方法 

DROP EXTENSION kbstattuple;


40.6. 插件kbstattuple升级方法 

通过 ALTER EXTENSION升级插件。

示例,升级到 1.1

ALTER EXTENSION kbstattuple UPDATE TO '1.1';

41. kdb_database_link 

41.1. 插件Database Link简介 

Database Link简称DBLink,是数据库管理系统提供的用于访问外部数据库对象的机制。用户可以通过DBLink来访问外部数据库的表、视图对象。DBLink实现了两个数据库之间的通信。DBLink包含一个基于网络的数据连接以及用于登陆远程数据库的用户名、密码信息。本地数据库系统可以通过DBLink建立与远程数据库之间的会话,从而完成对远程数据库对象的访问。DBLink实现了SQL/MED标准中定义的对外部数据源进行访问的部分功能。

  • 插件名为 kdb_database_link

  • 插件版本 V1.0.0

注意

SQL/MED是SQL Management of External Data的缩写,是ISO/IEC 9075-9:2003标准中对SQL语言的扩展。SQL/MED标准规定了如何通过外部数据封装器(Foreign Data Wrapper)和数据连接(datalink)实现对外部数据的访问。这里的外部数据指的是可以被基于SQL的DBMS访问的数据。

dblink对象是一个数据库内部对象,可以通过dblink对象连接引用其他数据库的对象。支持连接Oracle、KingbaseES和Postgresql的dblink对象。

相关定义如下:

  • 本地数据库当前数据库客户端所连接到的数据库,可以直接访问和操作在此数据库内拥有相应权限的对象,客户端持有该连接。

  • 远程数据库通过定义于本地数据库内的dblink访问的数据库,虽然客户端看起来可以直接访问远程数据库的对象,实际上此类连接由本地数据库持有,对象定义等系统信息在本地数据库并不存在。远程数据库也可能只是本地数据库通过设置连接到了自己的另一个服务进程或者线程。

  • 远程连接通过dblink访问远程数据库对象时创建的数据库连接,对于目标数据库,本地数据库是它为之提供服务的客户端。本地数据库对自己创建和拥有的远程连接,需要进行合理的管理,在必要时应及时关闭,防止过多的资源开销。

  • 远程表(视图、物化视图)存在于远程数据库上的表,也可能是视图或者物化视图,本地数据库对此并不关心,只关心所取得的数据结构定义和数据本身。

  • 远程序列存在于远程数据库上的序列发生器,通常用于统一id的生成。

  • 远程函数(存储过程)存在于远程数据库上的函数或者存储过程,一般远程调用函数的场景居多。

  • 远程同义词存在于本地数据库指向远程对象(表、序列、函数等等)的同义词。

41.1.1. Database Link功能 

Dblink功能主要是为了满足常见语法的适配,让用户应用的代码能够适用于更宽泛的产品而无需在移植时大量修改

  • 支持连接管理,在适当的时候关闭连接减少远程数据库的资源开销。

  • 支持远程表(视图、物化视图)的查询,并且支持下推查询条件减少数据传输的网络开销。

  • 支持远程表的插入。

  • 支持远程序列的访问。

41.2. 插件kdb_database_link的加载方式 

KingbaseES数据库默认将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。

shared_preload_libraries = 'kdb_database_link'


在ksql中,运行

CREATE EXTENSION kdb_database_link;


41.3. 插件kdb_database_link的参数配置 

  • DriverName

连接驱动名称。

  • Host

远程数据库网络地址。

  • Port

远程数据库服务端口。

  • Dbname

远程数据库名称。

  • DbType

远程数据库类型。 DbType支持Oracle,KingbaseES,Postgres三种数据库类型。

41.4. 插件kdb_database_link的使用方法 

41.4.1. 创建Database Link对象 

在创建dblink对象时指定连接信息,包括远程数据库网络地址、端口、数据库名称、用户名和密码,具体需要提供哪些信息会因为不同数据库存在差异。

语法格式

CREATE [ PUBLIC ] DATABASE LINK dblink
       CONNECT TO user IDENTIFIED BY password USING
       {(connect_string) | config_tag };

参数说明

PUBLIC

指定PUBLIC创建公有dblink对象,所有用户都可以访问公有dblink对象。公有dblink是创建在PUBLIC模式下面的。未指定PUBLIC时创建私有dblink,不可在PUBLIC模式下创建私有dblink。

dblink

指定要创建的数据库链接的名称,同一个模式下的dblink不能重名。

user IDENTIFIED BY password

指定远端数据库的用户名和密码。

connect_string

配置连接串信息, connect_string 用来提供用于连接到远程数据库的信息。

config_tag

配置文件标签名,用于指明配置文件(sys_database_link.conf)中的一项,从而通过配置文件获取用于建立数据库连接的远程数据库的网络地址、端口以及数据库名称。

注解

1、在配置文件中的格式如下

[名称]

DriverName=连接驱动名称。

Host=远程数据库网络地址。

Port=远程数据库服务端口。

Dbname=远程数据库名称。

DbType=远程数据库类型。

DbType支持Oracle,KingbaseES,Postgres三种数据库类型。

2、使用该功能时,需将kdb_database_link加入shared_preload_libraries中。

3、查询外部数据库时,需创建对应的数据库插件,如:kingbase_fdw、oracle_fdw、postgres_fdw。

示例

创建一个到Oracle数据库的数据库连接,它可以被所有数据库用户使用

CREATE PUBLIC DATABASE LINK mylink CONNECT TO 'SYSTEM' IDENTIFIED BY 'password' USING 'ORADB';

创建一个到Oracle数据库的数据库连接,直接指定连接串信息

CREATE PUBLIC DATABASE LINK mylink CONNECT TO 'SYSTEM' IDENTIFIED BY 'password' USING (DriverName='Oracle ODBC Driver', Host='192.168.0.1', Port=1521, Dbname='TEST', dbType='Oracle');

41.4.2. 修改Database Link对象 

ALTER DATABASE LINK 修改一个dblink数据库对象。

第一种形式更改dblink的拥有者,要修改拥有者,你必须拥有该dblink并且也是新拥有角色的一个直接或间接成员。

第二种形式更改dblink的名称,只有dblink拥有者或者超级用户可以重命名一个dblink。

语法格式

ALTER [PUBLIC] DATABASE LINK dblink_name OWNER TO new_owner;
ALTER [PUBLIC] DATABASE LINK dblink_name RENAME TO new_name;

参数说明

dblink_name

一个现有dblink的名称(可以是模式限定的)。

new_owner

该dblink的新拥有者的用户名。

dblink_name

该dblink的新名称。

注解

ALTER DATABASE LINK 语法类似于ALTER VIEW。

示例

把 DATABASE LINK kdb_dblink_regress.link_d拥有者修改为 kdb_dblink_user:

ALTER DATABASE LINK kdb_dblink_regress.link_d OWNER TO kdb_dblink_user;

兼容性

ALTER DATABASE LINK 语句是一个KingbaseES扩展。

41.4.3. 删除Database Link对象 

DROP DATABASE LINK 移除一个dblink。要执行这个命令必须拥有该dblink的权限。

语法格式

DROP DATABASE LINK dblink_name;

参数说明

dblink_name

删除名为dblink_name的 DATABASE LINK

注解

DBLink可以被拥有者和DBA删除,删除DBLink对象之后,所有的用户会话中的对象都会被清除。

如果DBLink正在被其他用户使用,则无法删除此DBLink。

暂不支持PUBLIC关键字。

兼容性

该命令是KingbaseES的一个扩展,兼容Oracle。

41.4.4. Database Link的权限控制 

对于私有的DBLink,其创建者和DBA具有对此DBLink对象进行访问的权限。除DBLink创建者之外的其他数据库用户可以对以PUBLIC方式建立的DBLink进行访问。

本地用户对远程数据库对象的访问权限由远程数据库系统的用户认证机制来控制。通过DBLink连接到远程数据库的本地用户将得到远程数据库的用户拥有的查询权限。

41.4.5. DBLink相关的视图 

DBLink向用户提供的视图如下:

表 41.4.1 DBLink相关视图 

名称

说明

ALL_DBLINKS

描述当前用户可以访问的所有数据库连接

USER_DBLINKS

描述当前用户拥有的所有数据库连接

DBA_DBLINKS

描述DBA可以访问的所有数据库连接

41.4.6. DATABASE LINK DML 

DATABASE LINK — dblink 的DML操作

语法格式

  • INSERT

   [ WITH [ RECURSIVE ] with_query [, ...] ]
   INSERT INTO table_name@dblink [ AS alias ] [ ( column_name [, ...] ) ]
       [ OVERRIDING { SYSTEM | USER} VALUE ]
       { VALUES ( { expression } [, ...] ) [, ...] | query }
       [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ];

- UPDATE


   [ WITH [ RECURSIVE ] with_query [, ...] ]
   UPDATE table_name@dblink [ * ] [ [ AS ] alias ]
       SET { column_name = { expression } |
           ( column_name [, ...] ) = [ ROW ] ( { expression } [, ...] ) |
           ( column_name [, ...] ) = ( sub-SELECT )
           } [, ...]
       [ FROM from_list ]
       [ WHERE condition ]
       [ RETURNING * | output_expression [ [ AS ] output_name ]  [, ...] ];

- DELETE


[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM table_name@dblink [ * ] [ [ AS ] alias ]
    [ WHERE condition ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ];


描述

使用dblink对远程表进行插入,更新,删除。

参数

dblink

dblink的名称,使用 CREATE DATABASE LINK 创建的dblink数据库连接的名称。

with_query

WITH 子句允许你指定一个或者多个子查询,在 INSERT UPDATE DELETE 查询中可以用子查询的名字来引用它们 详见 WITH查询 和 SELECT 

table_name

一个已有表的名称(可以被模式限定)。

alias

目标表名的替补名称。当提供了一个别名时,它会完全隐藏掉表的实际名称。

column_name

名为 table_name 的表中的一个列 的名称,可以用表名(可以被模式名限定)做限定。如有必要,列名还可以用一个子域名(子域名需要和表名、模式名一同用小括号包围起来进行限定)或者数组下标限定。

expression

要赋予给相应列的表达式或者值。

output_expression

在每一行被插入或更新或删除后由 INSERT 或 UPUDATE 或 DELETE 命令计算并且返回的 表达式。该表达式可以使用 ``table_name`` 指定的表中的任何列。写成 可返回被插入或更新或删除行的所有列。

output_name

要用于被返回列的名称。

condition

一个能返回 boolean 值的表达式。只有让这个表达式返回 true 的行才将被更新,删除。

使用限制

  • INSERT

    远端表插入操作不支持ON CONFLICT子句

    不支持显示指定生成列的值

    对于RETURNING,不支持RETURNING ctid等系统列

    暂不支持列的默认值,对于有默认值的远程表,在进行insert的时候,如果显式使用例如insert into {tablename} default value或者insert into {tablename} values(default)会报错dblink not support insert with default value;如果insert into的时候,没有指定全部的列也会报上面的错误比如当表tab有两列a, b的时候,那么下面sql都会报错

    1. insert into tab @ dblink values(1)

    2. insert into tab@dblink(a) values(1)

    3. insert into tab @ dblink select a from tab

    4. insert into tab@dblink(a) select a from tab

  • UPDATE

    当远端表为继承表时,不支持仅更新父表数据,指定ONLY关键字时报错

    对于RETURNING,不支持RETURNING ctid等系统列

    目前update不支持列的默认值,在进行update的时候,如果显式的指定使用默认值,比如update {tablenaem} set {columname}=default,会报错dblink not support insert with default value

    目前不支持 WHERE CURRENT OF cursor_name 的用法

    目前update对于 分区表 和 继承表 的行为表现不确定,所以禁止使用dblink更新远程 分区表 或者 继承表 中的数据

  • DELETE

    当远端表为继承表时,不支持仅删除父表数据,指定ONLY关键字时报错

    对于RETURNING,不支持RETURNING ctid等系统列

    目前delete对于 分区表 和 继承表 的行为表现不确定,所以禁止使用dblink删除远程 分区表 或者 继承表 中的数据

ORACLE兼容

当dblink创建的数据库连接是连接到Oracle的时候,除了以上的使用限制外,目前dblink还不支持UPDATE和DELETE

41.4.7. DATABASE LINK MERGE 

DATABASE LINK — dblink 的MERGE操作

语法格式

MERGE INTO [ schema. ] { target_table@dblink } [ [ AS ] target_table_alias ]
    USING { [ schema. ] { source_table } [ [ AS ] source_table_alias ]
    ON ( condition_expression )
[ merge_update_clause ]
[ merge_insert_clause ];

merge_update_clause:
WHEN MATCHED THEN
UPDATE SET column = { expr }[, column = { expr } ]...
[ where_clause ]
[ delete_clause ]

delete_clause:
[DELETE where_clause]

merge_insert_clause:
WHEN NOT MATCHED THEN
INSERT [ ( column [, column ]...) ]
VALUES ({ expr }[, { expr } ]...)
[ where_clause ]

where_clause:
WHERE condition


描述

使用dblink对远程表进行MERGE操作。

参数

target_table

MERGE远程目标表的名称。

dblink

dblink的名称,使用 CREATE DATABASE LINK 创建的dblink数据库连接的名称。

source_table

MERGE源表的名称。源表可以是一个本地表,普通外表,也可以是一个dblink的远程表,即tablename@dblinkname。

target_table_alias

MERGE目标表的别名。

source_table_alias

MERGE源表的别名。

expr

要赋予给相应列的表达式或者值。

condition_expression

指定目标表与源表之间进行联接的联接条件。如果该条件为真,且指定了 WHEN MATCHED THEN UPDATE 子句,则对匹配到的目标表的该元组执行更新操作;否则,如果该条件为假且指定了 WHEN NOT MATCHED THEN INSERT 子句,则对目标表执行插入操作。

merge_update_clause

当目标表和源表的ON条件为真时,执行该子句,即更新目标表数据。该更新操作会触发目标表上面的触发器。更新的列不能是ON条件中被引用的列,更新时可以通过WHERE条件指明要更新的行,条件中既可以包含源表的列,也可以包含目标表的列,当指明WHERE条件且条件为假时,则不更新。

delete_clause

DELETE子句只删除目标表和源表的ON条件为真、并且是更新后的符合删除条件的记录,DELETE子句不影响INSERT项插入的行。删除条件作用在更新后的记录上,既可以和源表相关,也可以和目标表相关,或者都相关。如果ON条件为真,但是不符合更新条件,并没有更新数据,那么DELETE将不会删除任何数据。

merge_insert_clause

当目标表和源表的ON条件为假时,执行该语句。可指定插入条件,插入时的WHERE条件只能引用源表中的列。VALUES后面也只能引用源表中的列,不能包含目标表的列。

41.5. 插件kdb_database_link的卸载方法 

在ksql中运行:

drop extension kdb_database_link;

修改 kingbase.conf 文件中 shared_preload_libraries 参数,去掉kdb_database_link后重启数据库。

shared_preload_libraries = '';

41.6. 插件kdb_database_link的升级方法 

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

42. kdb_date_function 

42.1. 插件kdb_date_function简介 

kdb_date_function是一个兼容mysql数据库date相关函数的扩展。

  • 插件名为 kdb_date_function

  • 插件版本 V1.1

42.2. 插件kdb_date_function加载方式 

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

示例:

create extension kdb_date_function;

42.3. 插件kdb_date_function的参数配置 

无需配置任何参数。

42.4. 插件kdb_date_function的使用方法 

42.4.1. date_add 

date_add — 实现日期的相加

语法

date_add(ts timestamp, iv interval) 返回 timestamp。
date_add(tstz timestamptz, iv interval) 返回 timestamptz。

描述

date_add会实现timestamp或timestamptz与指定的interval进行相加的运算。

参数

iv:用于日期相加运算中的interval类型值。

ts:用于日期相加运算中的timestamp类型值。

tstz:用于日期相加运算中的timestamptz类型值。

返回值

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

示例

select date_add('2000-10-10'::timestamp,interval '1 year');
        date_add
---------------------
2001-10-10 00:00:00
(1 行记录)

select date_add('2010-10-10 12:00:00'::timestamp,interval '1 year 1 day 2 hour');
        date_add
---------------------
2011-10-11 14:00:00
(1 行记录)

42.4.2. dateadd 

dateadd — 实现日期的相加

语法

dateadd(i_unit text, i_value numeric, i_date time) 返回 time。
dateadd(i_unit text, i_value numeric, i_date timestamp) 返回 timestamp。
dateadd(i_unit text, i_value numeric, i_date timestamptz) 返回 timestamptz。

描述

实现timestamp或timestamptz或time类型与指定的格式进行相加的运算。

参数

i_unit:指定要相加的i_value的格式。

i_value:指定要相加的数量。

i_date:指定被相加的日期。

返回值

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

注解

i_unit的值可以为'second','minute','hour','day','week','month','year'等。

示例

select dateadd(year,9998,'0001-01-01 00:00:00'::timestamptz);
                dateadd
------------------------
9999-01-01 00:00:00+00
(1 行记录)

select dateadd(year,201,'1900-01-01 00:00:00'::timestamptz);
                dateadd
------------------------
2101-01-01 00:00:00+00
(1 行记录)

42.4.3. datediff 

比较两个日期之间的差距

语法

datediff(d1 date, d2 date) 返回integer。
datediff(t text, d1 date, d2 date) 返回int8。
datediff(t text, d1 time, d2 time) 返回int8。
datediff(t text, d1 timetz, d2 timetz) 返回int8。
datediff(t text, d1 timestamp, d2 timestamp) 返回int8。
datediff(t text, d1 timestamptz, d2 timestamptz) 返回int8。

描述

比较两个日期之间的指定的text(如果存在此**参数**)的格式的差距。

参数

t:指定的要返回的日期差距的格式。 d1,d2:进行比较的两个日期值。

返回值

返回text类型指定的格式的整数值。

注解

t的值可以使'second','minute','hour','day','week','month','year'等。

示例

select datediff('year','0001-01-01'::date,'9999-12-31'::date);
datediff
----------
        9998
(1 行记录)

select datediff('year','1900-01-01 00:00:00'::date,'2000-12-31 00:00:00'::date);
datediff
----------
        100
(1 行记录)

select datediff(month,'0001-01-01 00:00:00'::date,'9999-12-31 00:00:00'::date);
datediff
----------
119987
(1 行记录)

select datediff(month,'1900-01-01 00:00:00'::date,'2000-12-31 00:00:00'::date);
datediff
----------
        1211
(1 行记录)

select datediff('month','0001-01-01 00:00:00'::date,'9999-12-31 00:00:00'::date);
datediff
----------
119987
(1 行记录)

select datediff('month','1900-01-01 00:00:00'::date,'2000-12-31 00:00:00'::date);
datediff
----------
        1211
(1 行记录)

42.4.4. date_format 

得到指定日期的指定格式的值。

语法

date_format(d timestamp, t text) 返回 text。
date_format(d timestamptz, t text) 返回 text。

描述

返回日期类型值的text指定的格式。

参数

t:指定的要返回的日期的格式。

d:目标格式的值。

返回值

返回text指定的text类型的值。

注解

t的值可以是nls_date_format类型的所有值。

示例

select date_format('2000-10-10 12:00:00','mm-yyyy-dd hh24:mi:ss');
        date_format
---------------------
10-2000-10 12:00:00
(1 行记录)

42.5. 插件kdb_date_function卸载方法 

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

示例:

drop extension kdb_date_function;

42.6. 插件kdb_date_function升级方法 

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

43. kdb_exists_expand 

43.1. 插件kdb_exists_expand简介 

kdb_exists_expand插件用于优化EXISTS子链接,生成执行效率更高的执行计划。

对于在查询条件中存在EXISTS子连接的SQL语句,如果满足:

  1. EXISTS子链接为SELECT类型的查询语句

  2. EXISTS子链接中为OR条件

如下:

SELECT * from t1 WHERE EXISTS (SELECT 1 from t2 cond1 OR cond2);


其中的cond1的查询条件和子链接中查询的表t2有关,cond2的查询条件和子链接中查询的表t2无关,如:

SELECT * from t1 WHERE EXISTS (SELECT 1 from t2 WHERE t2.id =1 OR t1.name = null);


  • 其中cond1 为 t2.id =1,与子链接中的表t2相关

  • 其中cond2 为 t1.name = null,与子链接中的表t2不相关

那么该插件将EXISTS子链接的不相关条件做提升优化,可以提高SQL查询的执行效率。

43.2. 插件kdb_exists_expand加载方式 

KingbaseES数据库默认将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。

示例:

shared_preload_libraries = 'kdb_exists_expand'


43.3. 插件kdb_exists_expand的参数配置 

kdb_exists_expand.enable

Exists子链接优化开关,boolean类型数据,默认为开启状态。

43.4. 插件kdb_exists_expand的使用方法 

KingbaseES加载 kdb_exists_expand 插件后,碰到满足简介中条件的SQL语句时,将EXISTS子链接的不相关条件做提升优化。

示例:

启动该功能后,本来应该是一个Semi join的执行计划,被改成了两个并列的子计划InitPlan 1和InitPlan 2去执行:

create extension kdb_exists_expand;

load 'kdb_exists_expand';

set kdb_exists_expand.enable to on;

create table t1(id int, name text);

create table t2(id int, name text);

explain (costs off) SELECT * from t1 WHERE EXISTS (SELECT 1 from t2 WHERE t2.id =1 OR t1.name = null);

QUERY PLAN
----------------------------------
Result
  One-Time Filter: ($0 OR $1)
  InitPlan 1 (returns $0)
    ->  Seq Scan on t2
          Filter: (id = 1)
  InitPlan 2 (returns $1)
    ->  Result
          One-Time Filter: false
  ->  Seq Scan on t1


43.5. 插件kdb_exists_expand卸载方法 

修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库。

示例:

shared_preload_libraries = ''


43.6. 插件kdb_exists_expand升级方法 

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


最后修改时间:2022-08-29 17:51:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论