[TOC] # EXPLAIN ## 描述 该语句用于解释 SQL 语句的执行计划,可以是SELECT、DELETE、INSERT、REPLACE或UPDATE语句。提供正则过滤功能,通过session变量explain\_regex对输出行/JSON进行过滤。 ## 格式 ~~~ 获取表或列的信息: {EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] 获取SQL计划信息: {EXPLAIN | DESCRIBE | DESC} [BASIC | OUTLINE | EXTENDED | EXTENDED_NOADDR | PARTITIONS | FORMAT = {TRADITIONAL| JSON}] {SELECT statement | DELETE statement | INSERT statement | REPLACE statement| UPDATE statement} ~~~ ## 参数解释 <table data-tag="table" id="table-7kh-3hs-cjf" class="table"><colgroup width="329" span="1" data-tag="col" id="col-9v3-s4j-o9f" colwidth="1*" colnum="1" colname="col1" style="width:50%" class="col"></colgroup><colgroup width="376" span="1" data-tag="col" id="col-tob-5v2-jil" colwidth="1*" colnum="2" colname="col2" style="width:50%" class="col"></colgroup><thead id="thead-up1-viz-1fi" class="thead"><tr id="tr-sqw-kup-1n9"><th id="td-0z0-0t4-1i6"><p id="p-sji-koe-t7c"><b>参数</b></p></th><th id="td-4rt-3jp-y9m"><p id="p-v2t-1z4-fk8"><b>描述</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-1t0-nr2-57w" class="tbody"><tr data-tag="tr" id="tr-2y3-0hs-4bl" class="tr"><td data-tag="td" id="td-fh2-ak0-fbs" class="td"><p id="p-jb2-n6p-oq1">tbl_name</p></td><td data-tag="td" id="td-zbe-2l8-zs5" class="td"><p data-tag="p" id="p-g3m-j0l-019" class="p">指定表名。</p></td></tr><tr data-tag="tr" id="tr-lc1-x26-y2n" class="tr"><td data-tag="td" id="td-rdi-b8d-b6h" class="td"><p id="p-476-0gz-tgh">col_name</p></td><td data-tag="td" id="td-9ie-l92-2b5" class="td"><p data-tag="p" id="p-ubf-612-z0s" class="p">指定表的列名。</p></td></tr><tr data-tag="tr" id="tr-ha9-vdb-gz4" class="tr"><td data-tag="td" id="td-zs7-ulv-4x5" class="td"><p id="p-eku-egl-6zx">BASIC</p></td><td data-tag="td" id="td-wpf-eh4-kp2" class="td"><p id="p-pn0-je5-01a">指定输出计划的基础信息,如算子ID、算子名称、所引用的表名。</p></td></tr><tr data-tag="tr" id="tr-gs3-9et-e97" class="tr"><td data-tag="td" id="td-eik-kn0-oqe" class="td"><p id="p-u8l-m47-ae8">OUTLINE</p></td><td data-tag="td" id="td-e7s-zgo-8h5" class="td"><p id="p-y7z-o00-7uo">指定输出的计划信息包含outline信息。</p></td></tr><tr data-tag="tr" id="tr-x12-jv9-d93" class="tr"><td data-tag="td" id="td-zrj-ykt-8lw" class="td"><p id="p-4ay-aaz-76m">EXTENDED</p></td><td data-tag="td" id="td-u6v-sfu-29g" class="td"><p id="p-gyf-7m1-awm">EXPLAIN产生附加信息,包括:每个算子的输入列和输出列,访问表的分区信息,当前使用的filter信息,如果当前算子使用了索引,显示所使用的索引列及抽取的query range。</p></td></tr><tr data-tag="tr" id="tr-k9a-1l3-4wr" class="tr"><td data-tag="td" id="td-j0i-sj0-z4b" class="td"><p id="p-2rp-rx2-7ea">EXTENDED_NOADDR</p></td><td data-tag="td" id="td-54y-pbx-qto" class="td"><p id="p-11y-hyf-8o5">以简约的方式展示附加信息。</p></td></tr><tr data-tag="tr" id="tr-urd-z72-v5i" class="tr"><td data-tag="td" id="td-v8u-9ma-c0n" class="td"><p id="p-hb2-xgd-qcr">PARTITIONS</p></td><td data-tag="td" id="td-ch4-1w9-vrl" class="td"><p id="p-1gm-6w0-8b3">显示分区相关信息。</p></td></tr><tr data-tag="tr" id="tr-5rw-wwl-oih" class="tr"><td data-tag="td" id="td-bvr-u8n-dod" class="td"><p id="p-5ja-btn-f9q">FORMAT = {TRADITIONAL| JSON}</p></td><td data-tag="td" id="td-bqg-rx0-gby" class="td"><p data-tag="p" id="p-ozu-wc3-hxv" class="p">指定EXPALIN的输出格式:</p><ul lake-indent="0" data-tag="ul" id="ul-6pv-pxt-oou" class="ul"><li data-tag="li" id="li-kzw-vz2-uz0" class="li"><p id="p-zne-o6j-fck">TRADITIONAL:表格输出格式</p></li><li data-tag="li" id="li-scq-vna-cz9" class="li"><p id="p-vcm-qoy-98f">JSON:KEY:VALUE输出格式, JSON显示为JSON字符串,包括EXTENDED和PARTITIONS信息。</p></li></ul></td></tr></tbody></table> ## 示例 * **省略explain\_type** ~~~ OceanBase(admin@test)>explain select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |5933109| |1 | TABLE SCAN|t2 |10000 |6219 | |2 | TABLE SCAN|t1 |100000 |68478 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), equal_conds([t1.c2 = t2.c2]), other_conds(nil) 1 - output([t2.c2], [t2.c1]), filter(nil), access([t2.c2], [t2.c1]), partitions(p0) 2 - output([t1.c2], [t1.c1]), filter(nil), access([t1.c2], [t1.c1]), partitions(p0) ~~~ * **EXTENDED** ~~~ OceanBase(admin@test)>explain extended_noaddr select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |5933109| |1 | TABLE SCAN|t2 |10000 |6219 | |2 | TABLE SCAN|t1 |100000 |68478 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), equal_conds([t1.c2 = t2.c2]), other_conds(nil) 1 - output([t2.c2], [t2.c1]), filter(nil), access([t2.c2], [t2.c1]), partitions(p0), is_index_back=false, range_key([t2.c1]), range(4 ; MAX), range_cond([t2.c1 > 4]) 2 - output([t1.c2], [t1.c1]), filter(nil), access([t1.c2], [t1.c1]), partitions(p0), is_index_back=false, range_key([t1.__pk_increment], [t1.__pk_cluster_id], [t1.__pk_partition_id]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true ~~~ * **TRADITIONAL****格式** ~~~ OceanBase(admin@test)>explain format=TRADITIONAL select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |5933109| |1 | TABLE SCAN|t2 |10000 |6219 | |2 | TABLE SCAN|t1 |100000 |68478 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), equal_conds([t1.c2 = t2.c2]), other_conds(nil) 1 - output([t2.c2], [t2.c1]), filter(nil), access([t2.c2], [t2.c1]), partitions(p0) 2 - output([t1.c2], [t1.c1]), filter(nil), access([t1.c2], [t1.c1]), partitions(p0) ~~~ * **JSON格式** ~~~ OceanBase(admin@test)>explain format=JSON select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G *************************** 1. row *************************** Query Plan: { "ID":2, "OPERATOR":"JOIN", "NAME":"JOIN", "EST.ROWS":9800999, "COST":5933108, "output": [ "t1.c1", "t1.c2", "t2.c1", "t2.c2" ], "TABLE SCAN": { "ID":0, "OPERATOR":"TABLE SCAN", "NAME":"TABLE SCAN", "EST.ROWS":10000, "COST":6218, "output": [ "t2.c2", "t2.c1" ] }, "TABLE SCAN": { "ID":1, "OPERATOR":"TABLE SCAN", "NAME":"TABLE SCAN", "EST.ROWS":100000, "COST":68477, "output": [ "t1.c2", "t1.c1" ] } } ~~~ EXPLAIN 的每个输出行提供一个表的相关信息,并且每个行包括下面的列: <table data-tag="table" id="table-lb8-z13-lky" class="table"><colgroup width="226" span="1" data-tag="col" id="col-veq-2xe-qx6" colwidth="1*" colnum="1" colname="col1" style="width:50%" class="col"></colgroup><colgroup width="495" span="1" data-tag="col" id="col-dpo-0hk-lj2" colwidth="1*" colnum="2" colname="col2" style="width:50%" class="col"></colgroup><thead id="thead-fva-9mc-afe" class="thead"><tr id="tr-ac4-jor-38n"><th id="td-96a-vm1-7vu"><p id="p-bjp-8ir-89q"><b>列名</b></p></th><th id="td-2j9-ld1-fvm"><p id="p-hla-ukj-25i"><b>说明</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-8rv-cb9-80k" class="tbody"><tr data-tag="tr" id="tr-dfg-if1-c4t" class="tr"><td data-tag="td" id="td-6b3-k7q-zj9" class="td"><p data-tag="p" id="p-fct-i3q-vdd" class="p">ID</p></td><td data-tag="td" id="td-utv-ywd-obd" class="td"><p data-tag="p" id="p-eto-te6-34m" class="p">计划执行序列号。</p></td></tr><tr data-tag="tr" id="tr-tuj-3z2-s6m" class="tr"><td data-tag="td" id="td-jp5-v78-3ni" class="td"><p data-tag="p" id="p-q3c-v7x-xnz" class="p">OPERATOR</p></td><td data-tag="td" id="td-s1p-9kd-lg7" class="td"><p data-tag="p" id="p-vwk-idn-dge" class="p">执行算子。</p></td></tr><tr data-tag="tr" id="tr-2h5-lfg-67q" class="tr"><td data-tag="td" id="td-afu-shh-c2r" class="td"><p data-tag="p" id="p-6ng-vzz-w7j" class="p">NAME</p></td><td data-tag="td" id="td-9uc-qil-fz9" class="td"><p data-tag="p" id="p-5br-vmm-gvl" class="p">算子所引用的表。</p></td></tr><tr data-tag="tr" id="tr-ghw-x1g-vza" class="tr"><td data-tag="td" id="td-118-n21-bpw" class="td"><p data-tag="p" id="p-vqu-fpr-1gg" class="p"><span data-mce-style="font-size: 11px" data-tag="span" id="span-0vr-wyz-lm4" class="span"><span data-tag="span" id="span-v6i-y4n-8hx" class="span">EST.ROWS</span></span></p></td><td data-tag="td" id="td-l7n-6w6-sxh" class="td"><p data-tag="p" id="p-c75-c15-zwp" class="p">估计执行到当前算子输出的行数。</p></td></tr><tr data-tag="tr" id="tr-rsy-thp-hif" class="tr"><td data-tag="td" id="td-47d-3fr-zem" class="td"><p data-tag="p" id="p-5jy-0e4-cd2" class="p">COST</p></td><td data-tag="td" id="td-rue-vm5-219" class="td"><p data-tag="p" id="p-q46-swl-99p" class="p">执行到当前算子的CPU时间。</p></td></tr></tbody></table>