在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

openGauss的SQL by pass框架

我快閉嘴 ? 來源:Gauss松鼠會 ? 作者:酷哥 ? 2022-09-07 09:44 ? 次閱讀

執行引擎一般負責查詢的執行,執行引擎在SQL執行棧中起到接收優化器生成的執行計劃Plan、并對通過存儲引擎提供的數據讀寫接口,實現對數據進行計算得到查詢的結果集。

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

01

SQL by pass

enable_opfusion用于控制是否對簡單增刪改查進行優化,簡單insert語句在開啟enable_opfusion時的執行計劃如下:017bcfd2-2dec-11ed-ba43-dac502259ad0.png

由于開啟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 "@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適應的場景有:

  • 只支持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列修改的值可以是常量和參數,也可以是一個簡單的表達式,c1c2列為索引列,后邊可以是常量或者參數。

02

經典的執行器

關閉enable_opfusion,簡單insert的執行計劃是這樣的:

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

在這種執行流程中Portal是執行SQL語句的載體,每一條SQL對應唯一的Portal,不同的查詢類型對應的Portal類型也有區別。

typedef enum PortalStrategy {    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函數負責最后的清理工作,主要是數據結構、緩存的清理。01d7839a-2dec-11ed-ba43-dac502259ad0.png

PortalRun函數根據查詢類型進入不同的處理函數:

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從這里進入                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完成數據插入。

#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
以上分析了簡單insert語句的兩種執行流程,對于delete,update,select基本工作流程一致。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    764

    瀏覽量

    44134
  • 數據庫
    +關注

    關注

    7

    文章

    3799

    瀏覽量

    64396
  • 執行器
    +關注

    關注

    5

    文章

    378

    瀏覽量

    19359

原文標題:數據庫內核分析 - SQL by pass & 經典執行器

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MOSFET Pass Element Yields 100

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

    華為正式宣布開源數據庫能力,開放openGauss數據庫源代碼

    openGauss 是一款開源關系型數據庫管理系統,采用木蘭寬松許可證 v2 發行。openGauss 內核源自 PostgreSQL,深度融合華為在數據庫領域多年的經驗,結合企業級場景需求,持續構建競爭力特性。同時 openGauss
    的頭像 發表于 07-25 11:11 ?4701次閱讀

    SQL后悔藥,SQL性能優化和SQL規范優雅

    每一個好習慣都是一筆財富,本文基于MySQL,分SQL后悔藥, SQL性能優化,SQL規范優雅三個方向,分享寫SQL的21個好習慣,謝謝閱讀,加油哈~ 1. 寫完
    的頭像 發表于 11-14 09:54 ?1833次閱讀

    ADMV8913: X Band, Digitally Tunable, High-Pass and Low-Pass Filter Preliminary Data Sheet

    ADMV8913: X Band, Digitally Tunable, High-Pass and Low-Pass Filter Preliminary Data Sheet
    發表于 01-27 20:24 ?9次下載
    ADMV8913: X Band, Digitally Tunable, High-<b class='flag-5'>Pass</b> and Low-<b class='flag-5'>Pass</b> Filter Preliminary Data Sheet

    專業數據庫廠商快立方正式加入openGauss社區

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

    中軟國際簽署CLA,加入到openGauss社區

    openGauss Housekeeper不僅為openGauss集群實現自動化的高可用主備管理,而且還通過實現浮動IP,為openGauss集群對外呈現統一的浮動IP服務,用戶只需要通過統一的浮動IP訪問數據庫,而無需了解集群
    的頭像 發表于 06-30 11:41 ?2057次閱讀
    中軟國際簽署CLA,加入到<b class='flag-5'>openGauss</b>社區

    openGauss 3.1.0版本正式上線!七個方面全面增強

    openGauss 3.1.0 版本是openGauss 2022年發布的Preview版本,版本維護生命周期為0.5年。此次發布包含兩個數據庫服務端安裝包:企業版和輕量版。
    的頭像 發表于 10-09 10:04 ?1222次閱讀

    Mybatis的SQL注入審計的基本方法

    SQL注入漏洞作為WEB安全的最常見的漏洞之一,在java中隨著預編譯與各種ORM框架的使用,注入問題也越來越少。新手代碼審計者往往對Java Web應用的多個框架組合而心生畏懼,不知如何下手,希望通過Mybatis
    的頭像 發表于 10-17 11:16 ?1313次閱讀

    使用Dockerfile制作openGauss鏡像

    獲取openGauss企業版3.0.0的安裝包和源碼文件。這里我用的是CentOS,選擇的是企業版。對于只是想體驗一下的同學來說選擇輕量版就足夠了,步驟和主要功能是一樣的,優點是包更小,占用存儲空間更少,缺點是裁掉了一些功能,具體差別見官方文檔。
    的頭像 發表于 12-07 15:08 ?893次閱讀

    9SQL4952-9SQL4954-9SQL4958 系列數據表

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

    動態Sql介紹

    動態Sql介紹 動態 SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記
    的頭像 發表于 05-31 09:34 ?1387次閱讀
    動態<b class='flag-5'>Sql</b>介紹

    MyBatis動態sql是什么?MyBatis動態SQL最全教程

    動態 SQL 是 MyBatis 的強大特性之一。在 JDBC 或其它類似的框架中,開發人員通常需要手動拼接 SQL 語句。根據不同的條件拼接 SQL 語句是一件極其痛苦的工作。
    的頭像 發表于 08-10 10:18 ?965次閱讀

    中軟國際亮相openGauss Developer Day 2024

    2024年6月21日,數據庫技術界的年度盛事——openGauss Developer Day 2024在北京昆泰嘉瑞文化中心盛大開幕。這場由openGauss社區主辦的大會,吸引了來自全國各地的數據庫開發者、技術專家和行業領袖,共同探討數據庫技術的最新趨勢和應用實踐。
    的頭像 發表于 06-22 09:28 ?658次閱讀

    躍昉科技正式加入openGauss社區

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

    軟通動力榮膺“openGauss社區突出貢獻單位”

    12月27日,主題為“匯聚數據庫創新力量,引領智能時代新未來”的openGauss Summit 2024在北京召開。大會由openGauss社區和全球計算聯盟主辦,軟通動力等社區成員單位共同協辦
    的頭像 發表于 12-27 18:47 ?126次閱讀
    主站蜘蛛池模板: 又大又粗进出白浆直流动态图| 天天爱天天做天天爽天天躁| 亚色成人| 美女拍拍拍爽爽爽爽爽爽| 一级片在线免费看| japanese69xxx日本| 四虎影院精品在线观看| va在线| 日日天天夜夜| 欧美日本一道免费一区三区| 日本h视频在线| 日韩 ed2k| 久久久久久亚洲精品| 国产在线精品观看| 色婷婷综合激情| 在线免费看高清视频大全| 欧美黄色xxx| 伊人五月婷婷| 国产小片| 2018天天操夜夜操| 色狠狠综合| 天天射天天干天天| 国产精品高清免费网站| 国产一级特黄在线播放| 日本69xxxxxxx69| 日本黄色高清视频网站| 日本加勒比高清一本大道| 在线免费成人| 欧美三级视频网站| 美女黄色毛片| 免费色黄网站| 日韩欧美一区二区三区视频| 国产资源在线观看| 欧美性受xxxx| 欧美日韩国产另类一区二区三区| 欧美在线视频看看| 国产美女叼嘿视频免费看| 国产婷婷色| 亚洲一区二区免费| 精品啪啪| 一区二区三区在线播放|