Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

*: Refine Explain's format. #15507

Merged
merged 57 commits into from
Mar 23, 2020
Merged
Show file tree
Hide file tree
Changes from 56 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
f4012e3
Merge pull request #1 from pingcap/master
LittleFall Feb 19, 2020
d3156f1
Merge pull request #2 from pingcap/master
LittleFall Feb 20, 2020
6de0def
Merge pull request #3 from pingcap/master
LittleFall Feb 24, 2020
60b828f
Merge pull request #4 from pingcap/master
LittleFall Feb 25, 2020
72030d9
Merge pull request #5 from pingcap/master
LittleFall Feb 25, 2020
c380cee
Merge pull request #6 from pingcap/master
LittleFall Feb 26, 2020
7fe6127
Merge pull request #7 from pingcap/master
LittleFall Feb 26, 2020
def8669
Merge pull request #8 from pingcap/master
LittleFall Feb 27, 2020
2c20a5e
Merge pull request #9 from pingcap/master
LittleFall Mar 2, 2020
ff0b9d9
Merge pull request #10 from pingcap/master
LittleFall Mar 3, 2020
809fcce
Add needed column and reorder them.
LittleFall Mar 4, 2020
e604737
Add column `estCost` for explain result.
LittleFall Mar 9, 2020
8abde33
Accurate `estCost` to 0.01.
LittleFall Mar 9, 2020
11967ec
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 9, 2020
f0d152e
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 10, 2020
17e1d20
Add `accessObject` value.
LittleFall Mar 10, 2020
0530889
Add comment for AccessObejctInfo.
LittleFall Mar 10, 2020
7a39099
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 10, 2020
11374ad
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 11, 2020
2ac3d2d
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 12, 2020
f1d052d
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 16, 2020
886f9f6
Fix bug: `execution info` should be front of `operator info`.
LittleFall Mar 16, 2020
b4fa556
Remove `estCost`.
LittleFall Mar 16, 2020
91ad109
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 16, 2020
ec93d8d
Change explain title in `explaintest`.
LittleFall Mar 17, 2020
0a3b74e
Middle save.(Fix to explain_easy)
LittleFall Mar 17, 2020
fd4396d
Middle save.(Fix to explain_join_stats)
LittleFall Mar 17, 2020
4ec1d2f
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 17, 2020
b04a7c8
Update test files;
LittleFall Mar 19, 2020
3702841
Fix bug.
LittleFall Mar 19, 2020
72869dd
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 19, 2020
e929bab
Show build and probe suffix for index merge operator.
LittleFall Mar 19, 2020
07786ef
Add accessObject of `MemTableScan`.
LittleFall Mar 19, 2020
b7f4f9c
show index name in explain result.
LittleFall Mar 19, 2020
49ad017
Update explaintest.
LittleFall Mar 19, 2020
60ea03f
Update global test files.
LittleFall Mar 19, 2020
6e61465
Remove `_0` in explain result.
LittleFall Mar 20, 2020
f31d38a
Unify `HashLeftJoin` and `HashRightJoin` to `HashJoin`.
LittleFall Mar 20, 2020
32104f6
Update test files.
LittleFall Mar 20, 2020
67c432c
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 20, 2020
44edbb1
Update test files after merge.
LittleFall Mar 20, 2020
2ab62f7
Update test files after merge.
LittleFall Mar 20, 2020
d3827d6
Merge branch 'master' into explain-last
zz-jason Mar 20, 2020
ab4e3e5
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 23, 2020
d69ca8d
fix merge bug.
LittleFall Mar 23, 2020
1190876
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 23, 2020
a305254
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 23, 2020
355dae1
Fix test file bug.
LittleFall Mar 23, 2020
949ad8e
add some random thing to test
LittleFall Mar 23, 2020
4795494
remove random test things.
LittleFall Mar 23, 2020
84c97f2
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 23, 2020
8b29cc3
Merge branch 'master' into explain-last
LittleFall Mar 23, 2020
5a0d808
Merge branch 'master' into explain-last
LittleFall Mar 23, 2020
f53b4d5
Merge remote-tracking branch 'pingcap/master' into explain-last
LittleFall Mar 23, 2020
6a9bf17
Merge remote-tracking branch 'qizhi/explain-last' into explain-last
LittleFall Mar 23, 2020
89d6316
Merge branch 'master' into explain-last
LittleFall Mar 23, 2020
35ec1dd
Merge branch 'master' into explain-last
LittleFall Mar 23, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions bindinfo/bind_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ func (s *testSuite) TestGlobalAndSessionBindingBothExist(c *C) {
tk.MustExec("drop table if exists t2")
tk.MustExec("create table t1(id int)")
tk.MustExec("create table t2(id int)")
c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashLeftJoin"), IsTrue)
c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashJoin"), IsTrue)
c.Assert(tk.HasPlan("SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id", "MergeJoin"), IsTrue)

tk.MustExec("create global binding for SELECT * from t1,t2 where t1.id = t2.id using SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id")
Expand All @@ -345,11 +345,11 @@ func (s *testSuite) TestGlobalAndSessionBindingBothExist(c *C) {
metrics.BindUsageCounter.WithLabelValues(metrics.ScopeGlobal).Write(pb)
c.Assert(pb.GetCounter().GetValue(), Equals, float64(1))
tk.MustExec("set @@tidb_use_plan_baselines = 0")
c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashLeftJoin"), IsTrue)
c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashJoin"), IsTrue)

tk.MustExec("drop global binding for SELECT * from t1,t2 where t1.id = t2.id")
tk.MustExec("set @@tidb_use_plan_baselines = 1")
c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashLeftJoin"), IsTrue)
c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashJoin"), IsTrue)
}

func (s *testSuite) TestExplain(c *C) {
Expand All @@ -361,7 +361,7 @@ func (s *testSuite) TestExplain(c *C) {
tk.MustExec("create table t1(id int)")
tk.MustExec("create table t2(id int)")

c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashLeftJoin"), IsTrue)
c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashJoin"), IsTrue)
c.Assert(tk.HasPlan("SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id", "MergeJoin"), IsTrue)

tk.MustExec("create global binding for SELECT * from t1,t2 where t1.id = t2.id using SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id")
Expand All @@ -383,14 +383,14 @@ func (s *testSuite) TestBindingSymbolList(c *C) {
// before binding
tk.MustQuery("select a, b from t where a = 3 limit 1, 100")
c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:ia")
c.Assert(tk.MustUseIndex("select a, b from t where a = 3 limit 1, 100", "a"), IsTrue)
c.Assert(tk.MustUseIndex("select a, b from t where a = 3 limit 1, 100", "ia(a)"), IsTrue)

tk.MustExec(`create global binding for select a, b from t where a = 1 limit 0, 1 using select a, b from t use index (ib) where a = 1 limit 0, 1`)

// after binding
tk.MustQuery("select a, b from t where a = 3 limit 1, 100")
c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:ib")
c.Assert(tk.MustUseIndex("select a, b from t where a = 3 limit 1, 100", "b"), IsTrue)
c.Assert(tk.MustUseIndex("select a, b from t where a = 3 limit 1, 100", "ib(b)"), IsTrue)

// Normalize
sql, hash := parser.NormalizeDigest("select a, b from t where a = 1 limit 0, 1")
Expand Down
60 changes: 30 additions & 30 deletions cmd/explaintest/r/access_path_selection.result
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,39 @@ KEY `IDX_b` (`b`),
KEY `IDX_ab` (`a`, `b`)
);
explain select a from access_path_selection where a < 3;
id estRows task operator info
IndexReader_6 3323.33 root index:IndexRangeScan_5
└─IndexRangeScan_5 3323.33 cop[tikv] table:access_path_selection, index:a, range:[-inf,3), keep order:false, stats:pseudo
id estRows task access object operator info
IndexReader_6 3323.33 root index:IndexRangeScan_5
└─IndexRangeScan_5 3323.33 cop[tikv] table:access_path_selection, index:IDX_a(a) range:[-inf,3), keep order:false, stats:pseudo
explain select a, b from access_path_selection where a < 3;
id estRows task operator info
IndexReader_6 3323.33 root index:IndexRangeScan_5
└─IndexRangeScan_5 3323.33 cop[tikv] table:access_path_selection, index:a, b, range:[-inf,3), keep order:false, stats:pseudo
id estRows task access object operator info
IndexReader_6 3323.33 root index:IndexRangeScan_5
└─IndexRangeScan_5 3323.33 cop[tikv] table:access_path_selection, index:IDX_ab(a, b) range:[-inf,3), keep order:false, stats:pseudo
explain select a, b from access_path_selection where b < 3;
id estRows task operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.access_path_selection.b, 3)
└─TableFullScan_5 10000.00 cop[tikv] table:access_path_selection, keep order:false, stats:pseudo
id estRows task access object operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.access_path_selection.b, 3)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why there is a redundant tab`?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because their access object is empty.
I think write nothing instead of "N/A" can make table a liitle cleaner. Because there are so much empty in AccessObject.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

got it.

└─TableFullScan_5 10000.00 cop[tikv] table:access_path_selection keep order:false, stats:pseudo
explain select a, b from access_path_selection where a < 3 and b < 3;
id estRows task operator info
IndexReader_11 1104.45 root index:Selection_10
└─Selection_10 1104.45 cop[tikv] lt(test.access_path_selection.b, 3)
└─IndexRangeScan_9 3323.33 cop[tikv] table:access_path_selection, index:a, b, range:[-inf,3), keep order:false, stats:pseudo
id estRows task access object operator info
IndexReader_11 1104.45 root index:Selection_10
└─Selection_10 1104.45 cop[tikv] lt(test.access_path_selection.b, 3)
└─IndexRangeScan_9 3323.33 cop[tikv] table:access_path_selection, index:IDX_ab(a, b) range:[-inf,3), keep order:false, stats:pseudo
explain select a, b from access_path_selection where a > 10 order by _tidb_rowid;
id estRows task operator info
Projection_6 3333.33 root test.access_path_selection.a, test.access_path_selection.b
└─TableReader_13 3333.33 root data:Selection_12
└─Selection_12 3333.33 cop[tikv] gt(test.access_path_selection.a, 10)
└─TableFullScan_11 10000.00 cop[tikv] table:access_path_selection, keep order:true, stats:pseudo
id estRows task access object operator info
Projection_6 3333.33 root test.access_path_selection.a, test.access_path_selection.b
└─TableReader_13 3333.33 root data:Selection_12
└─Selection_12 3333.33 cop[tikv] gt(test.access_path_selection.a, 10)
└─TableFullScan_11 10000.00 cop[tikv] table:access_path_selection keep order:true, stats:pseudo
explain select max(_tidb_rowid) from access_path_selection;
id estRows task operator info
StreamAgg_13 1.00 root funcs:max(test.access_path_selection._tidb_rowid)->Column#4
└─Limit_17 1.00 root offset:0, count:1
└─TableReader_27 1.00 root data:Limit_26
└─Limit_26 1.00 cop[tikv] offset:0, count:1
└─TableFullScan_25 1.25 cop[tikv] table:access_path_selection, keep order:true, desc, stats:pseudo
id estRows task access object operator info
StreamAgg_13 1.00 root funcs:max(test.access_path_selection._tidb_rowid)->Column#4
└─Limit_17 1.00 root offset:0, count:1
└─TableReader_27 1.00 root data:Limit_26
└─Limit_26 1.00 cop[tikv] offset:0, count:1
└─TableFullScan_25 1.25 cop[tikv] table:access_path_selection keep order:true, desc, stats:pseudo
explain select count(1) from access_path_selection;
id estRows task operator info
StreamAgg_28 1.00 root funcs:count(Column#18)->Column#4
└─TableReader_29 1.00 root data:StreamAgg_8
└─StreamAgg_8 1.00 cop[tikv] funcs:count(1)->Column#18
└─TableFullScan_24 10000.00 cop[tikv] table:access_path_selection, keep order:false, stats:pseudo
id estRows task access object operator info
StreamAgg_28 1.00 root funcs:count(Column#18)->Column#4
└─TableReader_29 1.00 root data:StreamAgg_8
└─StreamAgg_8 1.00 cop[tikv] funcs:count(1)->Column#18
└─TableFullScan_24 10000.00 cop[tikv] table:access_path_selection keep order:false, stats:pseudo
56 changes: 28 additions & 28 deletions cmd/explaintest/r/black_list.result
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,55 @@ use test;
drop table if exists t;
create table t (a int);
explain select * from t where a < 1;
id estRows task operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
insert into mysql.opt_rule_blacklist values('predicate_push_down');
admin reload opt_rule_blacklist;

explain select * from t where a < 1;
id estRows task operator info
Selection_5 8000.00 root lt(test.t.a, 1)
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
Selection_5 8000.00 root lt(test.t.a, 1)
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
delete from mysql.opt_rule_blacklist where name='predicate_push_down';
admin reload opt_rule_blacklist;

explain select * from t where a < 1;
id estRows task operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
insert into mysql.expr_pushdown_blacklist values('<');
admin reload expr_pushdown_blacklist;

explain select * from t where a < 1;
id estRows task operator info
Selection_5 8000.00 root lt(test.t.a, 1)
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
Selection_5 8000.00 root lt(test.t.a, 1)
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
delete from mysql.expr_pushdown_blacklist where name='<';
admin reload expr_pushdown_blacklist;

explain select * from t where a < 1;
id estRows task operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
insert into mysql.expr_pushdown_blacklist values('lt');
admin reload expr_pushdown_blacklist;

explain select * from t where a < 1;
id estRows task operator info
Selection_5 8000.00 root lt(test.t.a, 1)
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
Selection_5 8000.00 root lt(test.t.a, 1)
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
delete from mysql.expr_pushdown_blacklist where name='lt';
admin reload expr_pushdown_blacklist;

explain select * from t where a < 1;
id estRows task operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
TableReader_7 3323.33 root data:Selection_6
└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1)
└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
42 changes: 21 additions & 21 deletions cmd/explaintest/r/explain-non-select-stmt.result
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,28 @@ use test;
drop table if exists t;
create table t(a bigint, b bigint);
explain insert into t values(1, 1);
id estRows task operator info
Insert_1 N/A root N/A
id estRows task access object operator info
Insert_1 N/A root N/A
explain insert into t select * from t;
id estRows task operator info
Insert_1 N/A root N/A
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
Insert_1 N/A root N/A
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
explain delete from t where a > 100;
id estRows task operator info
Delete_4 N/A root N/A
└─TableReader_8 3333.33 root data:Selection_7
└─Selection_7 3333.33 cop[tikv] gt(test.t.a, 100)
└─TableFullScan_6 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
Delete_4 N/A root N/A
└─TableReader_8 3333.33 root data:Selection_7
└─Selection_7 3333.33 cop[tikv] gt(test.t.a, 100)
└─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
explain update t set b = 100 where a = 200;
id estRows task operator info
Update_4 N/A root N/A
└─TableReader_8 10.00 root data:Selection_7
└─Selection_7 10.00 cop[tikv] eq(test.t.a, 200)
└─TableFullScan_6 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
Update_4 N/A root N/A
└─TableReader_8 10.00 root data:Selection_7
└─Selection_7 10.00 cop[tikv] eq(test.t.a, 200)
└─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
explain replace into t select a, 100 from t;
id estRows task operator info
Insert_1 N/A root N/A
└─Projection_5 10000.00 root test.t.a, 100->Column#6
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t, keep order:false, stats:pseudo
id estRows task access object operator info
Insert_1 N/A root N/A
└─Projection_5 10000.00 root test.t.a, 100->Column#6
└─TableReader_7 10000.00 root data:TableFullScan_6
└─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo
20 changes: 10 additions & 10 deletions cmd/explaintest/r/explain.result
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,15 @@ create table t(id int primary key, a int, b int);
set session tidb_hashagg_partial_concurrency = 1;
set session tidb_hashagg_final_concurrency = 1;
explain select group_concat(a) from t group by id;
id estRows task operator info
StreamAgg_8 8000.00 root group by:Column#6, funcs:group_concat(Column#5, ",")->Column#4
└─Projection_18 10000.00 root cast(test.t.a, var_string(20))->Column#5, test.t.id
└─TableReader_15 10000.00 root data:TableFullScan_14
└─TableFullScan_14 10000.00 cop[tikv] table:t, keep order:true, stats:pseudo
id estRows task access object operator info
StreamAgg_8 8000.00 root group by:Column#6, funcs:group_concat(Column#5, ",")->Column#4
└─Projection_18 10000.00 root cast(test.t.a, var_string(20))->Column#5, test.t.id
└─TableReader_15 10000.00 root data:TableFullScan_14
└─TableFullScan_14 10000.00 cop[tikv] table:t keep order:true, stats:pseudo
explain select group_concat(a, b) from t group by id;
id estRows task operator info
StreamAgg_8 8000.00 root group by:Column#7, funcs:group_concat(Column#5, Column#6, ",")->Column#4
└─Projection_18 10000.00 root cast(test.t.a, var_string(20))->Column#5, cast(test.t.b, var_string(20))->Column#6, test.t.id
└─TableReader_15 10000.00 root data:TableFullScan_14
└─TableFullScan_14 10000.00 cop[tikv] table:t, keep order:true, stats:pseudo
id estRows task access object operator info
StreamAgg_8 8000.00 root group by:Column#7, funcs:group_concat(Column#5, Column#6, ",")->Column#4
└─Projection_18 10000.00 root cast(test.t.a, var_string(20))->Column#5, cast(test.t.b, var_string(20))->Column#6, test.t.id
└─TableReader_15 10000.00 root data:TableFullScan_14
└─TableFullScan_14 10000.00 cop[tikv] table:t keep order:true, stats:pseudo
drop table t;
Loading