【openGauss数据库内核分析系列】:SQL by pass & 经典执行器_opengauss内核

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

SQL by pass

enable_opfusion用于控制是否对简单增删改查进行优化,简单insert语句在开启enable_opfusion时的执行计划如下

由于开启SQL BY PASS,从exec_simple_query过来的语句,会判断可以走SQL BY PASS,否则进入CreatePortal走经典执行流程。

static void exec_simple_query(const char* query_string, MessageType messageType, StringInfo msg = NULL)

{

    …

        /* SQL bypass */

        if (runOpfusionCheck) { // 进入SQL by pass

            (void)MemoryContextSwitchTo(oldcontext);

            void* opFusionObj = OpFusion::FusionFactory(

                OpFusion::getFusionType(NULL, NULL, plantree_list), oldcontext, NULL, plantree_list, NULL);

            if (opFusionObj != NULL) {

                ((OpFusion*)opFusionObj)->setCurrentOpFusionObj((OpFusion*)opFusionObj);

                if (OpFusion::process(FUSION_EXECUTE, NULL, completionTag, isTopLevel, NULL)) {

                    CommandCounterIncrement();

                    finish_xact_command();

                    EndCommand(completionTag, dest);

                    MemoryContextReset(OptimizerContext);

                    break;

                }

                Assert(0);

            }

            (void)MemoryContextSwitchTo(t_thrd.mem_cxt.msg_mem_cxt);

        }

        /*

         * Create unnamed portal to run the query or queries in. If there

         * already is one, silently drop it.

         */

        portal = CreatePortal("", true, true); // 经典执行流程

    …

}

进入InsertFusion::execute完成数据插入操作。

#0  InsertFusion::execute (this=0x7fd93a4104f8, max_rows=9223372036854775807, completionTag=0x7fd933e67020 “@p\346\063\331\177”)     at opfusion_insert.cpp:297 #1  0x0000000001ac00d9 in OpFusion::fusionExecute (this=0x7fd93a4104f8, msg=0x0, completionTag=0x7fd933e67020 “@p\346\063\331\177”,     isTopLevel=true, isQueryCompleted=0x0) at opfusion.cpp:453 #2  0x0000000001ac0389 in OpFusion::process (op=0, msg=0x0, completionTag=0x7fd933e67020 “@p\346\063\331\177”, isTopLevel=true,     isQueryCompleted=0x0) at opfusion.cpp:491 #3  0x000000000193a910 in exec_simple_query (query_string=0x7fd966ad2060 “insert into t1 values(1,200);”,     messageType=QUERY_MESSAGE, msg=0x7fd933e67210) at postgres.cpp:2624

SQL by pass适应的场景有:

  • 只支持indexscan和indexonlyscan,且全部WHERE语句的过滤条件都在索引上。
  • 只支持单表增删改查,不支持join、using。
  • 只支持行存表,不支持分区表,表不支持有触发器。
  • 不支持active sql、QPS等信息统计特性。
  • 不支持正在扩容和缩容的表。
  • 不支持查询或者修改系统列。
  • 只支持简单SELECT语句,例如

SELECT c3 FROM t1 WHERE c1 = ? and c2 =10;

仅可以查询目标表的列,c1和c2列为索引列,后边可以是常量或者参数,可以使用 for update。

  • 只支持简单INSERT语句,例如:

INSERT INTO t1 VALUES (?,10,?);

仅支持一个VALUES,VALUES里面的类型可以是常量和参数,不支持returning。

  • 只支持简单DELETE语句,例如:

DELETE FROM t1 WHERE c1 = ? and c2 = 10;

c1和c2列为索引列,后边可以是常量或者参数。

  • 只支持简单UPDATE语句,例如

UPDATE t1 SET c3 = c3+? WHERE c1 = ? and c2 = 10;

c3列修改的值可以是常量和参数,也可以是一个简单的表达式,c1和c2列为索引列,后边可以是常量或者参数。

经典的执行器

关闭enable_opfusion,简单insert的执行计划是这样的

在这种执行流程中Portal是执行SQL语句的载体,每一条SQL对应唯一的Portal,不同的查询类型对应的Portal类型也有区别。

typedef enum PortalStrategy {

    PORTAL_ONE_SELECT, // SQL语句包含单一的SELECT查询

    PORTAL_ONE_RETURNING, // INSERT/UPDATE/DELETE语句包含Returning


![img](https://img-blog.csdnimg.cn/img_convert/27fd333d4f38d7a62aa1f71713572dbc.png)
![img](https://img-blog.csdnimg.cn/img_convert/5ce92eaefb38a86721c7b46445593bed.png)
![img](https://img-blog.csdnimg.cn/img_convert/35f7f2ecc4c5eaca277ce934e087012d.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值