Skip to content

Commit 1e2774d

Browse files
committed
MDEV-33281 Make BNL() hint work for join_cache_levels from 0 to 3
BNL() hint effectively increases join_cache_level up to 4 if it is set to value less than 4. This commit also makes the BKA() hint override not only `join_cache_bka` optimizer switch but `join_cache_level` as well. I.e., BKA() hint enables BKA and BKAH join buffers both flat and incremental despite `join_cache_level` and `join_cache_bka` setting.
1 parent e4af72b commit 1e2774d

File tree

3 files changed

+110
-3
lines changed

3 files changed

+110
-3
lines changed

mysql-test/main/opt_hints.result

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,32 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
353353
1 SIMPLE t13 ref a a 5 test.t12.a 1 100.00 Using index condition; Using where; Using join buffer (flat, BKAH join); Rowid-ordered scan
354354
Warnings:
355355
Note 1003 select /*+ QB_NAME(`QB1`) BKA(`t13`@`QB1`) */ `test`.`t12`.`a` AS `a`,`test`.`t12`.`b` AS `b`,`test`.`t13`.`a` AS `a`,`test`.`t13`.`b` AS `b`,`test`.`t13`.`c` AS `c`,`test`.`t13`.`filler` AS `filler` from `test`.`t12` join `test`.`t13` where `test`.`t13`.`a` = `test`.`t12`.`a` and `test`.`t13`.`b` + 1 <= `test`.`t13`.`b` + 1
356+
# Hint overrides both join_cache_level and optimizer switch
357+
set join_cache_level = 0;
358+
EXPLAIN EXTENDED SELECT /*+ BKA(t12, t13) */ * FROM t12, t13
359+
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
360+
id select_type table type possible_keys key key_len ref rows filtered Extra
361+
1 SIMPLE t12 ALL NULL NULL NULL NULL 10 100.00 Using where
362+
1 SIMPLE t13 ref a a 5 test.t12.a 1 100.00 Using index condition; Using where; Using join buffer (flat, BKAH join); Rowid-ordered scan
363+
Warnings:
364+
Note 1003 select /*+ BKA(`t12`@`select#1`) BKA(`t13`@`select#1`) */ `test`.`t12`.`a` AS `a`,`test`.`t12`.`b` AS `b`,`test`.`t13`.`a` AS `a`,`test`.`t13`.`b` AS `b`,`test`.`t13`.`c` AS `c`,`test`.`t13`.`filler` AS `filler` from `test`.`t12` join `test`.`t13` where `test`.`t13`.`a` = `test`.`t12`.`a` and `test`.`t13`.`b` + 1 <= `test`.`t13`.`b` + 1
365+
set join_cache_level = 2;
366+
EXPLAIN EXTENDED SELECT /*+ BKA(t12, t13) */ * FROM t12, t13
367+
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
368+
id select_type table type possible_keys key key_len ref rows filtered Extra
369+
1 SIMPLE t12 ALL NULL NULL NULL NULL 10 100.00 Using where
370+
1 SIMPLE t13 ref a a 5 test.t12.a 1 100.00 Using index condition; Using where; Using join buffer (flat, BKAH join); Rowid-ordered scan
371+
Warnings:
372+
Note 1003 select /*+ BKA(`t12`@`select#1`) BKA(`t13`@`select#1`) */ `test`.`t12`.`a` AS `a`,`test`.`t12`.`b` AS `b`,`test`.`t13`.`a` AS `a`,`test`.`t13`.`b` AS `b`,`test`.`t13`.`c` AS `c`,`test`.`t13`.`filler` AS `filler` from `test`.`t12` join `test`.`t13` where `test`.`t13`.`a` = `test`.`t12`.`a` and `test`.`t13`.`b` + 1 <= `test`.`t13`.`b` + 1
373+
set join_cache_level = 4;
374+
EXPLAIN EXTENDED SELECT /*+ BKA(t12, t13) */ * FROM t12, t13
375+
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
376+
id select_type table type possible_keys key key_len ref rows filtered Extra
377+
1 SIMPLE t12 ALL NULL NULL NULL NULL 10 100.00 Using where
378+
1 SIMPLE t13 ref a a 5 test.t12.a 1 100.00 Using index condition; Using where; Using join buffer (flat, BKAH join); Rowid-ordered scan
379+
Warnings:
380+
Note 1003 select /*+ BKA(`t12`@`select#1`) BKA(`t13`@`select#1`) */ `test`.`t12`.`a` AS `a`,`test`.`t12`.`b` AS `b`,`test`.`t13`.`a` AS `a`,`test`.`t13`.`b` AS `b`,`test`.`t13`.`c` AS `c`,`test`.`t13`.`filler` AS `filler` from `test`.`t12` join `test`.`t13` where `test`.`t13`.`a` = `test`.`t12`.`a` and `test`.`t13`.`b` + 1 <= `test`.`t13`.`b` + 1
381+
set join_cache_level = 8;
356382
# Enable BKA
357383
set optimizer_switch='join_cache_bka=on';
358384
EXPLAIN EXTENDED SELECT /*+ NO_BKA(t13) */ * FROM t12, t13
@@ -1175,6 +1201,40 @@ LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
11751201
a4 b5
11761202
9 0
11771203
9 NULL
1204+
# BNL() hint overrides join_cache_levels from 0 to 3 increasing it to 4
1205+
set join_cache_level = 1;
1206+
EXPLAIN
1207+
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
1208+
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
1209+
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
1210+
id select_type table type possible_keys key key_len ref rows Extra
1211+
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
1212+
1 SIMPLE t3 index PRIMARY PRIMARY 4 NULL 1 Using where; Using index
1213+
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t3.a3 1 Using where
1214+
1 SIMPLE t4 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (flat, BNL join)
1215+
1 SIMPLE t5 hash_ALL PRIMARY #hash#PRIMARY 4 test.t2.a2 1 Using where; Using join buffer (incremental, BNLH join)
1216+
set join_cache_level = 2;
1217+
EXPLAIN
1218+
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
1219+
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
1220+
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
1221+
id select_type table type possible_keys key key_len ref rows Extra
1222+
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
1223+
1 SIMPLE t3 index PRIMARY PRIMARY 4 NULL 1 Using where; Using index
1224+
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t3.a3 1 Using where
1225+
1 SIMPLE t4 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (flat, BNL join)
1226+
1 SIMPLE t5 hash_ALL PRIMARY #hash#PRIMARY 4 test.t2.a2 1 Using where; Using join buffer (incremental, BNLH join)
1227+
set join_cache_level = 3;
1228+
EXPLAIN
1229+
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
1230+
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
1231+
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
1232+
id select_type table type possible_keys key key_len ref rows Extra
1233+
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
1234+
1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 1 Using where
1235+
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 4 test.t2.a2 1 Using index
1236+
1 SIMPLE t4 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (flat, BNL join)
1237+
1 SIMPLE t5 hash_ALL PRIMARY #hash#PRIMARY 4 test.t2.a2 1 Using where; Using join buffer (incremental, BNLH join)
11781238
# Enable all join buffering capabilities:
11791239
SET SESSION join_cache_level = 8;
11801240
EXPLAIN

