金仓数据库KingbaseES 插件kdb_exists_expand

1. 插件介绍

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

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

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

  2. EXISTS子链接中为OR条件,如:

  • SELECT * from a WHERE EXISTS (SELECT 1 from e cond1 OR cond2);

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

SELECT * from a WHERE EXISTS (SELECT 1 from e WHERE e.id =1 OR a.name = null);
  • 其中cond1 为 e.id =1,与子链接中的表e相关

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

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

2. 加载插件

在使用 kdb_exists_expand 之前,需要将它添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启数据库。

shared_preload_libraries = 'kdb_exists_expand' # (change requires restart)

3. 参数配置

kdb_exists_expand.enable

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

4. 示例

启动该功能后,本来应该是一个Semi join的执行计划,被改成了两个并列的子计划SubPlan 2和SubPlan 3去执行了,而SubPlan3就是提升上来的一个Exists子链接。

# explain (costs false) select p.parameter_value from sheet_parameter p join dep_b001 e on
exists (
    select 1 from dep_b001 e
    where e.dep_id in ('b8703c00fb4973aaa1723f95475dfa')
      and p.parameter_value like e.tree_level_code || '%'
      or p.parameter_value is null);

QUERY PLAN
-----------------------------------------------------------------------
 Limit
   ->  Result
         ->  Sort
               Sort Key: b.sheet_no, d.ordinal
               ->  Hash Left Join
                     Hash Cond: (c.sheet_id = p.sheet_id)
                     Filter: ((SubPlan 2) OR (SubPlan 3))
                     ->  Nested Loop Left Join
                           Join Filter: (d.design_id = b.id)
                           ->  Nested Loop
                                 Join Filter: (d.id = c.sheet_id)
                                 ->  Seq Scan on sheet d
                                 ->  Materialize
                                       ->  Seq Scan on sheet_sheet_category c
                                             Filter: (category_id = '\x7a3ca091e24459a4f8c23eb10197f7'::bytea)
                           ->  Seq Scan on sheet_design b
                     ->  Hash
                           ->  Seq Scan on sheet_parameter p
                     SubPlan 2
                       ->  Seq Scan on dep_b001 e
                             Filter: (((dep_id)::text = 'b8703c00fb4973aaa1723f95475dfa'::text) AND ((p.parameter_value)::text ~~ ((tree_level_code)::text || '%'::text)))
                     SubPlan 3
                       ->  Result
                             One-Time Filter: (p.parameter_value IS NULL)
                             ->  Seq Scan on dep_b001 e_1
         SubPlan 1
           ->  Aggregate
                 ->  Seq Scan on sheet_data a
                       Filter: ((sheet_id = d.id) AND (status = '0'::numeric))
(29 rows)

5. 卸载插件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值