File: eq_range_statistics.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (106 lines) | stat: -rw-r--r-- 3,407 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

# Tests for eq_range_index_dive_limit variable: 
#   test that the number of ranges are counted correctly and 
#   index statistics kicks in when more than 
#   eq_range_index_dive_limit equality ranges are in the 
#   predicate

--source include/have_optimizer_trace.inc
--source include/have_debug.inc
--source include/not_hypergraph.inc  # Does not output the same optimizer trace.

SET optimizer_trace_max_mem_size=1048576; # 1MB
SET optimizer_trace="enabled=on,one_line=off";
SET end_markers_in_json="on";

SET eq_range_index_dive_limit=default;
SELECT @@eq_range_index_dive_limit;

CREATE TABLE t1 (
       a INT, 
       b INT, 
       KEY (a,b)
);

INSERT INTO t1 VALUES (1,1), (2,2), (3,3);
INSERT INTO t1 VALUES (4,1), (4,2), (4,3);
INSERT INTO t1 VALUES (5,1), (5,2), (5,3);
--replace_column 7 #
SHOW INDEX FROM t1;
ANALYZE TABLE t1;      
--replace_column 7 #
SHOW INDEX FROM t1;

--echo #####
--echo # Apply knowledge about the statistics (each index value for 
--echo # the first key part has an estimate of 2 rows) to ensure that 
--echo # index statistics kicks in correctly.
--echo #####

--echo # Index dives are done, giving correct estimate of 3 records
EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3);

SET eq_range_index_dive_limit=3;
SELECT @@eq_range_index_dive_limit;

# Crash server if records_in_range() is called
SET SESSION DEBUG="+d,crash_records_in_range";
--echo # Index statistics kicks in, giving incorrect estimate of 3x2=6 records
EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3);
SELECT * FROM t1 WHERE a IN (1,2,3);
SET SESSION DEBUG="-d,crash_records_in_range";

--echo #####
--echo # Below: A number of tests to verify that the number of equality ranges
--echo # are counted correctly
--echo #####

# The limit is 3

--echo
--echo # 2 equality ranges: should not use index statistics
EXPLAIN SELECT * FROM t1 WHERE a=5 OR a>10 OR a IN (1);
SELECT * FROM information_schema.OPTIMIZER_TRACE;

# This query will use index statistics (as shown in trace) but
# we cannot make it crash if records_in_range() is called
# because the "a>10" range will correctly call records_in_range()
--echo
--echo # 3 equality ranges: should use index statistics
EXPLAIN SELECT * FROM t1 WHERE a=5 OR a>10 OR a IN (1,2);
SELECT * FROM information_schema.OPTIMIZER_TRACE;

# Crash server if records_in_range() is called
--echo
--echo # 3 equality ranges: should use index statistics
SET SESSION DEBUG="+d,crash_records_in_range";
EXPLAIN SELECT * FROM t1 WHERE a=5 AND (b=2 OR b=3 OR b=4);
SELECT * FROM information_schema.OPTIMIZER_TRACE;
SET SESSION DEBUG="-d,crash_records_in_range";

--echo
--echo # 2 equality ranges: should not use index statistics
EXPLAIN SELECT * FROM t1 WHERE a=5 AND (b=2 OR b=3 OR b>4);
SELECT * FROM information_schema.OPTIMIZER_TRACE;

--echo
--echo # 2 equality ranges: should not use index statistics
EXPLAIN SELECT * FROM t1 WHERE a=5 AND (b=2 OR b=3 OR b IS NULL);
SELECT * FROM information_schema.OPTIMIZER_TRACE;

--echo
--echo # 0 equality ranges: should not use index statistics
EXPLAIN SELECT * FROM t1 WHERE a>5 AND (b=2 OR b=3 OR b=4);
SELECT * FROM information_schema.OPTIMIZER_TRACE;

# Turn index statistics off
SET eq_range_index_dive_limit=0;

--echo
--echo # 1 equality range: should not use index statistics
EXPLAIN SELECT * FROM t1 WHERE a=5;
SELECT * FROM information_schema.OPTIMIZER_TRACE;

DROP TABLE t1;

SET eq_range_index_dive_limit=default;