mysql-test/main/opt_hints.test

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,21 @@ EXPLAIN EXTENDED SELECT /*+ BKA(t12) */ * FROM t12, t13
197197
EXPLAIN EXTENDED SELECT /*+ QB_NAME(QB1) BKA(t13@QB1) */ * FROM t12, t13
198198
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
199199

200+
--echo # Hint overrides both join_cache_level and optimizer switch
201+
set join_cache_level = 0;
202+
EXPLAIN EXTENDED SELECT /*+ BKA(t12, t13) */ * FROM t12, t13
203+
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
204+
205+
set join_cache_level = 2;
206+
EXPLAIN EXTENDED SELECT /*+ BKA(t12, t13) */ * FROM t12, t13
207+
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
208+
209+
set join_cache_level = 4;
210+
EXPLAIN EXTENDED SELECT /*+ BKA(t12, t13) */ * FROM t12, t13
211+
WHERE t12.a=t13.a AND (t13.b+1 <= t13.b+1);
212+
213+
set join_cache_level = 8;
214+
200215
--echo # Enable BKA
201216
set optimizer_switch='join_cache_bka=on';
202217

@@ -603,6 +618,25 @@ SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
603618
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
604619
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
605620

621+
--echo # BNL() hint overrides join_cache_levels from 0 to 3 increasing it to 4
622+
set join_cache_level = 1;
623+
EXPLAIN
624+
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
625+
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
626+
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
627+
628+
set join_cache_level = 2;
629+
EXPLAIN
630+
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
631+
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
632+
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
633+
634+
set join_cache_level = 3;
635+
EXPLAIN
636+
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
637+
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
638+
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
639+
606640
--echo # Enable all join buffering capabilities:
607641
SET SESSION join_cache_level = 8;
608642
EXPLAIN

sql/sql_select.cc

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15715,24 +15715,35 @@ uint check_join_cache_usage(JOIN_TAB *tab,
1571515715
bool no_bka_cache= !hint_table_state_or_fallback(join->thd,
1571615716
tab->tab_list->table, BKA_HINT_ENUM,
1571715717
join->allowed_join_cache_types & JOIN_CACHE_BKA_BIT);
15718+
bool hint_forces_bka= hint_table_state_or_fallback(join->thd,
15719+
tab->tab_list->table,
15720+
BKA_HINT_ENUM, false);
1571815721
join->return_tab= 0;
1571915722

1572015723
if (tab->no_forced_join_cache || (no_bnl_cache && no_bka_cache))
1572115724
goto no_join_cache;
1572215725

15723-
if (cache_level == 0 && hint_table_state_or_fallback(join->thd,
15726+
if (cache_level < 4 && hint_table_state_or_fallback(join->thd,
1572415727
tab->tab_list->table,
1572515728
BNL_HINT_ENUM, false))
1572615729
{
1572715730
cache_level= 4; // BNL() hint present, raise join_cache_level to BNLH
1572815731
}
1572915732

1573015733
/*
15731-
Don't use join cache if @@join_cache_level==0 or this table is the first
15734+
Don't use join cache if @@join_cache_level==0 and hint BKA()
15735+
is not specified or this table is the first
1573215736
one join suborder (either at top level or inside a bush)
1573315737
*/
15734-
if (cache_level == 0 || !prev_tab)
15738+
if ((cache_level == 0 && !hint_forces_bka) || !prev_tab)
15739+
{
15740+
/*
15741+
We could have cache_level==0 but join cache was forced for some previous
15742+
table (PT) with a hint. Proceed to cancel join cache for PT if it is not
15743+
allowed to use join cache for PT without using it for this table.
15744+
*/
1573515745
goto no_join_cache;
15746+
}
1573615747

1573715748
if (force_unlinked_cache && (cache_level%2 == 0))
1573815749
cache_level--;
@@ -15871,6 +15882,8 @@ uint check_join_cache_usage(JOIN_TAB *tab,
1587115882
case JT_CONST:
1587215883
case JT_REF:
1587315884
case JT_EQ_REF:
15885+
if (hint_forces_bka)
15886+
cache_level= 8; // Increase to BKAH incremental
1587415887
if (cache_level <=2 || (no_hashed_cache && no_bka_cache))
1587515888
goto no_join_cache;
1587615889
if (tab->ref.is_access_triggered())

0 commit comments

Comments
 (0)