Skip to content

Commit 14e8550

Browse files
committed
By default, feature space should be equal to query_hash: minor fix and a set
of regression tests.
1 parent 9079bc4 commit 14e8550

File tree

3 files changed

+104
-10
lines changed

3 files changed

+104
-10
lines changed

‎expected/aqo_disabled.out

+77-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,59 @@ AS (
1616
) INSERT INTO aqo_test1 (SELECT * FROM t);
1717
CREATE INDEX aqo_test1_idx_a ON aqo_test1 (a);
1818
ANALYZE aqo_test1;
19+
CREATE EXTENSION aqo;
20+
SET aqo.mode = 'controlled';
21+
CREATE TABLE tmp1 AS SELECT * FROM aqo_test0
22+
WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
23+
SELECT count(*) FROM tmp1;
24+
count
25+
-------
26+
3
27+
(1 row)
28+
29+
DROP TABLE tmp1;
30+
CREATE TABLE tmp1 AS SELECT t1.a, t2.b, t3.c
31+
FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3
32+
WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b = t3.b;
33+
SELECT count(*) FROM tmp1;
34+
count
35+
-------
36+
0
37+
(1 row)
38+
39+
DROP TABLE tmp1;
40+
EXPLAIN SELECT * FROM aqo_test0
41+
WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
42+
QUERY PLAN
43+
----------------------------------------------------------------------------------
44+
Index Scan using aqo_test0_idx_a on aqo_test0 (cost=0.28..8.35 rows=1 width=16)
45+
Index Cond: (a < 3)
46+
Filter: ((b < 3) AND (c < 3) AND (d < 3))
47+
(3 rows)
48+
49+
EXPLAIN SELECT t1.a, t2.b, t3.c
50+
FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3
51+
WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b = t3.b;
52+
QUERY PLAN
53+
------------------------------------------------------------------------------------------------
54+
Nested Loop (cost=0.28..50.59 rows=1 width=12)
55+
Join Filter: (t1.b = t3.b)
56+
-> Nested Loop (cost=0.28..9.56 rows=1 width=12)
57+
-> Seq Scan on aqo_test1 t1 (cost=0.00..1.25 rows=1 width=8)
58+
Filter: (a < 1)
59+
-> Index Scan using aqo_test0_idx_a on aqo_test0 t2 (cost=0.28..8.30 rows=1 width=8)
60+
Index Cond: (a = t1.a)
61+
Filter: (c < 1)
62+
-> Seq Scan on aqo_test0 t3 (cost=0.00..41.02 rows=1 width=8)
63+
Filter: ((b < 1) AND (d < 0))
64+
(10 rows)
65+
66+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
67+
count
68+
-------
69+
0
70+
(1 row)
71+
1972
SET aqo.mode = 'disabled';
2073
CREATE TABLE tmp1 AS SELECT * FROM aqo_test0
2174
WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
@@ -62,7 +115,12 @@ WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b =
62115
Filter: ((b < 1) AND (d < 0))
63116
(10 rows)
64117

65-
CREATE EXTENSION aqo;
118+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
119+
count
120+
-------
121+
0
122+
(1 row)
123+
66124
SET aqo.mode = 'intelligent';
67125
CREATE TABLE tmp1 AS SELECT * FROM aqo_test0
68126
WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
@@ -83,6 +141,12 @@ SELECT count(*) FROM tmp1;
83141
(1 row)
84142

85143
DROP TABLE tmp1;
144+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
145+
count
146+
-------
147+
0
148+
(1 row)
149+
86150
SET aqo.mode = 'controlled';
87151
UPDATE aqo_queries SET learn_aqo = true, use_aqo = true, auto_tuning = false;
88152
EXPLAIN SELECT * FROM aqo_test0
@@ -111,6 +175,12 @@ WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b =
111175
Filter: ((b < 1) AND (d < 0))
112176
(10 rows)
113177

178+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
179+
count
180+
-------
181+
0
182+
(1 row)
183+
114184
SET aqo.mode = 'disabled';
115185
EXPLAIN SELECT * FROM aqo_test0
116186
WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
@@ -138,6 +208,12 @@ WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b =
138208
Filter: ((b < 1) AND (d < 0))
139209
(10 rows)
140210

211+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
212+
count
213+
-------
214+
0
215+
(1 row)
216+
141217
DROP EXTENSION aqo;
142218
DROP INDEX aqo_test0_idx_a;
143219
DROP TABLE aqo_test0;

‎preprocessing.c

