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的使用方法 ¶
|
名称 |
类型 |
描述 |
|---|---|---|
|
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并且逐行读取来收集锁信息,对于大表可能很慢。
注意
-
如果表被加了排他锁,kbrowlocks将被阻塞。
-
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
返回给定关系的物理长度、“死亡”元组百分比等信息。这些信息可以帮助用户决定是否要对关系做清理。
|
名称 |
类型 |
描述 |
|
|---|---|---|---|
|
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树索引的相关信息。
|
名称 |
类型 |
描述 |
|---|---|---|
|
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索引的相关信息。
|
名称 |
类型 |
描述 |
|---|---|---|
|
version |
integer |
GIN索引页面类型版本号 |
|
pending_pages |
integer |
pending列表中的页面数 |
|
pending_tuples |
bigint |
pending列表中的元组数 |
pgstathashindex(regclass) returns record
返回HASH索引的相关信息。
|
名称 |
类型 |
描述 |
|---|---|---|
|
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 LINKkdb_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对远程表进行插入,更新,删除。
参数
dblinkdblink的名称,使用
CREATE DATABASE LINK创建的dblink数据库连接的名称。
with_query
WITH子句允许你指定一个或者多个子查询,在INSERTUPDATEDELETE查询中可以用子查询的名字来引用它们 详见 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都会报错
insert into tab @ dblink values(1)
insert into tab@dblink(a) values(1)
insert into tab @ dblink select a from tab
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_tableMERGE远程目标表的名称。
dblinkdblink的名称,使用
CREATE DATABASE LINK创建的dblink数据库连接的名称。
source_tableMERGE源表的名称。源表可以是一个本地表,普通外表,也可以是一个dblink的远程表,即tablename@dblinkname。
target_table_aliasMERGE目标表的别名。
source_table_aliasMERGE源表的别名。
expr要赋予给相应列的表达式或者值。
condition_expression指定目标表与源表之间进行联接的联接条件。如果该条件为真,且指定了 WHEN MATCHED THEN UPDATE 子句,则对匹配到的目标表的该元组执行更新操作;否则,如果该条件为假且指定了 WHEN NOT MATCHED THEN INSERT 子句,则对目标表执行插入操作。
merge_update_clause当目标表和源表的ON条件为真时,执行该子句,即更新目标表数据。该更新操作会触发目标表上面的触发器。更新的列不能是ON条件中被引用的列,更新时可以通过WHERE条件指明要更新的行,条件中既可以包含源表的列,也可以包含目标表的列,当指明WHERE条件且条件为假时,则不更新。
delete_clauseDELETE子句只删除目标表和源表的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语句,如果满足:
-
EXISTS子链接为SELECT类型的查询语句
-
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安装包一并升级。通常情况下用户无须单独升级些插件。




