• 金仓数据库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 = ''
  • 相关阅读:
    深度学习故障诊断之-使用条件生成对抗网络CGAN生成泵流量信号
    记录获取蓝鲸智云token的过程
    问答雕虫1
    从零实现ORM框架GeoORM-记录新增和查询-03
    智能合约--如何实现可升级的智能合约
    基于PID算法下STM32控制的坡道行驶电动小车(含源码)
    C#反射实现插件式开发
    通过token认证的方式来加速OKE集群的访问
    Linux驱动开发(同步与互斥)
    了解 Oracle 中的视图
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/125558373