You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

128 lines
6.7 KiB

drop table if exists t;
create table t (a int primary key, b int, c int, d int, e int, f int);
create index tb on t (b);
create index tc on t (c);
create index td on t (d);
load stats 's/explain_indexmerge_stats_t.json';
explain select * from t where a < 50 or b < 50;
id estRows task access object operator info
TableReader_7 4000000.00 root data:Selection_6
└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.a, 50), lt(test.t.b, 50))
└─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false
explain select * from t where (a < 50 or b < 50) and f > 100;
id estRows task access object operator info
TableReader_7 4000000.00 root data:Selection_6
└─Selection_6 4000000.00 cop[tikv] gt(test.t.f, 100), or(lt(test.t.a, 50), lt(test.t.b, 50))
└─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false
explain select * from t where b < 50 or c < 50;
id estRows task access object operator info
TableReader_7 4000000.00 root data:Selection_6
└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 50))
└─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false
set session tidb_enable_index_merge = on;
explain select * from t where a < 50 or b < 50;
id estRows task access object operator info
IndexMerge_11 98.00 root
├─TableRangeScan_8(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false
├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false
└─TableRowIDScan_10(Probe) 98.00 cop[tikv] table:t keep order:false
explain select * from t where (a < 50 or b < 50) and f > 100;
id estRows task access object operator info
IndexMerge_12 98.00 root
├─TableRangeScan_8(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false
├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false
└─Selection_11(Probe) 98.00 cop[tikv] gt(test.t.f, 100)
└─TableRowIDScan_10 98.00 cop[tikv] table:t keep order:false
explain select * from t where a < 50 or b < 5000000;
id estRows task access object operator info
TableReader_7 4000000.00 root data:Selection_6
└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.a, 50), lt(test.t.b, 5000000))
└─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false
explain select * from t where b < 50 or c < 50;
id estRows task access object operator info
IndexMerge_11 98.00 root
├─IndexRangeScan_8(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false
├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false
└─TableRowIDScan_10(Probe) 98.00 cop[tikv] table:t keep order:false
explain select * from t where b < 50 or c < 5000000;
id estRows task access object operator info
TableReader_7 4000000.00 root data:Selection_6
└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000))
└─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false
explain select * from t where a < 50 or b < 50 or c < 50;
id estRows task access object operator info
IndexMerge_12 147.00 root
├─TableRangeScan_8(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false
├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false
├─IndexRangeScan_10(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false
└─TableRowIDScan_11(Probe) 147.00 cop[tikv] table:t keep order:false
explain select * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10;
id estRows task access object operator info
IndexMerge_17 0.00 root
├─TableRangeScan_13(Build) 9.00 cop[tikv] table:t range:[-inf,10), keep order:false
├─IndexRangeScan_14(Build) 9.00 cop[tikv] table:t, index:td(d) range:[-inf,10), keep order:false
└─Selection_16(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.b, 10000), lt(test.t.c, 10000))
└─TableRowIDScan_15 18.00 cop[tikv] table:t keep order:false
explain format="dot" select * from t where (a < 50 or b < 50) and f > 100;
dot contents
digraph IndexMerge_12 {
subgraph cluster12{
node [style=filled, color=lightgrey]
color=black
label = "root"
"IndexMerge_12"
}
subgraph cluster8{
node [style=filled, color=lightgrey]
color=black
label = "cop"
"TableRangeScan_8"
}
subgraph cluster9{
node [style=filled, color=lightgrey]
color=black
label = "cop"
"IndexRangeScan_9"
}
subgraph cluster11{
node [style=filled, color=lightgrey]
color=black
label = "cop"
"Selection_11" -> "TableRowIDScan_10"
}
"IndexMerge_12" -> "TableRangeScan_8"
"IndexMerge_12" -> "IndexRangeScan_9"
"IndexMerge_12" -> "Selection_11"
}
set session tidb_enable_index_merge = off;
explain select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000;
id estRows task access object operator info
IndexMerge_8 5000000.00 root
├─IndexRangeScan_5(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false
├─IndexRangeScan_6(Build) 4999999.00 cop[tikv] table:t, index:tc(c) range:[-inf,5000000), keep order:false
└─TableRowIDScan_7(Probe) 5000000.00 cop[tikv] table:t keep order:false
explain select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10;
id estRows task access object operator info
IndexMerge_9 0.00 root
├─IndexRangeScan_5(Build) 9999.00 cop[tikv] table:t, index:tb(b) range:[-inf,10000), keep order:false
├─IndexRangeScan_6(Build) 9999.00 cop[tikv] table:t, index:tc(c) range:[-inf,10000), keep order:false
└─Selection_8(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.a, 10), lt(test.t.d, 10))
└─TableRowIDScan_7 19998.00 cop[tikv] table:t keep order:false
explain select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000;
id estRows task access object operator info
TableReader_7 4000000.00 root data:Selection_6
└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000))
└─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false
explain select /*+ no_index_merge(), use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000;
id estRows task access object operator info
TableReader_7 4000000.00 root data:Selection_6
└─Selection_6 4000000.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000))
└─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false
explain select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000;
id estRows task access object operator info
IndexMerge_8 5000000.00 root
├─TableRangeScan_5(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false
├─IndexRangeScan_6(Build) 4999999.00 cop[tikv] table:t, index:tb(b) range:[-inf,5000000), keep order:false
└─TableRowIDScan_7(Probe) 5000000.00 cop[tikv] table:t keep order:false