您当前的位置:首页 >> 家居百科

数据库驱动程序分析 - SQL by pass & 经典执行器

2024-02-02 12:18:06

isTopLevel= true, isQueryCompleted= 0x0) at opfusion.cpp: 491 # 30x000000000193a910in 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解释器,例如:

SELECTc3 FROMt1 WHEREc1 = ? andc2 = 10;

仅可以检索目标备注的列于,c1和c2列于为目录列于,上去可以是也就是说或者给定,可以使用 for update。

只全力支持比较简单INSERT解释器,例如: INSERTINTOt1 VALUES(?, 10,?);

仅全力支持一个VALUES,VALUES里的多种类型可以是也就是说和给定,不全力支持returning。

只全力支持比较简单DELETE解释器,例如: DELETEFROMt1 WHEREc1 = ? andc2 = 10;

c1和c2列于为目录列于,上去可以是也就是说或者给定。

只全力支持比较简单UPDATE解释器,例如: UPDATEt1 SETc3 = c3+? WHEREc1 = ? andc2 = 10;

c3列于改动的值可以是也就是说和给定,也可以是一个比较简单的操作符,c1和c2列于为目录列于,上去可以是也就是说或者给定。

02

开端的执行者器

停止enable_opfusion,比较简单insert的执行者计划案是这样的:

在这种执行者工序中Portal是执行者SQL解释器的载形体,每一条SQL完全一致唯一的Portal,完全相同的检索多种类型完全一致的Portal多种类型也有区别。

typedefenumPortalStrategy { PORTAL_ONE_SELECT, // SQL解释器值得注意单一的SELECT检索 PORTAL_ONE_RETURNING, // INSERT/UPDATE/DELETE解释器值得注意Returning PORTAL_ONE_MOD_WITH, // 检索解释器值得注意With PORTAL_UTIL_SELECT, // 工具多种类型检索解释器,如explain PORTAL_MULTI_QUERY // 所有其他多种类型检索解释器 } PortalStrategy;

Portal的生命周期行政在exec_simple_query备注达式中意味着,该备注达式都由Portal创建、执行者和弃置。Portal执行者的主要执行者工序之外PortalStart备注达式、PortalRun备注达式、PortalDrop备注达式几个部份。其中PortalStart备注达式都由进行Portal结构形体模板工作,之外执行者算子模板、寄存器词法分配等;PortalRun备注达式都由毫无疑问的执行者和运算,它是执行者器的核心;PortalDrop备注达式都由之前的弃置工作,主要是数组、内存的弃置。

PortalRun备注达式根据检索多种类型转至完全相同的处理备注达式:

boolPortalRun( Portal portal, longcount, boolisTopLevel, DestReceiver* dest, DestReceiver* altdest, char* completionTag ) { … switch(portal->strategy) { casePORTAL_ONE_SELECT: … casePORTAL_MULTI_QUERY: // insert从这里转至 PortalRunMulti(portal, isTopLevel, dest, altdest, completionTag); /* Prevent portal's commands from being re-executed */ MarkPortalDone(portal); /* Always complete at end of RunMulti */ result = true; break; … }

最终执行者ExecInsertT顺利进行样本插入。

# 0ExecInsertT< false> (state= 0x7fdbf1836060, slot= 0x7fdbf0c86460, planSlot= 0x7fdbf0c86460, estate= 0x7fdbf0c74060, canSetTag= true, options= 0, partitionList= 0x7fdbf3125860) at nodeModifyTable.cpp: 800 # 10x0000000001a684cdin ExecModifyTable (node= 0x7fdbf1836060) at nodeModifyTable.cpp: 3043 # 20x00000000019f3f93 in ExecModifyTableWrap (node= 0x7fdbf1836060) at execProcnode.cpp: 785 # 30x00000000019f43b5 in ExecProcNode (node= 0x7fdbf1836060) at execProcnode.cpp: 1038 # 40x00000000019ed9d5 in ExecutePlan (estate= 0x7fdbf0c74060, planstate= 0x7fdbf1836060, operation=CMD_INSERT, sendTuples= false, numberTuples= 0, direction=ForwardScanDirection, dest= 0x7fdbf13bb9c8, motJitContext= 0x0) at execMain.cpp: 2163 # 50x00000000019ea25ain standard_ExecutorRun (queryDesc= 0x7fdbf1558060, direction=ForwardScanDirection, count= 0) at execMain.cpp: 608 # 60x000000000181d6efin explain_ExecutorRun (queryDesc= 0x7fdbf1558060, direction=ForwardScanDirection, count= 0) at auto_explain.cpp: 121 # 70x00000000019e9dee in ExecutorRun (queryDesc= 0x7fdbf1558060, direction=ForwardScanDirection, count= 0) at execMain.cpp: 486 # 80x000000000194fed6 in ProcessQuery (plan= 0x7fdbf0b7b2e0, sourceText= 0x7fdbf13ba060 "insert into t1 values(1,200);", params= 0x0, isMOTTable= false, motJitContext= 0x0, dest= 0x7fdbf13bb9c8, completionTag= 0x7fdbf3126020 "") at pquery.cpp: 292 # 90x0000000001953fa1 in PortalRunMulti (portal= 0x7fdbf0c7a060, isTopLevel= true, dest= 0x7fdbf13bb9c8, altdest= 0x7fdbf13bb9c8, completionTag= 0x7fdbf3126020 "") at pquery.cpp: 1889 # 100x00000000019525e0in PortalRun (portal= 0x7fdbf0c7a060, count= 9223372036854775807, isTopLevel= true, dest= 0x7fdbf13bb9c8, altdest= 0x7fdbf13bb9c8, completionTag= 0x7fdbf3126020 "") at pquery.cpp: 1191 # 110x000000000193ac65in exec_simple_query (query_string= 0x7fdbf13ba060 "insert into t1 values(1,200);", messageType=QUERY_MESSAGE, msg= 0x7fdbf3126210) at postgres.cpp: 2720

以上分析了比较简单insert解释器的两种执行者工序,对于delete,update,select基本工作工序一致。

END

这里有最新开源资讯、操作系统更新、技术零售商店等素材

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦~

十二指肠溃疡引起腹泻吃什么药好
深圳苹果手机售后维修
上火了喉咙痛吃什么药
长沙试管婴儿多少钱一次
流感嗓子疼怎么简单有效的治疗
相关阅读
友情链接