欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

openGauss的SQL by pass框架

我快閉嘴 ? 來(lái)源:Gauss松鼠會(huì) ? 作者:酷哥 ? 2022-09-07 09:44 ? 次閱讀

執(zhí)行引擎一般負(fù)責(zé)查詢的執(zhí)行,執(zhí)行引擎在SQL執(zhí)行棧中起到接收優(yōu)化器生成的執(zhí)行計(jì)劃Plan、并對(duì)通過(guò)存儲(chǔ)引擎提供的數(shù)據(jù)讀寫接口,實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行計(jì)算得到查詢的結(jié)果集。

015eb08c-2dec-11ed-ba43-dac502259ad0.png在典型的OLTP場(chǎng)景中,簡(jiǎn)單查詢占了很大一部分比例。這種查詢的特征是只涉及單表和簡(jiǎn)單表達(dá)式的查詢,因此為了加速這類查詢,openGauss提出了SQL by pass框架,在parse層對(duì)這類查詢做簡(jiǎn)單的模式判別后,進(jìn)入到特殊的執(zhí)行路徑里,跳過(guò)經(jīng)典的執(zhí)行器執(zhí)行框架,包括算子的初始化與執(zhí)行、表達(dá)式與投影等經(jīng)典框架,直接重寫一套簡(jiǎn)潔的執(zhí)行路徑,并且直接調(diào)用存儲(chǔ)接口,這樣可以大大加速簡(jiǎn)單查詢的執(zhí)行速度。

01

SQL by pass

enable_opfusion用于控制是否對(duì)簡(jiǎn)單增刪改查進(jìn)行優(yōu)化,簡(jiǎn)單insert語(yǔ)句在開啟enable_opfusion時(shí)的執(zhí)行計(jì)劃如下:017bcfd2-2dec-11ed-ba43-dac502259ad0.png

由于開啟SQL BY PASS,從exec_simple_query過(guò)來(lái)的語(yǔ)句,會(huì)判斷可以走SQL BY PASS,否則進(jìn)入CreatePortal走經(jīng)典執(zhí)行流程。