+4-7
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ aqo_planner(Query *parse,
172172
selectivity_cache_clear();
173173
query_context.query_hash = get_query_hash(parse, query_string);
174174

175+
/* By default, they should be equal */
176+
query_context.fspace_hash = query_context.query_hash;
177+
175178
if (query_is_deactivated(query_context.query_hash) ||
176179
list_member_uint64(cur_classes,query_context.query_hash))
177180
{
@@ -211,7 +214,6 @@ aqo_planner(Query *parse,
211214
query_context.adding_query = true;
212215
query_context.learn_aqo = true;
213216
query_context.use_aqo = false;
214-
query_context.fspace_hash = query_context.query_hash;
215217
query_context.auto_tuning = true;
216218
query_context.collect_stat = true;
217219
break;
@@ -220,7 +222,7 @@ aqo_planner(Query *parse,
220222
query_context.learn_aqo = true;
221223
query_context.use_aqo = true;
222224
query_context.auto_tuning = false;
223-
query_context.fspace_hash = 0;
225+
query_context.fspace_hash = 0; /* Use common feature space */
224226
query_context.collect_stat = false;
225227
break;
226228
case AQO_MODE_CONTROLLED:
@@ -239,7 +241,6 @@ aqo_planner(Query *parse,
239241
query_context.adding_query = true;
240242
query_context.learn_aqo = true;
241243
query_context.use_aqo = true;
242-
query_context.fspace_hash = query_context.query_hash;
243244
query_context.auto_tuning = false;
244245
query_context.collect_stat = true;
245246
break;
@@ -287,7 +288,6 @@ aqo_planner(Query *parse,
287288
* suppressed manually) and collect stats.
288289
*/
289290
query_context.collect_stat = true;
290-
query_context.fspace_hash = query_context.query_hash;
291291
break;
292292

293293
case AQO_MODE_INTELLIGENT:
@@ -331,14 +331,11 @@ aqo_planner(Query *parse,
331331
}
332332

333333
if (force_collect_stat)
334-
{
335334
/*
336335
* If this GUC is set, AQO will analyze query results and collect
337336
* query execution statistics in any mode.
338337
*/
339338
query_context.collect_stat = true;
340-
query_context.fspace_hash = query_context.query_hash;
341-
}
342339

343340
if (!IsQueryDisabled())
344341
/* It's good place to set timestamp of start of a planning process. */

‎sql/aqo_disabled.sql

+23-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,25 @@ AS (
1717
) INSERT INTO aqo_test1 (SELECT * FROM t);
1818
CREATE INDEX aqo_test1_idx_a ON aqo_test1 (a);
1919
ANALYZE aqo_test1;
20+
CREATE EXTENSION aqo;
21+
22+
SET aqo.mode = 'controlled';
23+
24+
CREATE TABLE tmp1 AS SELECT * FROM aqo_test0
25+
WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
26+
SELECT count(*) FROM tmp1;
27+
DROP TABLE tmp1;
28+
CREATE TABLE tmp1 AS SELECT t1.a, t2.b, t3.c
29+
FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3
30+
WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b = t3.b;
31+
SELECT count(*) FROM tmp1;
32+
DROP TABLE tmp1;
33+
EXPLAIN SELECT * FROM aqo_test0
34+
WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
35+
EXPLAIN SELECT t1.a, t2.b, t3.c
36+
FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3
37+
WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b = t3.b;
38+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
2039

2140
SET aqo.mode = 'disabled';
2241

@@ -38,8 +57,7 @@ EXPLAIN SELECT t1.a, t2.b, t3.c
3857
FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3
3958
WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b = t3.b;
4059

41-
CREATE EXTENSION aqo;
42-
60+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
4361
SET aqo.mode = 'intelligent';
4462

4563
CREATE TABLE tmp1 AS SELECT * FROM aqo_test0
@@ -53,6 +71,7 @@ WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b =
5371
SELECT count(*) FROM tmp1;
5472
DROP TABLE tmp1;
5573

74+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
5675
SET aqo.mode = 'controlled';
5776

5877
UPDATE aqo_queries SET learn_aqo = true, use_aqo = true, auto_tuning = false;
@@ -64,6 +83,7 @@ EXPLAIN SELECT t1.a, t2.b, t3.c
6483
FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3
6584
WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b = t3.b;
6685

86+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
6787
SET aqo.mode = 'disabled';
6888

6989
EXPLAIN SELECT * FROM aqo_test0
@@ -72,6 +92,7 @@ WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
7292
EXPLAIN SELECT t1.a, t2.b, t3.c
7393
FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3
7494
WHERE t1.a < 1 AND t3.b < 1 AND t2.c < 1 AND t3.d < 0 AND t1.a = t2.a AND t1.b = t3.b;
95+
SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be zero
7596

7697
DROP EXTENSION aqo;
7798

0 commit comments

Comments
 (0)