Skip to content

Commit 453a86f

Browse files
committed
MDEV-36133 BNL() hint doesn't work with join_cache_level>=5
This commit: - fixes a couple of bugs in check_join_cache_usage(); - separates a part of opt_hints.test to a new file opt_hints_join_cache.test; - add a batch of test cases run against different join_cache_level settings.
1 parent 6e2a050 commit 453a86f

File tree

6 files changed

+2621
-931
lines changed

6 files changed

+2621
-931
lines changed

mysql-test/main/opt_hints.result

Lines changed: 1 addition & 604 deletions
Large diffs are not rendered by default.

mysql-test/main/opt_hints.test

Lines changed: 1 addition & 316 deletions
Original file line numberDiff line numberDiff line change
@@ -378,322 +378,7 @@ SHOW STATUS LIKE 'handler_read%';
378378

379379
DEALLOCATE PREPARE stmt1;
380380

381-
DROP TABLE t1, t2, t3, t10, t11, t12, t13;
382-
383-
--echo #
384-
--echo # BNL and NO_BNL hint testing
385-
--echo #
386-
387-
set optimizer_switch=default;
388-
389-
CREATE TABLE t1 (a INT, b INT);
390-
INSERT INTO t1 VALUES (1,1),(2,2);
391-
CREATE TABLE t2 (a INT, b INT);
392-
INSERT INTO t2 VALUES (1,1),(2,2);
393-
CREATE TABLE t3 (a INT, b INT);
394-
INSERT INTO t3 VALUES (1,1),(2,2);
395-
396-
--disable_ps2_protocol
397-
--disable_cursor_protocol
398-
--echo # Check statistics without hint
399-
FLUSH STATUS;
400-
SELECT t1.* FROM t1,t2,t3;
401-
SHOW STATUS LIKE 'handler_read%';
402-
403-
--echo # Check statistics with hint
404-
FLUSH STATUS;
405-
SELECT /*+ NO_BNL() */t1.* FROM t1,t2,t3;
406-
SHOW STATUS LIKE 'handler_read%';
407-
--enable_ps2_protocol
408-
--enable_cursor_protocol
409-
410-
EXPLAIN EXTENDED SELECT t1.* FROM t1,t2,t3;
411-
EXPLAIN EXTENDED SELECT /*+ NO_BNL() */t1.* FROM t1,t2,t3;
412-
EXPLAIN EXTENDED SELECT /*+ NO_BNL(t2, t3) */t1.* FROM t1,t2,t3;
413-
EXPLAIN EXTENDED SELECT /*+ NO_BNL(t1, t3) */t1.* FROM t1,t2,t3;
414-
415-
--echo # Make sure query results are the same for any hints combination
416-
--sorted_result
417-
SELECT * FROM t1,t2,t3;
418-
--sorted_result
419-
SELECT /*+ NO_BNL(t1, t2) */* FROM t1,t2,t3;
420-
--sorted_result
421-
SELECT /*+ NO_BNL(t1, t3) */* FROM t1,t2,t3;
422-
--sorted_result
423-
SELECT /*+ NO_BNL(t2, t3) */* FROM t1,t2,t3;
424-
425-
--echo # BNL() overrides current join_cache_level setting
426-
set join_cache_level = 0;
427-
EXPLAIN EXTENDED SELECT t1.* FROM t1,t2,t3;
428-
EXPLAIN EXTENDED SELECT /*+ BNL() */t1.* FROM t1,t2,t3;
429-
EXPLAIN EXTENDED SELECT /*+ BNL(t1, t2) */t1.* FROM t1,t2,t3;
430-
EXPLAIN EXTENDED SELECT /*+ BNL(t1, t3) */t1.* FROM t1,t2,t3;
431-
EXPLAIN EXTENDED SELECT /*+ BNL(t2, t3) */t1.* FROM t1,t2,t3;
432-
EXPLAIN EXTENDED SELECT /*+ BNL(t2) BNL(t3) */t1.* FROM t1,t2,t3;
433-
434-
DROP TABLE t1, t2, t3;
435-
set join_cache_level = 8;
436-
437-
--echo # BNL in subquery
438-
set optimizer_switch = DEFAULT;
439-
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a));
440-
CREATE TABLE t2 (a INT);
441-
CREATE TABLE t3 (a INT, b INT, INDEX a (a,b));
442-
INSERT INTO t1 VALUES (1,10), (2,20), (3,30), (4,40);
443-
INSERT INTO t2 VALUES (2), (3), (4), (5);
444-
INSERT INTO t3 VALUES (10,3), (20,4), (30,5);
445-
ANALYZE TABLE t1, t2, t3;
446-
447-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) */ * FROM t1 JOIN t2 ON t1.a = t2.a WHERE
448-
t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
449-
450-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL() */ *
451-
FROM t1 JOIN t2 ON t1.a = t2.a
452-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
453-
454-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(t1, t2) */ *
455-
FROM t1 JOIN t2 ON t1.a = t2.a
456-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
457-
458-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(@subq1) */ *
459-
FROM t1 JOIN t2 ON t1.a = t2.a
460-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
461-
462-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(t4@subq1) */ *
463-
FROM t1 JOIN t2 ON t1.a = t2.a
464-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
465-
466-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(t3@subq1,t4@subq1) */ *
467-
FROM t1 JOIN t2 ON t1.a = t2.a
468-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
469-
470-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) NO_BNL(@subq1 t3, t4) */ *
471-
FROM t1 JOIN t2 ON t1.a = t2.a
472-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
473-
474-
EXPLAIN EXTENDED SELECT /*+ QB_NAME(q) */ *
475-
FROM t1 JOIN t2 ON t1.a = t2.a
476-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) NO_BNL(t3, t4) */ t3.b
477-
FROM t3 JOIN t1 t4 ON t3.a = t4.b);
478-
479-
--echo # Make sure query results are the same for any hints combination
480-
# --sorted_result
481-
SELECT * FROM t1 JOIN t2 ON t1.a = t2.a WHERE
482-
t2.a IN (SELECT t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
483-
# --sorted_result
484-
SELECT /*+ QB_NAME(q) */ * FROM t1 JOIN t2 ON t1.a = t2.a WHERE
485-
t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
486-
--sorted_result
487-
SELECT /*+ QB_NAME(q) NO_BNL() */ *
488-
FROM t1 JOIN t2 ON t1.a = t2.a
489-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
490-
--sorted_result
491-
SELECT /*+ QB_NAME(q) NO_BNL(t1, t2) */ *
492-
FROM t1 JOIN t2 ON t1.a = t2.a
493-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
494-
--sorted_result
495-
SELECT /*+ QB_NAME(q) NO_BNL(@subq1) */ *
496-
FROM t1 JOIN t2 ON t1.a = t2.a
497-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
498-
--sorted_result
499-
SELECT /*+ QB_NAME(q) NO_BNL(t4@subq1) */ *
500-
FROM t1 JOIN t2 ON t1.a = t2.a
501-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
502-
--sorted_result
503-
SELECT /*+ QB_NAME(q) NO_BNL(t3@subq1,t4@subq1) */ *
504-
FROM t1 JOIN t2 ON t1.a = t2.a
505-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
506-
--sorted_result
507-
SELECT /*+ QB_NAME(q) NO_BNL(@subq1 t3, t4) */ *
508-
FROM t1 JOIN t2 ON t1.a = t2.a
509-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ t3.b FROM t3 JOIN t1 t4 ON t3.a = t4.b);
510-
--sorted_result
511-
SELECT /*+ QB_NAME(q) */ *
512-
FROM t1 JOIN t2 ON t1.a = t2.a
513-
WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) NO_BNL(t3, t4) */ t3.b
514-
FROM t3 JOIN t1 t4 ON t3.a = t4.b);
515-
516-
DROP TABLE t1, t2, t3, t4;
517-
518-
--echo #
519-
--echo # BNL() and NO_BNL() for LEFT JOINs
520-
--echo #
521-
522-
CREATE TABLE t1 (a int);
523-
CREATE TABLE t2 (a int);
524-
CREATE TABLE t3 (a int);
525-
CREATE TABLE t4 (a int);
526-
527-
INSERT INTO t1 VALUES (null), (2), (null), (1);
528-
529-
set join_cache_level = 8;
530-
531-
--echo # Two join buffers are employed by default (without hints):
532-
EXPLAIN SELECT t1.a
533-
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a) ON 0
534-
WHERE t1.a OR t3.a;
535-
536-
--echo # Disabling either of join buffers disables another one automatically due
537-
--echo # to join buffer employment rules:
538-
EXPLAIN SELECT /*+ NO_BNL(t2) */ t1.a
539-
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a) ON 0
540-
WHERE t1.a OR t3.a;
541-
542-
EXPLAIN SELECT /*+ NO_BNL(t3) */ t1.a
543-
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a) ON 0
544-
WHERE t1.a OR t3.a;
545-
546-
--echo # Three join buffers are employed here by default (without hints):
547-
EXPLAIN SELECT t1.a
548-
FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
549-
WHERE t1.a OR t4.a;
550-
551-
--echo # Disabling either of join buffers disables others automatically due
552-
--echo # to join buffer employment rules:
553-
EXPLAIN SELECT /*+ NO_BNL(t2)*/ t1.a
554-
FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
555-
WHERE t1.a OR t4.a;
556-
EXPLAIN SELECT /*+ NO_BNL(t3)*/ t1.a
557-
FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
558-
WHERE t1.a OR t4.a;
559-
EXPLAIN SELECT /*+ NO_BNL(t4)*/ t1.a
560-
FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
561-
WHERE t1.a OR t4.a;
562-
563-
set join_cache_level=0;
564-
--echo # It is not allowed to enable join buffers on some subset of inner tables
565-
--echo # of an outer join. Either all tables should use join buffers or none:
566-
EXPLAIN SELECT /*+ BNL(t2)*/ t1.a
567-
FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
568-
WHERE t1.a OR t4.a;
569-
EXPLAIN SELECT /*+ BNL(t2, t3)*/ t1.a
570-
FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
571-
WHERE t1.a OR t4.a;
572-
EXPLAIN SELECT /*+ BNL(t2, t3, t4)*/ t1.a
573-
FROM t1 LEFT JOIN (t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a) ON 0
574-
WHERE t1.a OR t4.a;
575-
576-
set join_cache_level=8;
577-
INSERT INTO t2 VALUES (1), (2), (null), (1);
578-
--echo # BNLH buffer is used when allowed by JCL setting
579-
EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a;
580-
581-
--echo # Make sure the hint enables BNL even when JCL=0:
582-
set join_cache_level=0;
583-
EXPLAIN SELECT /*+BNL(t2) */ * FROM t1, t2 WHERE t1.a=t2.a;
584-
585-
set join_cache_level=2;
586-
EXPLAIN SELECT /*+BNL(t2) */ * FROM t1, t2 WHERE t1.a=t2.a;
587-
588-
DROP TABLE t1,t2,t3,t4;
589-
590-
591-
--echo #
592-
--echo # Mix of BNL/BKA flat and incremental join buffers for OUTER JOINs
593-
--echo #
594-
595-
set optimizer_switch='outer_join_with_cache=on,mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
596-
597-
CREATE TABLE t1 (a1 varchar(32)) ;
598-
INSERT INTO t1 VALUES ('s'),('k');
599-
600-
CREATE TABLE t2 (a2 int PRIMARY KEY, b2 varchar(32)) ;
601-
INSERT INTO t2 VALUES (7,'s');
602-
603-
CREATE TABLE t3 (a3 int PRIMARY KEY, b3 varchar(32)) ;
604-
INSERT INTO t3 VALUES (7,'s');
605-
606-
CREATE TABLE t4 (a4 int);
607-
INSERT INTO t4 VALUES (9);
608-
609-
CREATE TABLE t5(a5 int PRIMARY KEY, b5 int) ;
610-
INSERT INTO t5 VALUES (7,0);
611-
--disable_result_log
612-
ANALYZE TABLES t1, t2, t3, t4, t5;
613-
--enable_result_log
614-
615-
--echo # Disable join buffering to enable it selectively on particular tables
616-
SET SESSION join_cache_level = 0;
617-
EXPLAIN
618-
SELECT t4.a4, t5.b5
619-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
620-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
621-
SELECT t4.a4, t5.b5
622-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
623-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
624-
625-
EXPLAIN
626-
SELECT /*+ BNL(t4) */ t4.a4, t5.b5
627-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
628-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
629-
SELECT /*+ BNL(t4) */ t4.a4, t5.b5
630-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
631-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
632-
633-
EXPLAIN
634-
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
635-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
636-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
637-
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
638-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
639-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
640-
641-
--echo # BNL() hint overrides join_cache_levels from 0 to 3 increasing it to 4
642-
set join_cache_level = 1;
643-
EXPLAIN
644-
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
645-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
646-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
647-
648-
set join_cache_level = 2;
649-
EXPLAIN
650-
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
651-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
652-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
653-
654-
set join_cache_level = 3;
655-
EXPLAIN
656-
SELECT /*+ BNL(t4, t5) */ t4.a4, t5.b5
657-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
658-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
659-
660-
--echo # Enable all join buffering capabilities:
661-
SET SESSION join_cache_level = 8;
662-
EXPLAIN
663-
SELECT t4.a4, t5.b5
664-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
665-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
666-
SELECT t4.a4, t5.b5
667-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
668-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
669-
670-
EXPLAIN
671-
SELECT /*+ NO_BNL(t4)*/ t4.a4, t5.b5
672-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
673-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
674-
SELECT /*+ NO_BNL(t4)*/ t4.a4, t5.b5
675-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
676-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
677-
678-
--echo # Disable BKA so the BNLH join buffer will be employed:
679-
EXPLAIN
680-
SELECT /*+ NO_BKA(t5)*/ t4.a4, t5.b5
681-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
682-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
683-
SELECT /*+ NO_BKA(t5)*/ t4.a4, t5.b5
684-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
685-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
686-
687-
EXPLAIN
688-
SELECT /*+ NO_BKA(t5) NO_BNL(t5)*/ t4.a4, t5.b5
689-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
690-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
691-
SELECT /*+ NO_BKA(t5) NO_BNL(t5)*/ t4.a4, t5.b5
692-
FROM ((t1 LEFT JOIN (t2 JOIN t3 ON t2.a2 = t3.a3) ON t2.b2 = t1.a1)
693-
LEFT JOIN t4 ON t4.a4 <> 0) LEFT JOIN t5 ON t5.a5 = t2.a2;
694-
695-
DROP TABLE t1,t2,t3,t4,t5;
696-
381+
DROP TABLE t1, t2, t3, t4, t10, t11, t12, t13;
697382

