• 金仓数据库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 = ''
  • 相关阅读:
    基于PHP+MySQL医药信息查询系统的设计与开发
    想要精通算法和SQL的成长之路 - 判断子序列问题
    让程序员崩溃的微信群消息置顶
    基于开放共享的自主研发—MaxCompute 持续增强生态与开放性建设
    2311rust,到50版本更新
    抖音seo矩阵系统开源代码定制部署
    Linux(3):Linux 的文件权限与目录配置
    后端技术盲区大清理:事务还没弄明白的小伙伴赶紧来看一看
    小白量化《穿云箭集群量化》(2)量化策略编写(1)
    Qt应用开发(基础篇)——菜单 QMenu
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/125558373