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查询的执行效率。
2. 插件kdb_exists_expand加载方式
KingbaseES数据库默认将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。
示例:
shared_preload_libraries = 'kdb_exists_expand'
3. 插件kdb_exists_expand的参数配置?
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 = ''
6. 插件kdb_exists_expand升级方法?
kdb_exists_expand扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级些插件。