@@ -378,322 +378,7 @@ SHOW STATUS LIKE 'handler_read%';
378
378
379
379
DEALLOCATE PREPARE stmt1;
380
380
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;
697
382
698
383
--echo # MRR & NO_MRR hint testing
699
384
set optimizer_switch=default;
0 commit comments