static void exec_simple_query(const char* query_string, MessageType messageType, StringInfo msg = NULL){        /* SQL bypass */        if (runOpfusionCheck) { // 進(jìn)入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); // 經(jīng)典執(zhí)行流程

進(jìn)入InsertFusion::execute完成數(shù)據(jù)插入操作。

#0  InsertFusion::execute (this=0x7fd93a4104f8, max_rows=9223372036854775807, completionTag=0x7fd933e67020 "@p34663331177")    at opfusion_insert.cpp:297#1  0x0000000001ac00d9 in OpFusion::fusionExecute (this=0x7fd93a4104f8, msg=0x0, completionTag=0x7fd933e67020 "@p34663331177",    isTopLevel=true, isQueryCompleted=0x0) at opfusion.cpp:453#2  0x0000000001ac0389 in OpFusion::process (op=0, msg=0x0, completionTag=0x7fd933e67020 "@p34663331177", 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適應(yīng)的場(chǎng)景有:

  • 只支持indexscan和indexonlyscan,且全部WHERE語(yǔ)句的過(guò)濾條件都在索引上。

  • 只支持單表增刪改查,不支持join、using。

  • 只支持行存表,不支持分區(qū)表,表不支持有觸發(fā)器。

  • 不支持active sql、QPS等信息統(tǒng)計(jì)特性。

  • 不支持正在擴(kuò)容和縮容的表。

  • 不支持查詢或者修改系統(tǒng)列。

  • 只支持簡(jiǎn)單SELECT語(yǔ)句,例如:

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

僅可以查詢目標(biāo)表的列,c1和c2列為索引列,后邊可以是常量或者參數(shù),可以使用 for update。

  • 只支持簡(jiǎn)單INSERT語(yǔ)句,例如:

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

僅支持一個(gè)VALUES,VALUES里面的類型可以是常量和參數(shù),不支持returning。

  • 只支持簡(jiǎn)單DELETE語(yǔ)句,例如:

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

c1和c2列為索引列,后邊可以是常量或者參數(shù)。

  • 只支持簡(jiǎn)單UPDATE語(yǔ)句,例如:

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

c3列修改的值可以是常量和參數(shù),也可以是一個(gè)簡(jiǎn)單的表達(dá)式,c1c2列為索引列,后邊可以是常量或者參數(shù)。

02

經(jīng)典的執(zhí)行器

關(guān)閉enable_opfusion,簡(jiǎn)單insert的執(zhí)行計(jì)劃是這樣的:

01a51a18-2dec-11ed-ba43-dac502259ad0.png

在這種執(zhí)行流程中Portal是執(zhí)行SQL語(yǔ)句的載體,每一條SQL對(duì)應(yīng)唯一的Portal,不同的查詢類型對(duì)應(yīng)的Portal類型也有區(qū)別。

typedef enum PortalStrategy {    PORTAL_ONE_SELECT, // SQL語(yǔ)句包含單一的SELECT查詢    PORTAL_ONE_RETURNING, // INSERT/UPDATE/DELETE語(yǔ)句包含Returning    PORTAL_ONE_MOD_WITH, // 查詢語(yǔ)句包含With    PORTAL_UTIL_SELECT, // 工具類型查詢語(yǔ)句,如explain    PORTAL_MULTI_QUERY // 所有其他類型查詢語(yǔ)句} PortalStrategy;
Portal的生命周期管理在exec_simple_query函數(shù)中實(shí)現(xiàn),該函數(shù)負(fù)責(zé)Portal創(chuàng)建、執(zhí)行和清理。Portal執(zhí)行的主要執(zhí)行流程包括PortalStart函數(shù)、PortalRun函數(shù)、PortalDrop函數(shù)幾個(gè)部分。其中PortalStart函數(shù)負(fù)責(zé)進(jìn)行Portal結(jié)構(gòu)體初始化工作,包括執(zhí)行算子初始化、內(nèi)存上下文分配等;PortalRun函數(shù)負(fù)責(zé)真正的執(zhí)行和運(yùn)算,它是執(zhí)行器的核心;PortalDrop函數(shù)負(fù)責(zé)最后的清理工作,主要是數(shù)據(jù)結(jié)構(gòu)、緩存的清理。01d7839a-2dec-11ed-ba43-dac502259ad0.png

PortalRun函數(shù)根據(jù)查詢類型進(jìn)入不同的處理函數(shù):

bool PortalRun(    Portal portal, long count, bool isTopLevel, DestReceiver* dest, DestReceiver* altdest, char* completionTag){            switch (portal->strategy) {            case PORTAL_ONE_SELECT:            case PORTAL_MULTI_QUERY: // insert從這里進(jìn)入                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;}

最終執(zhí)行ExecInsertT完成數(shù)據(jù)插入。

#0  ExecInsertT<false> (state=0x7fdbf1836060, slot=0x7fdbf0c86460, planSlot=0x7fdbf0c86460, estate=0x7fdbf0c74060, canSetTag=true,    options=0, partitionList=0x7fdbf3125860) at nodeModifyTable.cpp:800#1  0x0000000001a684cd in ExecModifyTable (node=0x7fdbf1836060) at nodeModifyTable.cpp:3043#2  0x00000000019f3f93 in ExecModifyTableWrap (node=0x7fdbf1836060) at execProcnode.cpp:785#3  0x00000000019f43b5 in ExecProcNode (node=0x7fdbf1836060) at execProcnode.cpp:1038#4  0x00000000019ed9d5 in ExecutePlan (estate=0x7fdbf0c74060, planstate=0x7fdbf1836060, operation=CMD_INSERT, sendTuples=false,    numberTuples=0, direction=ForwardScanDirection, dest=0x7fdbf13bb9c8, motJitContext=0x0) at execMain.cpp:2163#5  0x00000000019ea25a in standard_ExecutorRun (queryDesc=0x7fdbf1558060, direction=ForwardScanDirection, count=0)    at execMain.cpp:608#6  0x000000000181d6ef in explain_ExecutorRun (queryDesc=0x7fdbf1558060, direction=ForwardScanDirection, count=0)    at auto_explain.cpp:121#7  0x00000000019e9dee in ExecutorRun (queryDesc=0x7fdbf1558060, direction=ForwardScanDirection, count=0) at execMain.cpp:486#8  0x000000000194fed6 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#9  0x0000000001953fa1 in PortalRunMulti (portal=0x7fdbf0c7a060, isTopLevel=true, dest=0x7fdbf13bb9c8, altdest=0x7fdbf13bb9c8,    completionTag=0x7fdbf3126020 "") at pquery.cpp:1889#10 0x00000000019525e0 in PortalRun (portal=0x7fdbf0c7a060, count=9223372036854775807, isTopLevel=true, dest=0x7fdbf13bb9c8,    altdest=0x7fdbf13bb9c8, completionTag=0x7fdbf3126020 "") at pquery.cpp:1191#11 0x000000000193ac65 in exec_simple_query (query_string=0x7fdbf13ba060 "insert into t1 values(1,200);",    messageType=QUERY_MESSAGE, msg=0x7fdbf3126210) at postgres.cpp:2720
以上分析了簡(jiǎn)單insert語(yǔ)句的兩種執(zhí)行流程,對(duì)于delete,update,select基本工作流程一致。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    775

    瀏覽量

    44262
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3851

    瀏覽量

    64710
  • 執(zhí)行器
    +關(guān)注

    關(guān)注

    5

    文章

    378

    瀏覽量

    19430

原文標(biāo)題:數(shù)據(jù)庫(kù)內(nèi)核分析 - SQL by pass & 經(jīng)典執(zhí)行器

文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MOSFET Pass Element Yields 100

    In terms of low RON, the best pass transistor for a low-dropout, positive-voltage regulator
    發(fā)表于 04-30 09:19 ?916次閱讀
    MOSFET <b class='flag-5'>Pass</b> Element Yields 100

    華為正式宣布開源數(shù)據(jù)庫(kù)能力,開放openGauss數(shù)據(jù)庫(kù)源代碼

    openGauss 是一款開源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),采用木蘭寬松許可證 v2 發(fā)行。openGauss 內(nèi)核源自 PostgreSQL,深度融合華為在數(shù)據(jù)庫(kù)領(lǐng)域多年的經(jīng)驗(yàn),結(jié)合企業(yè)級(jí)場(chǎng)景需求,持續(xù)構(gòu)建競(jìng)爭(zhēng)力特性。同時(shí) openGauss
    的頭像 發(fā)表于 07-25 11:11 ?4755次閱讀

    SQL后悔藥,SQL性能優(yōu)化和SQL規(guī)范優(yōu)雅

    每一個(gè)好習(xí)慣都是一筆財(cái)富,本文基于MySQL,分SQL后悔藥, SQL性能優(yōu)化,SQL規(guī)范優(yōu)雅三個(gè)方向,分享寫SQL的21個(gè)好習(xí)慣,謝謝閱讀,加油哈~ 1. 寫完
    的頭像 發(fā)表于 11-14 09:54 ?1894次閱讀

    專業(yè)數(shù)據(jù)庫(kù)廠商快立方正式加入openGauss社區(qū)

    北京快立方科技有限公司(以下簡(jiǎn)稱快立方)簽署CLA(Contribution License Agreement, 貢獻(xiàn)許可協(xié)議),正式加入openGauss社區(qū)。 ? ? 快立方此次攜手
    的頭像 發(fā)表于 04-19 11:23 ?2003次閱讀

    中軟國(guó)際簽署CLA,加入到openGauss社區(qū)

    openGauss Housekeeper不僅為openGauss集群實(shí)現(xiàn)自動(dòng)化的高可用主備管理,而且還通過(guò)實(shí)現(xiàn)浮動(dòng)IP,為openGauss集群對(duì)外呈現(xiàn)統(tǒng)一的浮動(dòng)IP服務(wù),用戶只需要通過(guò)統(tǒng)一的浮動(dòng)IP訪問(wèn)數(shù)據(jù)庫(kù),而無(wú)需了解集群
    的頭像 發(fā)表于 06-30 11:41 ?2084次閱讀
    中軟國(guó)際簽署CLA,加入到<b class='flag-5'>openGauss</b>社區(qū)

    openGauss開源社區(qū)打造全球領(lǐng)先的開源數(shù)據(jù)庫(kù)技術(shù)生態(tài)

    openGauss Developer Day(openGauss開發(fā)者大會(huì))2022在北京順利召開。這是openGauss開源社區(qū)發(fā)起并主辦的面向數(shù)據(jù)庫(kù)開發(fā)者的年度活動(dòng)。
    的頭像 發(fā)表于 07-21 11:03 ?1425次閱讀

    openGauss 3.1.0版本正式上線!七個(gè)方面全面增強(qiáng)

    openGauss 3.1.0 版本是openGauss 2022年發(fā)布的Preview版本,版本維護(hù)生命周期為0.5年。此次發(fā)布包含兩個(gè)數(shù)據(jù)庫(kù)服務(wù)端安裝包:企業(yè)版和輕量版。
    的頭像 發(fā)表于 10-09 10:04 ?1265次閱讀

    Mybatis的SQL注入審計(jì)的基本方法

    SQL注入漏洞作為WEB安全的最常見(jiàn)的漏洞之一,在java中隨著預(yù)編譯與各種ORM框架的使用,注入問(wèn)題也越來(lái)越少。新手代碼審計(jì)者往往對(duì)Java Web應(yīng)用的多個(gè)框架組合而心生畏懼,不知如何下手,希望通過(guò)Mybatis
    的頭像 發(fā)表于 10-17 11:16 ?1358次閱讀

    使用Dockerfile制作openGauss鏡像

    獲取openGauss企業(yè)版3.0.0的安裝包和源碼文件。這里我用的是CentOS,選擇的是企業(yè)版。對(duì)于只是想體驗(yàn)一下的同學(xué)來(lái)說(shuō)選擇輕量版就足夠了,步驟和主要功能是一樣的,優(yōu)點(diǎn)是包更小,占用存儲(chǔ)空間更少,缺點(diǎn)是裁掉了一些功能,具體差別見(jiàn)官方文檔。
    的頭像 發(fā)表于 12-07 15:08 ?933次閱讀

    9SQL4952-9SQL4954-9SQL4958 系列數(shù)據(jù)表

    9SQL4952-9SQL4954-9SQL4958 系列數(shù)據(jù)表
    發(fā)表于 03-13 20:20 ?0次下載
    9<b class='flag-5'>SQL4952-9SQL4954-9SQL</b>4958 系列數(shù)據(jù)表

    動(dòng)態(tài)Sql介紹

    動(dòng)態(tài)Sql介紹 動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過(guò) JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記
    的頭像 發(fā)表于 05-31 09:34 ?1438次閱讀
    動(dòng)態(tài)<b class='flag-5'>Sql</b>介紹

    MyBatis動(dòng)態(tài)sql是什么?MyBatis動(dòng)態(tài)SQL最全教程

    動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。在 JDBC 或其它類似的框架中,開發(fā)人員通常需要手動(dòng)拼接 SQL 語(yǔ)句。根據(jù)不同的條件拼接 SQL 語(yǔ)句是一件極其痛苦的工作。
    的頭像 發(fā)表于 08-10 10:18 ?1008次閱讀

    中軟國(guó)際亮相openGauss Developer Day 2024

    2024年6月21日,數(shù)據(jù)庫(kù)技術(shù)界的年度盛事——openGauss Developer Day 2024在北京昆泰嘉瑞文化中心盛大開幕。這場(chǎng)由openGauss社區(qū)主辦的大會(huì),吸引了來(lái)自全國(guó)各地的數(shù)據(jù)庫(kù)開發(fā)者、技術(shù)專家和行業(yè)領(lǐng)袖,共同探討數(shù)據(jù)庫(kù)技術(shù)的最新趨勢(shì)和應(yīng)用實(shí)踐。
    的頭像 發(fā)表于 06-22 09:28 ?702次閱讀

    躍昉科技正式加入openGauss社區(qū)

    日前,躍昉科技簽署CLA(Contribution License Agreement,貢獻(xiàn)許可協(xié)議),正式加入openGauss社區(qū),致力于推動(dòng)openGauss RISC-V SIG的發(fā)展。
    的頭像 發(fā)表于 10-18 09:28 ?477次閱讀

    軟通動(dòng)力榮膺“openGauss社區(qū)突出貢獻(xiàn)單位”

    12月27日,主題為“匯聚數(shù)據(jù)庫(kù)創(chuàng)新力量,引領(lǐng)智能時(shí)代新未來(lái)”的openGauss Summit 2024在北京召開。大會(huì)由openGauss社區(qū)和全球計(jì)算聯(lián)盟主辦,軟通動(dòng)力等社區(qū)成員單位共同協(xié)辦
    的頭像 發(fā)表于 12-27 18:47 ?425次閱讀