Commit 01cfc380 authored by Varun Gupta's avatar Varun Gupta

WIP

Checking whether the join cardinality estimates are accurate
should only be done when the order by limit optimization is
enabled.
parent 218c6a6b
......@@ -2,42 +2,42 @@
--echo # BASIC CASES
--echo #
EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10;
EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE t1.b > 10;
EXPLAIN SELECT * FROM t1 WHERE t1.b > 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE t1.b < 10;
EXPLAIN SELECT * FROM t1 WHERE t1.b < 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE t1.b = 10;
EXPLAIN SELECT * FROM t1 WHERE t1.b = 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10;
EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3);
EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3) ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5;
EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Equi-join condition
EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b;
EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # CASE where selectivity estimates are not accurate
EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10;
EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
......@@ -46,7 +46,7 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # selectivity for the predicate t1.c=10
--echo #
EXPLAIN SELECT * FROM t1 WHERE t1.c = 10;
EXPLAIN SELECT * FROM t1 WHERE t1.c = 10 ORDER BY t1.a LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
......@@ -54,15 +54,16 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # BASIC CASES FOR AND CONJUNCT
--echo #
EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6;
EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6;
EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10;
EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
......@@ -70,22 +71,24 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # BASIC CASES FOR OR CONJUNCT
--echo #
EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2;
EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0;
EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # The cardinality here would be not accurate because for the
--echo # OR conjunct all predicates can't be resolved to one column
EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10;
EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6;
EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
......@@ -93,15 +96,18 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # COMPLEX CASES WITH AND-OR CONJUNCTS
--echo #
EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10);
EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10)
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10);
EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10)
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10);
EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10)
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
......@@ -109,11 +115,13 @@ EXPLAIN SELECT * FROM t1
WHERE ((t1.a > 20 and t1.a < 30) or (t1.a > 40 and t1.a < 50)) AND
((t1.a > 25 and t1.a < 35) or (t1.a > 45 and t1.a < 55)) OR
((t1.a > 120 and t1.a < 130) or (t1.a > 140 and t1.a < 150)) AND
((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155));
((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155))
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5));
EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5))
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
......@@ -121,16 +129,19 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Test with subquery
--echo #
EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1);
EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1)
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1
WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1);
WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1)
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1
WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11;
WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11
ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
This diff is collapsed.
This diff is collapsed.
......@@ -8486,7 +8486,7 @@ choose_plan(JOIN *join, table_map join_tables)
Json_writer_object wrapper(thd);
if (join->conds && (join->sort_nest_possible || thd->trace_started()))
if (join->conds && join->sort_nest_possible)
{
bool cardinality_accurate;
SAME_FIELD arg= {NULL, FALSE};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment