<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] # 基于代價的路徑選擇 在基于規則的路徑選擇之后,如果存在多個可以選擇的路徑,那么 OceanBase 數據庫會計算每個路徑的代價,并從中選擇代價最小的路徑作為最終選擇的路徑。 OceanBase 數據庫的代價模型考慮了 CPU 代價(比如處理一個謂詞的 CPU 開銷)和 IO 代價(比如順序、隨機讀取宏塊和微塊的代價),CPU 代價和 IO 代價最終相加得到一個總的代價。 在 OceanBase 數據庫中,每個訪問路徑的代價會在執行計劃中都會展示出來。如下例所示: ~~~ obclient>CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT, INDEX k1(b)); Query OK, 0 rows affected (0.35 sec) /*主表路徑的代價*/ obclient>EXPLAIN SELECT/*+INDEX(t1 PRIMARY)*/ * FROM t1 WHERE b < 10; +-----------------------------------------------------------------+ | Query Plan | +-----------------------------------------------------------------+ | =================================== |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------- |0 |TABLE SCAN|t1 |200 |622 | =================================== Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter([t1.b < 10]), access([t1.b], [t1.a], [t1.c]), partitions(p0) /* k1 路徑的代價*/ obclient> EXPLAIN SELECT/*+INDEX(t1 k1)*/ * FROM t1 WHERE b < 10; +--------------------------------------------------------------------+ | Query Plan | +--------------------------------------------------------------------+ | ===================================== |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------- |0 |TABLE SCAN|t1(k1)|200 |1114| ===================================== Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter(nil), access([t1.b], [t1.a], [t1.c]), partitions(p0) ~~~ 對于一個訪問路徑,它的代價主要由掃描訪問路徑的代價和回表的代價兩部分組成。如果一個訪問路徑不需要回表,那么就沒有回表的代價。 在 OceanBase 數據庫中,訪問路徑的代價取決于很多因素,比如掃描的行數、回表的行數、投影的列數和謂詞的個數等。但是對于訪問路徑來說,代價在很大程度上取決于行數,所以在下面的示例分析中,從行數這個維度來介紹這兩部分的代價。 * 掃描訪問路徑的代價 掃描訪問路徑的代價跟掃描的行數成正比,理論上來說掃描的行數越多,執行時間就會越久。對于一個訪問路徑,query range 決定了需要掃描的范圍,從而決定了需要掃描的行數。Query range 的掃描是順序 IO。 * 回表的代價 回表的代價跟回表的行數也也是正相關的,回表的行數越多(回表的行數是指滿足所有能在索引上執行的謂詞的行數),執行時間就會越長。回表的掃描是隨機 IO,所以回表一行的代價會比 query range 掃描一行的代價高很多。 當分析一個訪問路徑的性能的時候,可以從上面兩個因素入手,獲取通過 query range 掃描的行數以及回表的行數。這兩個行數通常可以通過執行 SQL 語句來獲取。 如下例所示,對于查詢`SELECT * FROM t1 WHERE c2 > 20 AND c2 < 800 AND c3 < 200`,索引 k1 的訪問路徑是,首先通常計劃展示來獲取用來抽取 query range 的謂詞,謂詞`c2 > 20 AND c2 < 800`用來抽取 query range,謂詞`c3 < 200`被當成回表前的謂詞。那么可以使用如下兩個查詢來檢查 query range 抽取的行數以及回表之后的行數。 ~~~ obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT, c4 INT, c5 INT, INDEX k1(c2,c3)); Query OK, 0 rows affected (0.26 sec) obclient>EXPLAIN EXTENDED_NOADDR SELECT/*+INDEX(t1 k1)*/ * FROM t1 WHERE c2 > 20 AND c2 < 800 AND c3 < 200; +--------------------------------------------------------------+ | Query Plan | +--------------------------------------------------------------+ | ===================================== |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------- |0 |TABLE SCAN|t1(k1)|156 |1216| ===================================== Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter([t1.c3 < 200]), access([t1.c2], [t1.c3], [t1.c1], [t1.c4], [t1.c5]), partitions(p0), is_index_back=true, filter_before_indexback[true], range_key([t1.c2], [t1.c3], [t1.c1]), range(20,MAX,MAX ; 800,MIN,MIN), range_cond([t1.c2 > 20], [t1.c2 < 800]) /*query range 掃描的行數*/ obclient>SELECT/*+INDEX(t1 k1)*/ COUNT(*) FROM t1 WHERE c2 > 20 AND c2 < 800; +----------+ | count(*) | +----------+ | 779 | +----------+ 1 row in set (0.02 sec) /* 回表的行數*/ obclient> SELECT/*+INDEX(t1 k1)*/ COUNT(*) FROM t1 WHERE c2 > 20 AND c2 < 800 AND c3 < 200; +----------+ | count(*) | +----------+ | 179 | +----------+ 1 row in set (0.01 sec) ~~~
                  <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>

                              哎呀哎呀视频在线观看