<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] # LIMIT LIMIT 算子用于限制數據輸出的行數,與 MySQL 的 LIMIT 算子功能相同。 在 OceanBase 數據庫的 MySQL 模式中處理含有 LIMIT 的 SQL 時,SQL 優化器都會為其生成一個 LIMIT 算子,但在一些特殊場景不會給與分配,例如 LIMIT 可以下壓到基表的場景,就沒有分配的必要性。 而對于 OceanBase 數據庫的 Oracle 模式,以下兩種場景會為其分配 LIMIT 算子: * ROWNUM 經過 SQL 優化器改寫生成 * 為了兼容 Oracle12c 的 FETCH 功能 ## MySQL 模式含有 LIMIT 的 SQL 場景 示例 1:OceanBase 數據庫的 MySQL 模式含有 LIMIT 的 SQL 場景 ~~~ obclient>CREATE TABLE t1(c1 INT, c2 INT); Query OK, 0 rows affected (0.12 sec) obclient>CREATE TABLE t2(c1 INT, c2 INT); Query OK, 0 rows affected (0.12 sec) obclient>INSERT INTO t1 VALUES(1, 1); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t1 VALUES(2, 2); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t1 VALUES(3, 3); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t2 VALUES(1, 1); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t2 VALUES(2, 2); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t2 VALUES(3, 3); Query OK, 1 rows affected (0.12 sec) Q1: obclient>EXPLAIN SELECT t1.c1 FROM t1,t2 LIMIT 1 OFFSET 1\G; *************************** 1. row *************************** Query Plan: | ===================================================== |ID|OPERATOR |NAME|EST. ROWS|COST | ----------------------------------------------------- |0 |LIMIT | |1 |39 | |1 | NESTED-LOOP JOIN CARTESIAN| |2 |39 | |2 | TABLE SCAN |t1 |1 |36 | |3 | TABLE SCAN |t2 |100000 |59654| ===================================================== Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter(nil), limit(1), offset(1) 1 - output([t1.c1]), filter(nil), conds(nil), nl_params_(nil) 2 - output([t1.c1]), filter(nil), access([t1.c1]), partitions(p0) 3 - output([t2.__pk_increment]), filter(nil), access([t2.__pk_increment]), partitions(p0) Q2: obclient>EXPLAIN SELECT * FROM t1 LIMIT 2\G; *************************** 1. row *************************** Query Plan: | =================================== |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------- |0 |TABLE SCAN|t1 |2 |37 | =================================== Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2]), filter(nil), access([t1.c1], [t1.c2]), partitions(p0), limit(2), offset(nil) ~~~ 上述示例中,Q1 查詢的執行計劃展示中的 outputs & filters 詳細列出了 LIMIT 算子的輸出信息如下: <table data-tag="table" id="table-lfg-0kc-v45" class="table"><colgroup span="1" width="140" data-tag="col" id="col-eup-kzc-zlj" colwidth="1*" colnum="1" colname="col1" style="width:50%" class="col"></colgroup><colgroup span="1" width="606" data-tag="col" id="col-qy3-rvf-xrw" colwidth="1*" colnum="2" colname="col2" style="width:50%" class="col"></colgroup><thead id="thead-jhq-rbr-5ai" class="thead"><tr id="tr-jxi-gul-1hp"><th id="td-r9r-2re-38y"><p id="p-sr9-dfy-c7n"><b>信息名稱</b></p></th><th id="td-xdc-21d-ere"><p id="p-q82-typ-t4l"><b>含義</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-orr-okl-ya7" class="tbody"><tr data-tag="tr" id="tr-al3-zom-7hr" class="tr"><td data-tag="td" id="td-4p6-y8a-4ap" class="td"><p id="p-1qb-us2-aio">output</p></td><td data-tag="td" id="td-4rt-k08-ayj" class="td"><p id="p-ou7-s3s-bol">該算子輸出的表達式。</p></td></tr><tr data-tag="tr" id="tr-u86-l46-iuy" class="tr"><td data-tag="td" id="td-7bv-914-w04" class="td"><p id="p-99q-cf1-8mu">filter</p></td><td data-tag="td" id="td-7w3-i1f-zwq" class="td"><p id="p-sru-f7d-5yo">該算子上的過濾條件。</p><p id="p-3iq-u72-xuf">由于示例中 LIMIT 算子沒有設置 filter,所以為 nil。</p></td></tr><tr data-tag="tr" id="tr-l28-7gn-iin" class="tr"><td data-tag="td" id="td-0yk-uut-5e9" class="td"><p data-tag="p" id="p-d0j-i62-baf" class="p">limit</p></td><td data-tag="td" id="td-bwg-cai-t6f" class="td"><p data-tag="p" id="p-tqd-yx9-jg6" class="p">限制輸出的行數,是一個常量。</p></td></tr><tr data-tag="tr" id="tr-7hs-8wu-pz2" class="tr"><td data-tag="td" id="td-nk0-u31-ewr" class="td"><p data-tag="p" id="p-mxh-8ao-zp1" class="p">offset</p></td><td data-tag="td" id="td-6s2-yhz-v4a" class="td"><p data-tag="p" id="p-ngq-tts-5qq" class="p">距離當前位置的偏移行數,是一個常量。</p><p data-tag="p" id="p-wxd-1yw-3lg" class="p">由于示例中的 SQL 中不含有 offset,因此生成的計劃中為 nil。</p></td></tr></tbody></table> Q2 查詢的執行計劃展示中,雖然 SQL 中含有 LIMIT,但是并未分配 LIMIT 算子,而是將相關表達式下壓到了 TABLE SCAN 算子上,這種下壓 LIMIT 行為是 SQL 優化器的一種優化方式,詳細信息請參見[TABLE SCAN](https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/table-scan-2)。 ## Oracle 模式含有 COUNT 的 SQL 改寫為 LIMIT 場景 由于 Oracle 模式含有 COUNT 的 SQL 改寫為 LIMIT 場景在 COUNT 算子章節已經有過相關介紹,詳細信息請參見[COUNT](https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/COUNT-1-2-3-4)。 ## Oracle 模式含有 FETCH 的 SQL 場景 示例 2:OceanBase 數據庫的 Oracle 模式含有 FETCH 的 SQL 場景 ~~~ obclient>CREATE TABLE T1(c1 INT, c2 INT); Query OK, 0 rows affected (0.12 sec) obclient>CREATE TABLE T1(c1 INT, c2 INT); Query OK, 0 rows affected (0.12 sec) obclient>INSERT INTO t1 VALUES(1, 1); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t1 VALUES(2, 2); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t1 VALUES(3, 3); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t2 VALUES(1, 1); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t2 VALUES(2, 2); Query OK, 1 rows affected (0.12 sec) obclient>INSERT INTO t2 VALUES(3, 3); Query OK, 1 rows affected (0.12 sec) Q3: obclient>EXPLAIN SELECT * FROM t1,t2 OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY\G; *************************** 1. row *************************** Query Plan: | ===================================================== |ID|OPERATOR |NAME|EST. ROWS|COST | ----------------------------------------------------- |0 |LIMIT | |1 |238670 | |1 | NESTED-LOOP JOIN CARTESIAN| |2 |238669 | |2 | TABLE SCAN |T1 |1 |36 | |3 | MATERIAL | |100000 |238632 | |4 | TABLE SCAN |T2 |100000 |64066| ===================================================== Outputs & filters: ------------------------------------- 0 - output([T1.C1], [T1.C2], [T2.C1], [T2.C2]), filter(nil), limit(?), offset(?) 1 - output([T1.C1], [T1.C2], [T2.C1], [T2.C2]), filter(nil), conds(nil), nl_params_(nil) 2 - output([T1.C1], [T1.C2]), filter(nil), access([T1.C1], [T1.C2]), partitions(p0) 3 - output([T2.C1], [T2.C2]), filter(nil) 4 - output([T2.C1], [T2.C2]), filter(nil), access([T2.C1], [T2.C2]), partitions(p0) Q4: obclient>EXPLAIN SELECT * FROM t1 FETCH NEXT 1 ROWS ONLY\G; *************************** 1. row *************************** Query Plan: | =================================== |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------- |0 |TABLE SCAN|T1 |1 |37 | =================================== Outputs & filters: ------------------------------------- 0 - output([T1.C1], [T1.C2]), filter(nil), access([T1.C1], [T1.C2]), partitions(p0), limit(?), offset(nil) Q5: obclient>EXPLAIN SELECT * FROM t2 ORDER BY c1 FETCH NEXT 10 PERCENT ROW WITH TIES\G; *************************** 1. row *************************** Query Plan: | ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |LIMIT | |10000 |573070| |1 | SORT | |100000 |559268| |2 | TABLE SCAN|T2 |100000 |64066 | ======================================= Outputs & filters: ------------------------------------- 0 - output([T2.C1], [T2.C2]), filter(nil), limit(nil), offset(nil), percent(?), with_ties(true) 1 - output([T2.C1], [T2.C2]), filter(nil), sort_keys([T2.C1, ASC]) 2 - output([T2.C1], [T2.C2]), filter(nil), access([T2.C1], [T2.C2]), partitions(p0) ~~~ 上述示例中,Q3 和 Q4 的查詢的執行計劃展示中,與之前 MySQL 模式的 Q1 和 Q2 查詢基本相同,這是因為 Oracle 12c 的 FETCH 功能和 MySQL 的 LIMIT 功能類似,兩者的區別如 Q5 執行計劃展示中所示。 執行計劃展示中的 outputs & filters 詳細列出了 LIMIT 算子的輸出信息如下: <table data-tag="table" id="table-dbk-f55-tgs" class="table"><colgroup span="1" width="140" data-tag="col" id="col-vps-vfp-gfq" colwidth="1*" colnum="1" colname="col1" style="width:50%" class="col"></colgroup><colgroup span="1" width="606" data-tag="col" id="col-ko3-ba1-0da" colwidth="1*" colnum="2" colname="col2" style="width:50%" class="col"></colgroup><thead id="thead-lpw-dm0-as0" class="thead"><tr id="tr-vch-k32-mgy"><th id="td-w97-yaf-vgf"><p id="p-s5s-9yu-onw"><b>信息名稱</b></p></th><th id="td-xrz-wuw-htt"><p id="p-y5c-xia-gq7"><b>含義</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-avv-kbf-3nk" class="tbody"><tr data-tag="tr" id="tr-54j-9hf-vy6" class="tr"><td data-tag="td" id="td-0a2-zkw-byh" class="td"><p id="p-qx7-dm8-fj3">output</p></td><td data-tag="td" id="td-xww-ko8-w8v" class="td"><p id="p-zb1-mkf-vnk">該算子輸出的表達式。</p></td></tr><tr data-tag="tr" id="tr-fhx-sv7-y3d" class="tr"><td data-tag="td" id="td-p85-be6-ij9" class="td"><p id="p-9qa-9wu-9ze">filter</p></td><td data-tag="td" id="td-r7f-r4s-8c0" class="td"><p id="p-15s-ofl-861">該算子上的過濾條件。</p><p id="p-fdx-nwk-g6g">由于示例中 LIMIT 算子沒有設置 filter,所以為 nil。</p></td></tr><tr data-tag="tr" id="tr-xb6-ugm-uve" class="tr"><td data-tag="td" id="td-lb5-8cb-o32" class="td"><p data-tag="p" id="p-4ri-g5d-kkq" class="p">limit</p></td><td data-tag="td" id="td-i7g-9vm-ka3" class="td"><p data-tag="p" id="p-6mk-nrm-0io" class="p">限制輸出的行數,是一個常量。</p></td></tr><tr data-tag="tr" id="tr-qpl-vy3-8d7" class="tr"><td data-tag="td" id="td-xc7-2d2-17h" class="td"><p data-tag="p" id="p-rb2-wtl-95v" class="p">offset</p></td><td data-tag="td" id="td-duu-1mo-cil" class="td"><p data-tag="p" id="p-iv9-lds-lms" class="p">距離當前位置的偏移行數,是一個常量。</p></td></tr><tr data-tag="tr" id="tr-fzt-kx9-ijz" class="tr"><td data-tag="td" id="td-n8g-a3k-dc8" class="td"><p data-tag="p" id="p-o0i-aba-ska" class="p">percent</p></td><td data-tag="td" id="td-62s-z5j-6hh" class="td"><p data-tag="p" id="p-szb-9ah-81n" class="p">按照數據總行數的百分比輸出,是一個常量。</p></td></tr><tr data-tag="tr" id="tr-c61-erq-stq" class="tr"><td data-tag="td" id="td-gb5-5mm-amk" class="td"><p data-tag="p" id="p-mc2-1pl-8j5" class="p">with_ties</p></td><td data-tag="td" id="td-gm6-7xe-zxa" class="td"><p data-tag="p" id="p-i6h-wla-cdm" class="p">是否在排序后的將最后一行按照等值一起輸出。</p><p data-tag="p" id="p-zh6-g8x-ew5" class="p">例如,要求輸出最后一行,但是排序之后有兩行的值都為 1,如果設置了最后一行按照等值一起輸出,那么這兩行都會被輸出。</p></td></tr></tbody></table> 以上 LIMIT 算子的新增的計劃展示屬性,都是在 Oracle 模式下的 FETCH 功能特有的,不影響 MySQL 模式計劃。關于 Oracle12c 的 FETCH 語法的詳細信息,請參見 [Oracle 12c Fetch Rows](https://renenyffenegger.ch/notes/development/databases/Oracle/SQL/select/first-n-rows/index#ora-sql-row-limiting-clause)
                  <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>

                              哎呀哎呀视频在线观看