<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [TOC] # SQL 請求執行流程 SQL 引擎從接受 SQL 請求到執行的典型流程如下圖所示: ![](https://img.kancloud.cn/28/3c/283c713d25fc75391bd0a16743ca494c_465x591.png) 下表為 SQL 請求執行流程的步驟說明。 <table data-tag="table" id="table-vp6-ho3-4bq" class="table"><colgroup width="228" span="1" data-tag="col" id="col-bxu-3jv-kco" colwidth="1*" colnum="1" colname="col1" style="width:50%" class="col"></colgroup><colgroup width="524" span="1" data-tag="col" id="col-427-fzn-6qf" colwidth="1*" colnum="2" colname="col2" style="width:50%" class="col"></colgroup><thead id="thead-akx-qkt-366" class="thead"><tr id="tr-88w-mww-u6l"><th id="td-vav-0fi-jho"><p id="p-hy5-mnu-rnd"><b>步驟</b></p></th><th id="td-4o9-y40-3fu"><p id="p-brf-36e-6oc"><b>說明</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-nf6-t5v-h0n" class="tbody"><tr data-tag="tr" id="tr-5t7-x10-rxi" class="tr"><td data-tag="td" id="td-mbt-mvv-23o" class="td"><p data-tag="p" id="p-m0a-35t-236" class="p">Parser(詞法/語法解析模塊)</p></td><td data-tag="td" id="td-2vz-qwf-5k1" class="td"><p data-tag="p" id="p-kyg-imt-zfg" class="p">在收到用戶發送的 SQL 請求串后,Parser 會將字符串分成一個個的“單詞”,并根據預先設定好的語法規則解析整個請求,將 SQL 請求字符串轉換成帶有語法結構信息的內存數據結構,稱為語法樹(Syntax Tree)。</p></td></tr><tr data-tag="tr" id="tr-g76-aq1-a11" class="tr"><td data-tag="td" id="td-pdx-938-bxv" class="td"><p data-tag="p" id="p-zzc-9gs-42m" class="p">Plan Cache(執行計劃緩存模塊)</p></td><td data-tag="td" id="td-w4s-ujy-1hy" class="td"><p data-tag="p" id="p-nqy-mdo-pd6" class="p">執行計劃緩存模塊會將該 SQL 第一次生成的執行計劃緩存在內存中,后續的執行可以反復執行這個計劃,避免了重復查詢優化的過程。</p></td></tr><tr data-tag="tr" id="tr-fam-i2u-mvc" class="tr"><td data-tag="td" id="td-fm1-xh3-n12" class="td"><p data-tag="p" id="p-uoj-dkt-l1o" class="p">Resolver(語義解析模塊)</p></td><td data-tag="td" id="td-9xp-k7k-kbk" class="td"><p data-tag="p" id="p-erk-bur-pke" class="p">Resolver 將生成的語法樹轉換為帶有數據庫語義信息的內部數據結構。在這一過程中,Resolver 將根據數據庫元信息將 SQL 請求中的 Token 翻譯成對應的對象(例如庫、表、列、索引等),生成的數據結構叫做 Statement Tree。</p></td></tr><tr data-tag="tr" id="tr-oig-0bm-8d2" class="tr"><td data-tag="td" id="td-uek-75j-n2p" class="td"><p data-tag="p" id="p-l9z-uc9-ckl" class="p">Transfomer(邏輯改寫模塊)</p></td><td data-tag="td" id="td-cmn-l6s-e92" class="td"><p data-tag="p" id="p-ztk-g6r-ff4" class="p">分析用戶 SQL 的語義,并根據內部的規則或代價模型,將用戶 SQL 改寫為與之等價的其他形式,并將其提供給后續的優化器做進一步的優化。Transformer 的工作方式是在原 Statement Tree 上做等價變換,變換的結果仍然是一棵 Statement Tree。</p></td></tr><tr data-tag="tr" id="tr-hc2-ick-3rk" class="tr"><td data-tag="td" id="td-tkh-py8-w51" class="td"><p data-tag="p" id="p-hfc-68m-tov" class="p">Optimizer(優化器)</p></td><td data-tag="td" id="td-yxs-h9b-m7a" class="td"><p data-tag="p" id="p-8nv-stg-r0v" class="p">優化器是整個 SQL 請求優化的核心,其作用是為 SQL 請求生成最佳的執行計劃。在優化過程中,優化器需要綜合考慮 SQL 請求的語義、對象數據特征、對象物理分布等多方面因素,解決訪問路徑選擇、聯接順序選擇、聯接算法選擇、分布式計劃生成等多個核心問題,最終選擇一個對應該 SQL 的最佳執行計劃。</p></td></tr><tr data-tag="tr" id="tr-ufr-wd2-0al" class="tr"><td data-tag="td" id="td-az5-jem-adx" class="td"><p data-tag="p" id="p-qfx-kk8-7xk" class="p">Code Generator(代碼生成器)</p></td><td data-tag="td" id="td-qib-1tn-0m6" class="td"><p data-tag="p" id="p-5od-01m-9il" class="p">將執行計劃轉換為可執行的代碼,但是不做任何優化選擇。</p></td></tr><tr data-tag="tr" id="tr-5mb-poj-jft" class="tr"><td data-tag="td" id="td-z9b-m9s-vcc" class="td"><p data-tag="p" id="p-tkw-s9w-ptv" class="p">Executor(執行器)</p></td><td data-tag="td" id="td-gob-ofx-cvf" class="td"><p data-tag="p" id="p-ecc-4fi-xix" class="p">啟動 SQL 的執行過程。</p><ul lake-indent="0" data-tag="ul" id="ul-r06-vza-kb5" class="ul"><li data-tag="li" id="li-bdk-d7m-vq5" class="li"><p id="p-nec-xpu-3hl">對于本地執行計劃,Executor 會簡單的從執行計劃的頂端的算子開始調用,根據算子自身的邏輯完成整個執行的過程,并返回執行結果。</p></li><li data-tag="li" id="li-cem-tri-e7d" class="li"><p id="p-atc-v2q-xah">對于遠程或分布式計劃,將執行樹分成多個可以調度的子計劃,并通過 RPC 將其發送給相關的節點去執行。 </p></li></ul></td></tr></tbody></table>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看