Skip to content

Commit

Permalink
plan: draw relation bewteen operators with indent (pingcap#6894)
Browse files Browse the repository at this point in the history
  • Loading branch information
zz-jason authored Jun 28, 2018
1 parent 6851878 commit a7819c3
Show file tree
Hide file tree
Showing 12 changed files with 631 additions and 576 deletions.
160 changes: 80 additions & 80 deletions cmd/explaintest/r/explain_complex.result

Large diffs are not rendered by default.

156 changes: 78 additions & 78 deletions cmd/explaintest/r/explain_complex_stats.result

Large diffs are not rendered by default.

346 changes: 173 additions & 173 deletions cmd/explaintest/r/explain_easy.result

Large diffs are not rendered by default.

194 changes: 97 additions & 97 deletions cmd/explaintest/r/explain_easy_stats.result
Original file line number Diff line number Diff line change
Expand Up @@ -9,121 +9,121 @@ load stats 's/explain_easy_stats_t3.json';
set @@session.tidb_opt_insubquery_unfold = 1;
set @@session.tidb_opt_agg_push_down = 1;
explain select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a );
id parents children task operator info count
TableScan_16 cop table:t3, range:[-inf,+inf], keep order:false 2000.00
TableReader_17 Projection_15 root data:TableScan_16 2000.00
Projection_15 HashLeftJoin_14 TableReader_17 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a) 2000.00
TableScan_29 StreamAgg_22 cop table:s, range:[-inf,+inf], keep order:false 2000.00
StreamAgg_22 TableScan_29 cop funcs:sum(s.a) 1.00
TableReader_31 StreamAgg_30 root data:StreamAgg_22 1.00
StreamAgg_30 HashLeftJoin_14 TableReader_31 root funcs:sum(col_0) 1.00
HashLeftJoin_14 Projection_13 Projection_15,StreamAgg_30 root semi join, inner:StreamAgg_30, equal:[eq(cast(test.t3.a), sel_agg_1)] 1600.00
Projection_13 HashLeftJoin_14 root test.t3.a, test.t3.b, test.t3.c, test.t3.d 1600.00
id task operator info count
Projection_13 root test.t3.a, test.t3.b, test.t3.c, test.t3.d 1600.00
└─HashLeftJoin_14 root semi join, inner:StreamAgg_30, equal:[eq(cast(test.t3.a), sel_agg_1)] 1600.00
├─Projection_15 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a) 2000.00
│ └─TableReader_17 root data:TableScan_16 2000.00
│ └─TableScan_16 cop table:t3, range:[-inf,+inf], keep order:false 2000.00
└─StreamAgg_30 root funcs:sum(col_0) 1.00
└─TableReader_31 root data:StreamAgg_22 1.00
└─StreamAgg_22 cop funcs:sum(s.a) 1.00
└─TableScan_29 cop table:s, range:[-inf,+inf], keep order:false 2000.00
explain select * from t1;
id parents children task operator info count
TableScan_4 cop table:t1, range:[-inf,+inf], keep order:false 1999.00
TableReader_5 root data:TableScan_4 1999.00
id task operator info count
TableReader_5 root data:TableScan_4 1999.00
└─TableScan_4 cop table:t1, range:[-inf,+inf], keep order:false 1999.00
explain select * from t1 order by c2;
id parents children task operator info count
IndexScan_11 cop table:t1, index:c2, range:[<nil>,+inf], keep order:true 1999.00
TableScan_12 cop table:t1, keep order:false 1999.00
IndexLookUp_13 root index:IndexScan_11, table:TableScan_12 1999.00
id task operator info count
IndexLookUp_13 root index:IndexScan_11, table:TableScan_12 1999.00
├─IndexScan_11 cop table:t1, index:c2, range:[<nil>,+inf], keep order:true 1999.00
└─TableScan_12 cop table:t1, keep order:false 1999.00
explain select * from t2 order by c2;
id parents children task operator info count
TableScan_7 cop table:t2, range:[-inf,+inf], keep order:false 1985.00
TableReader_8 Sort_4 root data:TableScan_7 1985.00
Sort_4 TableReader_8 root test.t2.c2:asc 1985.00
id task operator info count
Sort_4 root test.t2.c2:asc 1985.00
└─TableReader_8 root data:TableScan_7 1985.00
└─TableScan_7 cop table:t2, range:[-inf,+inf], keep order:false 1985.00
explain select * from t1 where t1.c1 > 0;
id parents children task operator info count
TableScan_5 cop table:t1, range:(0,+inf], keep order:false 1999.00
TableReader_6 root data:TableScan_5 1999.00
id task operator info count
TableReader_6 root data:TableScan_5 1999.00
└─TableScan_5 cop table:t1, range:(0,+inf], keep order:false 1999.00
explain select t1.c1, t1.c2 from t1 where t1.c2 = 1;
id parents children task operator info count
IndexScan_8 cop table:t1, index:c2, range:[1,1], keep order:false 0.00
IndexReader_9 root index:IndexScan_8 0.00
id task operator info count
IndexReader_9 root index:IndexScan_8 0.00
└─IndexScan_8 cop table:t1, index:c2, range:[1,1], keep order:false 0.00
explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1;
id parents children task operator info count
IndexScan_14 Selection_16 cop table:t1, index:c2, range:[<nil>,+inf], keep order:true 1999.00
Selection_16 IndexScan_14 cop gt(test.t1.c1, 1) 1998.00
TableScan_15 cop table:t1, keep order:false 1998.00
IndexLookUp_17 MergeJoin_7 root index:Selection_16, table:TableScan_15 1998.00
IndexScan_19 cop table:t2, index:c1, range:[<nil>,+inf], keep order:true 1985.00
TableScan_20 cop table:t2, keep order:false 1985.00
IndexLookUp_21 MergeJoin_7 root index:IndexScan_19, table:TableScan_20 1985.00
MergeJoin_7 Projection_6 IndexLookUp_17,IndexLookUp_21 root left outer join, left key:test.t1.c2, right key:test.t2.c1 2481.25
Projection_6 MergeJoin_7 root test.t1.c1, test.t1.c2, test.t1.c3, test.t2.c1, test.t2.c2 2481.25
id task operator info count
Projection_6 root test.t1.c1, test.t1.c2, test.t1.c3, test.t2.c1, test.t2.c2 2481.25
└─MergeJoin_7 root left outer join, left key:test.t1.c2, right key:test.t2.c1 2481.25
├─IndexLookUp_17 root index:Selection_16, table:TableScan_15 1998.00
│ ├─Selection_16 cop gt(test.t1.c1, 1) 1998.00
│ │ └─IndexScan_14 cop table:t1, index:c2, range:[<nil>,+inf], keep order:true 1999.00
│ └─TableScan_15 cop table:t1, keep order:false 1998.00
└─IndexLookUp_21 root index:IndexScan_19, table:TableScan_20 1985.00
├─IndexScan_19 cop table:t2, index:c1, range:[<nil>,+inf], keep order:true 1985.00
└─TableScan_20 cop table:t2, keep order:false 1985.00
explain update t1 set t1.c2 = 2 where t1.c1 = 1;
id parents children task operator info count
TableScan_4 cop table:t1, range:[1,1], keep order:false 1.00
TableReader_5 root data:TableScan_4 1.00
id task operator info count
TableReader_5 root data:TableScan_4 1.00
└─TableScan_4 cop table:t1, range:[1,1], keep order:false 1.00
explain delete from t1 where t1.c2 = 1;
id parents children task operator info count
IndexScan_7 cop table:t1, index:c2, range:[1,1], keep order:false 0.00
TableScan_8 cop table:t1, keep order:false 0.00
IndexLookUp_9 root index:IndexScan_7, table:TableScan_8 0.00
id task operator info count
IndexLookUp_9 root index:IndexScan_7, table:TableScan_8 0.00
├─IndexScan_7 cop table:t1, index:c2, range:[1,1], keep order:false 0.00
└─TableScan_8 cop table:t1, keep order:false 0.00
explain select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1;
id parents children task operator info count
TableScan_12 cop table:a, range:[-inf,+inf], keep order:false 1999.00
TableReader_13 IndexJoin_14 root data:TableScan_12 1999.00
TableScan_20 HashAgg_17 cop table:b, range:[-inf,+inf], keep order:false 1985.00
HashAgg_17 TableScan_20 cop group by:b.c2, funcs:count(b.c2), firstrow(b.c2) 1985.00
TableReader_22 HashAgg_21 root data:HashAgg_17 1985.00
HashAgg_21 IndexJoin_14 TableReader_22 root group by:col_2, funcs:count(col_0), firstrow(col_1) 1985.00
IndexJoin_14 Projection_11 TableReader_13,HashAgg_21 root inner join, inner:TableReader_13, outer key:b.c2, inner key:a.c1 1985.00
Projection_11 IndexJoin_14 root cast(join_agg_0) 1985.00
id task operator info count
Projection_11 root cast(join_agg_0) 1985.00
└─IndexJoin_14 root inner join, inner:TableReader_13, outer key:b.c2, inner key:a.c1 1985.00
├─TableReader_13 root data:TableScan_12 1999.00
│ └─TableScan_12 cop table:a, range:[-inf,+inf], keep order:false 1999.00
└─HashAgg_21 root group by:col_2, funcs:count(col_0), firstrow(col_1) 1985.00
└─TableReader_22 root data:HashAgg_17 1985.00
└─HashAgg_17 cop group by:b.c2, funcs:count(b.c2), firstrow(b.c2) 1985.00
└─TableScan_20 cop table:b, range:[-inf,+inf], keep order:false 1985.00
explain select * from t2 order by t2.c2 limit 0, 1;
id parents children task operator info count
TableScan_13 TopN_14 cop table:t2, range:[-inf,+inf], keep order:false 1985.00
TopN_14 TableScan_13 cop test.t2.c2:asc, offset:0, count:1 1.00
TableReader_15 TopN_7 root data:TopN_14 1.00
TopN_7 TableReader_15 root test.t2.c2:asc, offset:0, count:1 1.00
id task operator info count
TopN_7 root test.t2.c2:asc, offset:0, count:1 1.00
└─TableReader_15 root data:TopN_14 1.00
└─TopN_14 cop test.t2.c2:asc, offset:0, count:1 1.00
└─TableScan_13 cop table:t2, range:[-inf,+inf], keep order:false 1985.00
explain select * from t1 where c1 > 1 and c2 = 1 and c3 < 1;
id parents children task operator info count
IndexScan_8 Selection_10 cop table:t1, index:c2, range:[1,1], keep order:false 0.00
Selection_10 IndexScan_8 cop gt(test.t1.c1, 1) 0.00
TableScan_9 Selection_11 cop table:t1, keep order:false 0.00
Selection_11 TableScan_9 cop lt(test.t1.c3, 1) 0.00
IndexLookUp_12 root index:Selection_10, table:Selection_11 0.00
id task operator info count
IndexLookUp_12 root index:Selection_10, table:Selection_11 0.00
├─Selection_10 cop gt(test.t1.c1, 1) 0.00
│ └─IndexScan_8 cop table:t1, index:c2, range:[1,1], keep order:false 0.00
└─Selection_11 cop lt(test.t1.c3, 1) 0.00
└─TableScan_9 cop table:t1, keep order:false 0.00
explain select * from t1 where c1 = 1 and c2 > 1;
id parents children task operator info count
TableScan_5 Selection_6 cop table:t1, range:[1,1], keep order:false 1.00
Selection_6 TableScan_5 cop gt(test.t1.c2, 1) 0.50
TableReader_7 root data:Selection_6 0.50
id task operator info count
TableReader_7 root data:Selection_6 0.50
└─Selection_6 cop gt(test.t1.c2, 1) 0.50
└─TableScan_5 cop table:t1, range:[1,1], keep order:false 1.00
explain select c1 from t1 where c1 in (select c2 from t2);
id parents children task operator info count
TableDual_11 Projection_10 root rows:0 0.00
Projection_10 TableDual_11 root test.t1.c1 0.00
id task operator info count
Projection_10 root test.t1.c1 0.00
└─TableDual_11 root rows:0 0.00
explain select * from information_schema.columns;
id parents children task operator info count
MemTableScan_4 root 10000.00
id task operator info count
MemTableScan_4 root 10000.00
explain select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1;
id parents children task operator info count
TableScan_15 cop table:t1, range:[-inf,+inf], keep order:false 1999.00
TableReader_16 Apply_14 root data:TableScan_15 1999.00
IndexScan_32 Selection_34 cop table:t2, index:c1, range:[<nil>,+inf], keep order:true 1.25
Selection_34 Limit_35 IndexScan_32 cop eq(test.t1.c1, test.t2.c1) 1.00
Limit_35 Selection_34 cop offset:0, count:1 1.00
TableScan_33 cop table:t2, keep order:false 1.00
IndexLookUp_36 Limit_21 root index:Limit_35, table:TableScan_33 1.00
Limit_21 Apply_14 IndexLookUp_36 root offset:0, count:1 1.00
Apply_14 Projection_12 TableReader_16,Limit_21 root left outer join, inner:Limit_21 1999.00
Projection_12 Apply_14 root eq(test.t1.c2, test.t2.c2) 1999.00
id task operator info count
Projection_12 root eq(test.t1.c2, test.t2.c2) 1999.00
└─Apply_14 root left outer join, inner:Limit_21 1999.00
├─TableReader_16 root data:TableScan_15 1999.00
│ └─TableScan_15 cop table:t1, range:[-inf,+inf], keep order:false 1999.00
└─Limit_21 root offset:0, count:1 1.00
└─IndexLookUp_36 root index:Limit_35, table:TableScan_33 1.00
├─Limit_35 cop offset:0, count:1 1.00
│ └─Selection_34 cop eq(test.t1.c1, test.t2.c1) 1.00
│ └─IndexScan_32 cop table:t2, index:c1, range:[<nil>,+inf], keep order:true 1.25
└─TableScan_33 cop table:t2, keep order:false 1.00
explain select * from t1 order by c1 desc limit 1;
id parents children task operator info count
TableScan_18 Limit_20 cop table:t1, range:[-inf,+inf], keep order:true, desc 1.00
Limit_20 TableScan_18 cop offset:0, count:1 1.00
TableReader_21 Limit_10 root data:Limit_20 1.00
Limit_10 TableReader_21 root offset:0, count:1 1.00
id task operator info count
Limit_10 root offset:0, count:1 1.00
└─TableReader_21 root data:Limit_20 1.00
└─Limit_20 cop offset:0, count:1 1.00
└─TableScan_18 cop table:t1, range:[-inf,+inf], keep order:true, desc 1.00
set @@session.tidb_opt_insubquery_unfold = 0;
explain select 1 in (select c2 from t2) from t1;
id parents children task operator info count
TableScan_8 cop table:t1, range:[-inf,+inf], keep order:false 1999.00
TableReader_9 HashLeftJoin_7 root data:TableScan_8 1999.00
TableScan_10 Selection_11 cop table:t2, range:[-inf,+inf], keep order:false 1985.00
Selection_11 TableScan_10 cop eq(1, test.t2.c2) 0.00
TableReader_12 HashLeftJoin_7 root data:Selection_11 0.00
HashLeftJoin_7 Projection_6 TableReader_9,TableReader_12 root left outer semi join, inner:TableReader_12 1999.00
Projection_6 HashLeftJoin_7 root 5_aux_0 1999.00
id task operator info count
Projection_6 root 5_aux_0 1999.00
└─HashLeftJoin_7 root left outer semi join, inner:TableReader_12 1999.00
├─TableReader_9 root data:TableScan_8 1999.00
│ └─TableScan_8 cop table:t1, range:[-inf,+inf], keep order:false 1999.00
└─TableReader_12 root data:Selection_11 0.00
└─Selection_11 cop eq(1, test.t2.c2) 0.00
└─TableScan_10 cop table:t2, range:[-inf,+inf], keep order:false 1985.00
explain format="dot" select 1 in (select c2 from t2) from t1;
dot contents

