Skip to content

Commit 65657ad

Browse files
committed
Update join planning tests for new merge coster.
1 parent 8d5204b commit 65657ad

File tree

2 files changed

+887
-875
lines changed

2 files changed

+887
-875
lines changed

enginetest/join_planning_tests.go

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ var JoinPlanningTests = []struct {
4747
{
4848
name: "merge join unary index",
4949
setup: []string{
50-
"CREATE table xy (x int primary key, y int, index y_idx(y));",
50+
"CREATE table xy (x int primary key, y int, unique index y_idx(y));",
5151
"create table rs (r int primary key, s int, index s_idx(s));",
5252
"CREATE table uv (u int primary key, v int);",
5353
"CREATE table ab (a int primary key, b int);",
@@ -59,54 +59,54 @@ var JoinPlanningTests = []struct {
5959
},
6060
tests: []JoinPlanTest{
6161
{
62-
q: "select u,a,y from uv join (select /*+ JOIN_ORDER(ab, xy) */ * from ab join xy on y = a) r on u = r.a order by 1",
62+
q: "select u,a,y from uv join (select /*+ JOIN_ORDER(ab, xy) MERGE_JOIN(ab, xy) */ * from ab join xy on y = a) r on u = r.a order by 1",
6363
types: []plan.JoinType{plan.JoinTypeLookup, plan.JoinTypeMerge},
6464
exp: []sql.Row{{0, 0, 0}, {1, 1, 1}, {2, 2, 2}, {3, 3, 3}},
6565
},
6666
{
67-
q: "select /*+ JOIN_ORDER(ab, xy) */ * from ab join xy on y = a order by 1, 3",
67+
q: "select /*+ JOIN_ORDER(ab, xy) MERGE_JOIN(ab, xy)*/ * from ab join xy on y = a order by 1, 3",
6868
types: []plan.JoinType{plan.JoinTypeMerge},
6969
exp: []sql.Row{{0, 2, 1, 0}, {1, 2, 2, 1}, {2, 2, 0, 2}, {3, 1, 3, 3}},
7070
},
7171
{
72-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs left join xy on y = s order by 1, 3",
72+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs left join xy on y = s order by 1, 3",
7373
types: []plan.JoinType{plan.JoinTypeLeftOuterMerge},
7474
exp: []sql.Row{{0, 0, 1, 0}, {1, 0, 1, 0}, {2, 0, 1, 0}, {4, 4, nil, nil}, {5, 4, nil, nil}},
7575
},
7676
{
7777
// extra join condition does not filter left-only rows
78-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs left join xy on y = s and y+s = 0 order by 1, 3",
78+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs left join xy on y = s and y+s = 0 order by 1, 3",
7979
types: []plan.JoinType{plan.JoinTypeLeftOuterMerge},
8080
exp: []sql.Row{{0, 0, 1, 0}, {1, 0, 1, 0}, {2, 0, 1, 0}, {4, 4, nil, nil}, {5, 4, nil, nil}},
8181
},
8282
{
8383
// extra join condition does not filter left-only rows
84-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs left join xy on y+2 = s and s-y = 2 order by 1, 3",
84+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs left join xy on y+2 = s and s-y = 2 order by 1, 3",
8585
types: []plan.JoinType{plan.JoinTypeLeftOuterMerge},
8686
exp: []sql.Row{{0, 0, nil, nil}, {1, 0, nil, nil}, {2, 0, nil, nil}, {4, 4, 0, 2}, {5, 4, 0, 2}},
8787
},
8888
{
89-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y = r order by 1, 3",
89+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y = r order by 1, 3",
9090
types: []plan.JoinType{plan.JoinTypeMerge},
9191
exp: []sql.Row{{0, 0, 1, 0}, {1, 0, 2, 1}, {2, 0, 0, 2}},
9292
},
9393
{
94-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on r = y order by 1, 3",
94+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on r = y order by 1, 3",
9595
types: []plan.JoinType{plan.JoinTypeMerge},
9696
exp: []sql.Row{{0, 0, 1, 0}, {1, 0, 2, 1}, {2, 0, 0, 2}},
9797
},
9898
{
99-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y = s order by 1, 3",
99+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y = s order by 1, 3",
100100
types: []plan.JoinType{plan.JoinTypeMerge},
101101
exp: []sql.Row{{0, 0, 1, 0}, {1, 0, 1, 0}, {2, 0, 1, 0}},
102102
},
103103
{
104-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y = s and y = r order by 1, 3",
104+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y = s and y = r order by 1, 3",
105105
types: []plan.JoinType{plan.JoinTypeMerge},
106106
exp: []sql.Row{{0, 0, 1, 0}},
107107
},
108108
{
109-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y+2 = s order by 1, 3",
109+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y+2 = s order by 1, 3",
110110
types: []plan.JoinType{plan.JoinTypeMerge},
111111
exp: []sql.Row{{4, 4, 0, 2}, {5, 4, 0, 2}},
112112
},
@@ -122,12 +122,12 @@ var JoinPlanningTests = []struct {
122122
// exp: []sql.Row{{0,0,1,0},{0, 0, 1, 0},{2,0,1,0},{4,4,1,0}},
123123
//},
124124
{
125-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on 2 = s+y order by 1, 3",
125+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on 2 = s+y order by 1, 3",
126126
types: []plan.JoinType{plan.JoinTypeInner},
127127
exp: []sql.Row{{0, 0, 0, 2}, {1, 0, 0, 2}, {2, 0, 0, 2}},
128128
},
129129
{
130-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y > s+2 order by 1, 3",
130+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y > s+2 order by 1, 3",
131131
types: []plan.JoinType{plan.JoinTypeInner},
132132
exp: []sql.Row{{0, 0, 3, 3}, {1, 0, 3, 3}, {2, 0, 3, 3}},
133133
},
@@ -144,7 +144,7 @@ var JoinPlanningTests = []struct {
144144
},
145145
tests: []JoinPlanTest{
146146
{
147-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y = s order by 1,3",
147+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y = s order by 1,3",
148148
types: []plan.JoinType{plan.JoinTypeMerge},
149149
exp: []sql.Row{{0, 0, 1, 0}, {0, 0, 4, 0}, {3, 0, 1, 0}, {3, 0, 4, 0}, {4, 8, 0, 8}, {5, 4, 5, 4}},
150150
},
@@ -161,12 +161,37 @@ var JoinPlanningTests = []struct {
161161
},
162162
tests: []JoinPlanTest{
163163
{
164-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y = s order by 1,3",
164+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y = s order by 1,3",
165165
types: []plan.JoinType{plan.JoinTypeMerge},
166166
exp: []sql.Row{},
167167
},
168168
},
169169
},
170+
{
171+
name: "merge join large and small table",
172+
setup: []string{
173+
"CREATE table xy (x int primary key, y int, index y_idx(y));",
174+
"create table rs (r int primary key, s int, index s_idx(s));",
175+
"insert into xy values (1,0), (2,1), (0,8), (3,7), (5,4), (4,0);",
176+
"insert into rs values (0,0),(2,3),(3,0), (4,8), (5,4);",
177+
"update information_schema.statistics set cardinality = 10 where table_name = 'xy';",
178+
"update information_schema.statistics set cardinality = 1000000000 where table_name = 'rs';",
179+
},
180+
tests: []JoinPlanTest{
181+
{
182+
// When primary table is much larger, doing many lookups is expensive: prefer merge
183+
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on x = r order by 1,3",
184+
types: []plan.JoinType{plan.JoinTypeMerge},
185+
exp: []sql.Row{{0, 0, 0, 8}, {2, 3, 2, 1}, {3, 0, 3, 7}, {4, 8, 4, 0}, {5, 4, 5, 4}},
186+
},
187+
{
188+
// When secondary table is much larger, avoid reading the entire table: prefer lookup
189+
q: "select /*+ JOIN_ORDER(xy, rs) */ * from xy join rs on x = r order by 1,3",
190+
types: []plan.JoinType{plan.JoinTypeLookup},
191+
exp: []sql.Row{{0, 8, 0, 0}, {2, 1, 2, 3}, {3, 7, 3, 0}, {4, 0, 4, 8}, {5, 4, 5, 4}},
192+
},
193+
},
194+
},
170195
{
171196
name: "merge join multi arity",
172197
setup: []string{
@@ -178,7 +203,7 @@ var JoinPlanningTests = []struct {
178203
},
179204
tests: []JoinPlanTest{
180205
{
181-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y = s order by 1,3",
206+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y = s order by 1,3",
182207
types: []plan.JoinType{plan.JoinTypeMerge},
183208
exp: []sql.Row{{0, 0, 1, 0}, {0, 0, 4, 0}, {3, 0, 1, 0}, {3, 0, 4, 0}, {4, 8, 0, 8}, {5, 4, 5, 4}},
184209
},
@@ -193,7 +218,7 @@ var JoinPlanningTests = []struct {
193218
q: `SELECT /*+ MERGE_JOIN(l,r) */ l.pk1, l.pk2, l.c1, r.pk1, r.pk2, r.c1 FROM two_pk l JOIN two_pk r ON l.pk1=r.pk1 AND l.pk2=r.pk2`,
194219
types: []plan.JoinType{plan.JoinTypeMerge},
195220
mergeCompares: []string{"((r.pk1, r.pk2) = (l.pk1, l.pk2))"},
196-
exp: []sql.Row{sql.Row{0, 0, 0, 0, 0, 0}, sql.Row{0, 1, 10, 0, 1, 10}, sql.Row{1, 0, 20, 1, 0, 20}, sql.Row{1, 1, 30, 1, 1, 30}},
221+
exp: []sql.Row{{0, 0, 0, 0, 0, 0}, {0, 1, 10, 0, 1, 10}, {1, 0, 20, 1, 0, 20}, {1, 1, 30, 1, 1, 30}},
197222
},
198223
},
199224
},
@@ -208,7 +233,7 @@ var JoinPlanningTests = []struct {
208233
},
209234
tests: []JoinPlanTest{
210235
{
211-
q: "select /*+ JOIN_ORDER(rs, xy) */ * from rs join xy on y = s order by 1,3",
236+
q: "select /*+ JOIN_ORDER(rs, xy) MERGE_JOIN(rs, xy) */ * from rs join xy on y = s order by 1,3",
212237
types: []plan.JoinType{plan.JoinTypeMerge},
213238
exp: []sql.Row{{0, 0, 1, 0}, {0, 0, 4, 0}, {3, 0, 1, 0}, {3, 0, 4, 0}, {4, 8, 0, 8}, {5, 4, 5, 4}},
214239
},
@@ -266,7 +291,7 @@ var JoinPlanningTests = []struct {
266291
},
267292
{
268293
q: "select * from xy where x not in (select u from uv where u not in (select a from ab where a not in (select r from rs where r = 1))) order by 1;",
269-
types: []plan.JoinType{plan.JoinTypeLeftOuterHashExcludeNulls, plan.JoinTypeLeftOuterHashExcludeNulls, plan.JoinTypeAntiLookup},
294+
types: []plan.JoinType{plan.JoinTypeLeftOuterHashExcludeNulls, plan.JoinTypeLeftOuterHashExcludeNulls, plan.JoinTypeLeftOuterMerge},
270295
exp: []sql.Row{{0, 2}, {2, 1}, {3, 3}},
271296
},
272297
{
@@ -357,12 +382,12 @@ order by 1;`,
357382
},
358383
{
359384
q: "select * from xy where x in (select u from uv join ab on u = a and a = 2) order by 1;",
360-
types: []plan.JoinType{plan.JoinTypeHash, plan.JoinTypeLookup},
385+
types: []plan.JoinType{plan.JoinTypeHash, plan.JoinTypeMerge},
361386
exp: []sql.Row{{2, 1}},
362387
},
363388
{
364389
q: "select * from xy where x = (select u from uv join ab on u = a and a = 2) order by 1;",
365-
types: []plan.JoinType{plan.JoinTypeLookup, plan.JoinTypeLookup},
390+
types: []plan.JoinType{plan.JoinTypeLookup, plan.JoinTypeMerge},
366391
exp: []sql.Row{{2, 1}},
367392
},
368393
{
@@ -497,7 +522,7 @@ WHERE EXISTS (
497522
select x from xy where
498523
not exists (select a from ab where a = x and a = 1) and
499524
not exists (select a from ab where a = x and a = 2)`,
500-
types: []plan.JoinType{plan.JoinTypeAntiLookup, plan.JoinTypeAntiLookup},
525+
types: []plan.JoinType{plan.JoinTypeAntiLookup, plan.JoinTypeLeftOuterMerge},
501526
exp: []sql.Row{{0}, {3}},
502527
},
503528
{
@@ -671,7 +696,7 @@ where u in (select * from rec);`,
671696
tests: []JoinPlanTest{
672697
{
673698
q: "select * from xy where x in (select u from uv join ab on u = a and a = 2) order by 1;",
674-
types: []plan.JoinType{plan.JoinTypeHash, plan.JoinTypeLookup},
699+
types: []plan.JoinType{plan.JoinTypeHash, plan.JoinTypeMerge},
675700
exp: []sql.Row{{2, 1}},
676701
},
677702
{
@@ -767,7 +792,7 @@ where u in (select * from rec);`,
767792
},
768793
{
769794
q: "select /*+ MERGE_JOIN(xy,scalarSubq0) */ * from xy where x not in (select u from uv WHERE u = 2) order by x",
770-
types: []plan.JoinType{plan.JoinTypeAntiLookup},
795+
types: []plan.JoinType{plan.JoinTypeLeftOuterMerge},
771796
exp: []sql.Row{
772797
{0, 2},
773798
{1, 0},

0 commit comments

Comments
 (0)