Kingbase kdb_exists_expand 扩展插件使用

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查询的执行效率。

2. 插件kdb_exists_expand加载方式

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

示例:

shared_preload_libraries = 'kdb_exists_expand'

3. 插件kdb_exists_expand的参数配置?

kdb_exists_expand.enable

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

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

5. 插件kdb_exists_expand卸载方法?

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

示例:

shared_preload_libraries = ''

6. 插件kdb_exists_expand升级方法?

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