Expand Down
34 changes: 17 additions & 17 deletions cmd/explaintest/r/topn_push_down.result
Original file line number Diff line number Diff line change
Expand Up @@ -166,20 +166,20 @@ tr.trade_type IN (1) AND
te.expect_time BETWEEN '2018-04-23 00:00:00.0' AND '2018-04-23 23:59:59.0'
ORDER BY te.expect_time asc
LIMIT 0, 5;
id parents children task operator info count
IndexScan_100 Selection_102 cop table:tr, index:shop_identy, trade_status, business_type, trade_pay_status, trade_type, delivery_type, source, biz_date, range:[810094178,810094178], keep order:false 10.00
Selection_102 IndexScan_100 cop eq(tr.business_type, 18), in(tr.trade_type, 1) 0.00
TableScan_101 Selection_103 cop table:tr, keep order:false 0.00
Selection_103 TableScan_101 cop eq(tr.brand_identy, 32314), eq(tr.domain_type, 2) 0.00
IndexLookUp_104 IndexJoin_34 root index:Selection_102, table:Selection_103 0.00
IndexScan_30 cop table:te, index:trade_id, range:[<nil>,+inf], keep order:false 10000.00
TableScan_31 Selection_32 cop table:te, keep order:false 10000.00
Selection_32 TableScan_31 cop ge(te.expect_time, 2018-04-23 00:00:00.000000), le(te.expect_time, 2018-04-23 23:59:59.000000) 250.00
IndexLookUp_33 IndexJoin_34 root index:IndexScan_30, table:Selection_32 250.00
IndexJoin_34 TopN_139 IndexLookUp_104,IndexLookUp_33 root inner join, inner:IndexLookUp_33, outer key:tr.id, inner key:te.trade_id 0.00
TopN_139 IndexJoin_136 IndexJoin_34 root te.expect_time:asc, offset:0, count:5 0.00
IndexScan_134 cop table:p, index:relate_id, range:[<nil>,+inf], keep order:false 10000.00
IndexReader_135 IndexJoin_136 root index:IndexScan_134 10000.00
IndexJoin_136 Limit_18 TopN_139,IndexReader_135 root left outer join, inner:IndexReader_135, outer key:tr.id, inner key:p.relate_id 0.00
Limit_18 Projection_12 IndexJoin_136 root offset:0, count:5 0.00
Projection_12 Limit_18 root te.expect_time 0.00
id task operator info count
Projection_12 root te.expect_time 0.00
└─Limit_18 root offset:0, count:5 0.00
└─IndexJoin_136 root left outer join, inner:IndexReader_135, outer key:tr.id, inner key:p.relate_id 0.00
├─TopN_139 root te.expect_time:asc, offset:0, count:5 0.00
│ └─IndexJoin_34 root inner join, inner:IndexLookUp_33, outer key:tr.id, inner key:te.trade_id 0.00
│ ├─IndexLookUp_104 root index:Selection_102, table:Selection_103 0.00
│ │ ├─Selection_102 cop eq(tr.business_type, 18), in(tr.trade_type, 1) 0.00
│ │ │ └─IndexScan_100 cop table:tr, index:shop_identy, trade_status, business_type, trade_pay_status, trade_type, delivery_type, source, biz_date, range:[810094178,810094178], keep order:false 10.00
│ │ └─Selection_103 cop eq(tr.brand_identy, 32314), eq(tr.domain_type, 2) 0.00
│ │ └─TableScan_101 cop table:tr, keep order:false 0.00
│ └─IndexLookUp_33 root index:IndexScan_30, table:Selection_32 250.00
│ ├─IndexScan_30 cop table:te, index:trade_id, range:[<nil>,+inf], keep order:false 10000.00
│ └─Selection_32 cop ge(te.expect_time, 2018-04-23 00:00:00.000000), le(te.expect_time, 2018-04-23 23:59:59.000000) 250.00
│ └─TableScan_31 cop table:te, keep order:false 10000.00
└─IndexReader_135 root index:IndexScan_134 10000.00
└─IndexScan_134 cop table:p, index:relate_id, range:[<nil>,+inf], keep order:false 10000.00
10 changes: 5 additions & 5 deletions executor/join_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -853,11 +853,11 @@ func (s *testSuite) TestMergejoinOrder(c *C) {
tk.MustExec("insert into t2 select a*100, b*100 from t1;")

tk.MustQuery("explain select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a;").Check(testkit.Rows(
"TableScan_10 cop table:t1, range:[-inf,+inf], keep order:true 10000.00",
"TableReader_11 MergeJoin_15 root data:TableScan_10 10000.00",
"TableScan_12 cop table:t2, range:[-inf,+inf], keep order:true 10000.00",
"TableReader_13 MergeJoin_15 root data:TableScan_12 10000.00",
"MergeJoin_15 TableReader_11,TableReader_13 root left outer join, left key:test.t1.a, right key:test.t2.a, left cond:[ne(test.t1.a, 3)] 12500.00",
"MergeJoin_15 root left outer join, left key:test.t1.a, right key:test.t2.a, left cond:[ne(test.t1.a, 3)] 12500.00",
"├─TableReader_11 root data:TableScan_10 10000.00",
"│ └─TableScan_10 cop table:t1, range:[-inf,+inf], keep order:true 10000.00",
"└─TableReader_13 root data:TableScan_12 10000.00",
" └─TableScan_12 cop table:t2, range:[-inf,+inf], keep order:true 10000.00",
))

tk.MustExec("set @@tidb_max_chunk_size=1")
Expand Down
8 changes: 5 additions & 3 deletions expression/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2688,9 +2688,11 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) {
tk.MustExec("drop table if exists t;")
tk.MustExec("create table t(a date)")
result = tk.MustQuery("desc select a = a from t")
result.Check(testkit.Rows("TableScan_4 cop table:t, range:[-inf,+inf], keep order:false 10000.00",
"TableReader_5 Projection_3 root data:TableScan_4 10000.00",
"Projection_3 TableReader_5 root eq(test.t.a, test.t.a) 10000.00"))
result.Check(testkit.Rows(
"Projection_3 root eq(test.t.a, test.t.a) 10000.00",
"└─TableReader_5 root data:TableScan_4 10000.00",
" └─TableScan_4 cop table:t, range:[-inf,+inf], keep order:false 10000.00",
))

// for interval
result = tk.MustQuery(`select interval(null, 1, 2), interval(1, 2, 3), interval(2, 1, 3)`)
Expand Down
Loading

0 comments on commit a7819c3

Please sign in to comment.