|
| 1 | +--source include/have_innodb.inc |
| 2 | + |
| 3 | +CREATE TABLE t1 (f1 INT, f2 INT, f3 CHAR(1), f4 CHAR(1), f5 CHAR(1), f6 CHAR(1), f7 CHAR(1), |
| 4 | +PRIMARY KEY (f5, f1), KEY (f2), KEY (f3), KEY (f4), KEY(f7) ) ENGINE=INNODB; |
| 5 | +INSERT INTO t1 VALUES (1, 1, 'a', 'h', 'i', '', ''), (2, 3, 'a', 'h', 'i', '', ''), |
| 6 | + (3, 2, 'b', '', 'j', '', ''), (4, 2, 'b', '', 'j', '', ''); |
| 7 | +INSERT INTO t1 VALUES (5, 1, 'a', 'h', 'i', '', ''), (6, 3, 'a', 'h', 'i', '', ''), |
| 8 | + (7, 2, 'b', '', 'j', '', ''), (8, 2, 'b', '', 'j', '', ''); |
| 9 | +INSERT INTO t1 SELECT f1 + 8, f2, f3, f4, f5, f6, f7 FROM t1; |
| 10 | +INSERT INTO t1 SELECT f1 + 16, f2, f3, f4, f5, f6, f7 FROM t1; |
| 11 | +INSERT INTO t1 VALUES (33, 3, 'c', 'g', '', '', ''), (34, 4, 'c', 'g', '', '', ''), |
| 12 | + (35, 5, 'd', 'f', '', '', ''), (36, 6, 'd', 'f', '', '', ''); |
| 13 | +INSERT INTO t1 SELECT f1 + 36, f2, f3, f4, f5, f6, f7 FROM t1; |
| 14 | +INSERT INTO t1 SELECT f1 + 72, f2, f3, f4, f5, f6, f7 FROM t1; |
| 15 | +INSERT INTO t1 SELECT f1 + 144, f2, f3, f4, f5, f6, f7 FROM t1; |
| 16 | +ANALYZE TABLE t1; |
| 17 | + |
| 18 | +--echo # Index merge intersection without hints. |
| 19 | +EXPLAIN SELECT COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2; |
| 20 | +EXPLAIN SELECT COUNT(*) FROM t1 WHERE f4 = 'h' AND f3 = 'b'; |
| 21 | +EXPLAIN SELECT COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 22 | +--echo # Index merge sort union without hints. |
| 23 | +EXPLAIN SELECT * FROM t1 WHERE f2 BETWEEN 5 AND 6 OR f3 = 'c' OR f4 = 'f'; |
| 24 | +EXPLAIN SELECT * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 25 | +--echo # Index merge union without hints. |
| 26 | +EXPLAIN SELECT f1 FROM t1 WHERE f2 = 5 OR f3 = 'c' OR f4 = 'f'; |
| 27 | + |
| 28 | +--echo # Index merge intersection |
| 29 | +--echo # Turn off automatic use of index merge intersection, so that we get to |
| 30 | +--echo # test that the hints below are effective. |
| 31 | +SET optimizer_switch='index_merge_intersection=off'; |
| 32 | +--echo # intersect(f2,f4), since only indexes specified in the hint are applicable for index merge. |
| 33 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f4, f2) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2; |
| 34 | +--echo # intersect(f2,f3,f4), since only indexes specified in the hint are applicable for index merge. |
| 35 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f4, f3) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 36 | +--echo # intersect(f3,f4), since only indexes specified in the hint are applicable for index merge. |
| 37 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f4, f3) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 38 | + |
| 39 | +--echo # Index merge with clustered key |
| 40 | +--echo # intersect(f3,f4), since 'f4, f3' indexes are specified in the hints and |
| 41 | +--echo # there is no condition for index 'f2'. |
| 42 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f4, f3) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f3 = 'b' AND f5 = 'i'; |
| 43 | +--echo # intersect(f3,f4), since it's covering index merge and PRIMARY index is ignored in this case. |
| 44 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 PRIMARY, f4, f3) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f3 = 'b' AND f5 = 'i'; |
| 45 | + |
| 46 | +--echo # no index merge, since 'index_merge_intersection' optimizer switch is off. |
| 47 | +EXPLAIN SELECT count(*) FROM t1 WHERE f2 = 3 AND f5 > '' AND f3 = 'c'; |
| 48 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f3, PRIMARY) */ count(*) FROM t1 WHERE f2 = 3 AND f5 > '' AND f3 = 'c'; |
| 49 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, PRIMARY) */ count(*) FROM t1 WHERE f2 = 3 AND f5 > '' AND f3 = 'c'; |
| 50 | +--echo # Hint f5 is unknown, warn about it and use the remaining keys that apply. |
| 51 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f4, f5) */ f3 FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 52 | + |
| 53 | +--echo # intersect(f4,f2), since it's the cheapest intersection. |
| 54 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ COUNT(*) FROM t1 WHERE f4 = 'd' AND f2 = 2 AND f3 = 'b'; |
| 55 | +--echo # intersect(f2,f3,f4), since it's the cheapest index merge. |
| 56 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 57 | +--echo # intersect(f2,f3,f4,f7), since only indexes specified in the hint are applicable for index merge. |
| 58 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f3, f4, f7) */ COUNT(*) FROM t1 WHERE f4 = '' AND f2 = 2 AND f3 = 'b' AND f7 = ''; |
| 59 | +--echo # intersect(f4,f2), since it's the cheapest index merge. |
| 60 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ COUNT(*) FROM t1 WHERE f4 = 'd' AND f2 = 2 AND f3 = 'b' AND f7 = ''; |
| 61 | +--echo # intersect(f2,f3,f4), since it's the cheapest index merge. |
| 62 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ COUNT(*) FROM t1 WHERE f4 = '' AND f2 = 2 AND f3 = 'b' AND f7 = ''; |
| 63 | + |
| 64 | +SET optimizer_switch='index_merge=off'; |
| 65 | +--echo # no index merge, since 'index_merge' optimizer switch is off. |
| 66 | +EXPLAIN SELECT COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 67 | +--echo # intersect(f2, f3, f4), since only indexes specified in the hint are applicable for index merge. |
| 68 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f3, f4) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 69 | +SET optimizer_switch='index_merge=on'; |
| 70 | + |
| 71 | +--echo # No index merge intersection |
| 72 | +SET optimizer_switch='index_merge_intersection=on'; |
| 73 | +--echo # no index merge, since ref access by key 'f2' is the cheapest access method. |
| 74 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f4) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2; |
| 75 | +--echo # no index merge, since there is no applicable indexes for index merge due to NO_INDEX_MERGE(t1) hint. |
| 76 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 77 | +--echo # intersect(f4, f2), since it's the cheapest access method. |
| 78 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f3) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2; |
| 79 | +--echo # no index merge, since ref access by key 'f2' is the cheapest access method. |
| 80 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f4) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2 AND f3 = 'b'; |
| 81 | + |
| 82 | +--echo # NO_INDEX_MERGE with clustered key |
| 83 | +EXPLAIN SELECT count(*) FROM t1 WHERE f2 = 3 AND f5 > '' AND f3 = 'c'; |
| 84 | +--echo # no index merge, since range access by 'f3' keys is the cheapest access method. |
| 85 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 PRIMARY) */ count(*) FROM t1 WHERE f2 = 3 AND f5 > '' AND f3 = 'c'; |
| 86 | +--echo # no index merge, since ref access by 'f3' index is the cheapest access method. |
| 87 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f3) */ count(*) FROM t1 WHERE f2 = 3 AND f5 > '' AND f3 = 'c'; |
| 88 | + |
| 89 | +--echo # no index merge, since ref access by 'f3' index is the cheapest access method. |
| 90 | +EXPLAIN SELECT COUNT(*) FROM t1 WHERE f4 = 'x' AND f2 = 5 AND f3 = 'n'; |
| 91 | +--echo # intersect(f3,f4), since it's the cheapest intersection. |
| 92 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ COUNT(*) FROM t1 WHERE f4 = 'x' AND f2 = 5 AND f3 = 'n'; |
| 93 | +--echo # intersect(f4,f2), since only indexes specified in the hint are applicable for index merge. |
| 94 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f4, f2) */ COUNT(*) FROM t1 WHERE f4 = 'x' AND f2 = 5 AND f3 = 'n'; |
| 95 | +--echo # intersect(f3,f2), since only indexes specified in the hint are applicable for index merge. |
| 96 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f3, f2) */ COUNT(*) FROM t1 WHERE f4 = 'x' AND f2 = 5 AND f3 = 'n'; |
| 97 | +--echo # intersect(f4,f3), since only indexes specified in the hint are applicable for index merge. |
| 98 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f4, f3) */ COUNT(*) FROM t1 WHERE f4 = 'x' AND f2 = 5 AND f3 = 'n'; |
| 99 | + |
| 100 | +--echo # no intersection, since not-equal condition can not be used for intersection. |
| 101 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f4) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 > 2; |
| 102 | + |
| 103 | +--echo # Index merge union |
| 104 | +SET optimizer_switch='index_merge_union=off,index_merge=off'; |
| 105 | +--echo # union(f2,f3,f4), since only indexes specified in the hint are applicable for index merge. |
| 106 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f3, f4) */ f1 FROM t1 WHERE f2 = 5 OR f3 = 'c' OR f4 = 'f'; |
| 107 | +--echo # no union because hint does not apply to where clause. |
| 108 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f3) */ f1 FROM t1 WHERE f2 = 5 OR f3 = 'c' OR f4 = 'f'; |
| 109 | +--echo # union(f2,f3), since only indexes specified in the hint are applicable for index merge. |
| 110 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f3) */ f1 FROM t1 WHERE (f2 = 5 OR f3 = 'c') AND (f1 = 4 OR f4 = 'f'); |
| 111 | +--echo # union(PRIMARY,f4), since only indexes specified in the hint are applicable for index merge. |
| 112 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 PRIMARY, f4) */ f1 FROM t1 WHERE (f2 = 5 OR f3 = 'c') AND (f5 = 'i' OR f4 = 'f'); |
| 113 | + |
| 114 | +SET optimizer_switch='index_merge_union=on,index_merge=on'; |
| 115 | +--echo # no union, since indexes 'f2', 'f3', 'f4' can not be used for index merge due to NO_INDEX_MERGE hint. |
| 116 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f2, f3, f4) */ f1 FROM t1 WHERE f2 = 5 OR f3 = 'c' OR f4 = 'f'; |
| 117 | +--echo # no union, since indexes 'f2', 'f3' can not be used for index merge due to NO_INDEX_MERGE hint. |
| 118 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f2, f3) */ f1 FROM t1 WHERE (f2 = 5 OR f3 = 'c') AND (f1 = 4 OR f4 = 'f'); |
| 119 | +--echo # union(f2,f3), since index 'f4' can not be used for index merge due to NO_INDEX_MERGE hint. |
| 120 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f4) */ f1 FROM t1 WHERE (f2 = 5 OR f3 = 'c') AND (f1 = 4 OR f4 = 'f'); |
| 121 | +--echo # no union, since ref access by 'f2' index is cheapest access method. |
| 122 | +EXPLAIN SELECT * FROM t1 WHERE f2 = 400 AND (f3 = 'x' OR f4 = 'n'); |
| 123 | + |
| 124 | +--echo # Index merge sort union |
| 125 | +SET optimizer_switch='index_merge_sort_union=off,index_merge=off'; |
| 126 | +--echo # sort_union(f2, f4), since only indexes specified in the hint are applicable for index merge. |
| 127 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f4) */ * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 128 | +--echo # sort_union(f2, f3), since only indexes specified in the hint are applicable for index merge. |
| 129 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f3) */ * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 130 | +--echo # no sort_union, since hints with one specified index is ignored. |
| 131 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f3) */ * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 132 | + |
| 133 | +SET optimizer_switch='index_merge_sort_union=on,index_merge=on'; |
| 134 | +--echo # no sort_union, since indexes 'f2', 'f4' can not be used for index merge due to NO_INDEX_MERGE hint. |
| 135 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f2, f4) */ * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 136 | +--echo # no sort_union, since indexes 'f2', 'f3' can not be used for index merge due to NO_INDEX_MERGE hint. |
| 137 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f2, f3) */ * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 138 | +--echo # sort_union(f2, f3), since index 'f4' can not be used for index merge due to NO_INDEX_MERGE hint. |
| 139 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f4) */ * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 140 | +--echo # sort_union(f2, f4), since index 'f3' can not be used for index merge due to NO_INDEX_MERGE hint. |
| 141 | +EXPLAIN SELECT /*+ NO_INDEX_MERGE(t1 f3) */ * FROM t1 WHERE (f2 BETWEEN 5 AND 6 OR f3 = 'c') AND (f2 BETWEEN 5 AND 6 OR f4 = 'f'); |
| 142 | + |
| 143 | +--echo # no sort_union, since full scan is the cheapest access method. |
| 144 | +EXPLAIN SELECT * FROM t1 WHERE (f2 BETWEEN 1 AND 200 OR f3 = 'c') AND (f2 BETWEEN 1 AND 200 OR f4 = 'f'); |
| 145 | +--echo # sort_union(f2, f3), since it's the cheapest index merge. |
| 146 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ * FROM t1 WHERE (f2 BETWEEN 1 AND 200 OR f3 = 'c') AND (f2 BETWEEN 1 AND 200 OR f4 = 'f'); |
| 147 | +--echo # sort_union(f2, f4), since only indexes specified in the hint are applicable for index merge. |
| 148 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f4) */ * FROM t1 WHERE (f2 BETWEEN 1 AND 200 OR f3 = 'c') AND (f2 BETWEEN 1 AND 200 OR f4 = 'f'); |
| 149 | + |
| 150 | +--echo # union(f2,f3,f4), since it's the cheapest access method. |
| 151 | +EXPLAIN SELECT f1 FROM t1 WHERE (f2 = 5 OR f3 = 'c' OR f4 = 'f') AND (f2 BETWEEN 1 AND 200 OR f3 = 'c'); |
| 152 | +--echo # sort_union(f2,f3), since only indexes specified in the hint are applicable for index merge. |
| 153 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, f3) */ f1 FROM t1 WHERE (f2 = 5 OR f3 = 'c' OR f4 = 'f') AND (f2 BETWEEN 1 AND 200 OR f3 = 'c'); |
| 154 | + |
| 155 | +--echo # Tests for INDEX_MERGE hint with no index specified. |
| 156 | +SET optimizer_switch=default; |
| 157 | +--echo # union(intersect(f2,f3,f4),f7) |
| 158 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ COUNT(*) FROM t1 WHERE (f4 = 'h' AND f2 = 2 AND f3 = 'b') OR (f7 = 'd' AND f6 = 'e'); |
| 159 | +--echo # union(intersect(f2,f3),f7), since only indexes specified in the hint are applicable for index merge. |
| 160 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2,f3,f7) */ COUNT(*) FROM t1 WHERE (f4 = 'h' AND f2 = 2 AND f3 = 'b') OR (f7 = 'd' AND f6 = 'e'); |
| 161 | +--echo # Warn that there are insufficient ROR scans available for the given index merge. |
| 162 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ f3 FROM t1 WHERE f4 = 'f' AND f2 = 3 AND f5 > ''; |
| 163 | +--echo # intersect(f2,f4), since it's the cheapest index merge. |
| 164 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ f3 FROM t1 WHERE f2 = 3 AND f4 = 'g' AND f5 = ''; |
| 165 | +--echo # no index merge, since range by 'f2' key is the cheapest access method. |
| 166 | +EXPLAIN SELECT f3 FROM t1 WHERE f2 = 3 AND f4 = '' AND f5 > ''; |
| 167 | +--echo # Warn that there are insufficient ROR scans available for the given index merge. |
| 168 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ f3 FROM t1 WHERE f2 = 3 AND f4 = '' AND f5 > ''; |
| 169 | +--echo # sort_union(f2,f7) |
| 170 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ f3 FROM t1 WHERE (f2 = 3 AND f4 = '' AND f5 > '') OR (f7 = 'd' AND f6 = 'e'); |
| 171 | +--echo # sort_union(f2,f7) |
| 172 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 f2, PRIMARY, f7) */ f3 FROM t1 WHERE (f2 = 3 AND f4 = '' AND f5 > '') OR (f7 = 'd' AND f6 = 'e'); |
| 173 | +--echo # intersect(f2,f4), since it's the cheapest index merge. |
| 174 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ f2 FROM t1 WHERE f2 = 2 AND f4 = 'g' AND f5 = ''; |
| 175 | + |
| 176 | +DROP TABLE t1; |
| 177 | + |
| 178 | +--echo # union(key1, key2) when limit given, even though access via a key would be cheaper |
| 179 | +CREATE TABLE t1 (key1 varchar(10), key2 varchar(10), key3 int, key(key1), key(key2), key(key3)) ENGINE=INNODB; |
| 180 | +INSERT INTO t1 (key1, key2, key3) VALUES ('foo', 'bar', 2), ('baz', 'qux', 1); |
| 181 | +EXPLAIN SELECT * FROM t1 WHERE (t1.key1='foo' OR t1.key2='bar') ORDER BY t1.key3 LIMIT 1; |
| 182 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1) */ * FROM t1 WHERE (t1.key1='foo' OR t1.key2='bar') ORDER BY t1.key3 LIMIT 1; |
| 183 | +EXPLAIN SELECT /*+ INDEX_MERGE(t1 key1, key2) */ * FROM t1 WHERE (t1.key1='foo' OR t1.key2='bar') ORDER BY t1.key3 LIMIT 1; |
| 184 | +DROP TABLE t1; |
| 185 | + |
| 186 | +--echo # PR testcases |
| 187 | +create table ten(a int primary key); |
| 188 | +insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); |
| 189 | +create table one_k(a int primary key); |
| 190 | +insert into one_k select A.a + B.a* 10 + C.a * 100 from ten A, ten B, ten C; |
| 191 | +create table t1 (a int, b int, c int, d int, index(a),index(b),index(c),index(d)); |
| 192 | +insert into t1 select a,a,a,a from test.one_k; |
| 193 | + |
| 194 | +explain select /*+ INDEX_MERGE(t1 c,d) */ * from t1 where (a <3 or b <3 ) and (c=3 and d=4); |
| 195 | +explain select /*+ INDEX_MERGE(t1 a,b) */ * from t1 where (a <3 or b <3 ) and (c=3 and d=4); |
| 196 | +explain select /*+ INDEX_MERGE(t1 a,b) */ * from t1 where (a <3 or b <3 ) and (c<2 and d<2); |
| 197 | + |
| 198 | +create table t2 ( c1 int, c2 int, c3 int, index(c1),index(c2),index(c3)); |
| 199 | +insert into t2 select mod(a,1000), mod(a, 250), mod(a, 75) from test.one_k; |
| 200 | +insert into t2 select mod(a,1000), mod(a, 250), mod(a, 75) from test.one_k; |
| 201 | +set optimizer_switch='rowid_filter=off'; |
| 202 | +alter table t2 add c1a int; |
| 203 | +update t2 set c1a=c1; |
| 204 | +alter table t2 add index(c1a); |
| 205 | +set optimizer_trace=1; |
| 206 | + |
| 207 | +explain select /*+ INDEX_MERGE(t2 c1,c2,c1a) */ * from t2 where c1=1 and c2=1 and c3=1 or c1a=1; |
| 208 | +explain select * from t2 where c1< 100 and c2<1; |
| 209 | +explain select /*+ NO_INDEX_MERGE(t2) */ * from t2 where c1< 100 and c2<1; |
| 210 | + |
| 211 | +drop table ten, one_k, t1, t2; |
0 commit comments