698383
--echo # MRR & NO_MRR hint testing
699384
set optimizer_switch=default;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
EXPLAIN SELECT * FROM t12, t13
2+
WHERE t12.a=t13.a AND (t13.b+1 <= t12.b+1);
3+
--echo --------------------------------------------
4+
EXPLAIN SELECT /*+ BKA() */ * FROM t12, t13
5+
WHERE t12.a=t13.a AND (t13.b+1 <= t12.b+1);
6+
--echo --------------------------------------------
7+
EXPLAIN SELECT /*+ BNL() */ * FROM t12, t13
8+
WHERE t12.a=t13.a AND (t13.b+1 <= t12.b+1);
9+
--echo --------------------------------------------
10+
EXPLAIN SELECT /*+ NO_BKA() */ * FROM t12, t13
11+
WHERE t12.a=t13.a AND (t13.b+1 <= t12.b+1);
12+
--echo --------------------------------------------
13+
EXPLAIN SELECT /*+ NO_BNL() */ * FROM t12, t13
14+
WHERE t12.a=t13.a AND (t13.b+1 <= t12.b+1);
15+
--echo --------------------------------------------
16+
EXPLAIN SELECT /*+ NO_BKA() NO_BNL() */ * FROM t12, t13
17+
WHERE t12.a=t13.a AND (t13.b+1 <= t12.b+1);
18+

0 commit comments

Comments
 (0)