Skip to content

Commit 16275bf

Browse files
committed
File storage for query texts
1 parent ef2aa43 commit 16275bf

33 files changed

+709
-331
lines changed

aqo--1.4--1.5.sql

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,23 @@ CREATE TABLE aqo_queries (
2828
auto_tuning boolean NOT NULL
2929
);
3030

31-
CREATE TABLE aqo_query_texts (
32-
query_hash bigint CONSTRAINT aqo_query_texts_query_hash_idx PRIMARY KEY REFERENCES aqo_queries ON DELETE CASCADE,
33-
query_text text NOT NULL
34-
);
31+
CREATE FUNCTION aqo_query_texts(OUT queryid bigint, OUT query_text text)
32+
RETURNS SETOF record
33+
AS 'MODULE_PATHNAME', 'aqo_query_texts'
34+
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
35+
CREATE FUNCTION aqo_qtexts_remove(queryid bigint) RETURNS bool
36+
AS 'MODULE_PATHNAME'
37+
LANGUAGE C STRICT PARALLEL SAFE;
38+
39+
--
40+
-- Remove all records in the AQO storage.
41+
-- Return number of rows removed.
42+
--
43+
CREATE FUNCTION aqo_reset() RETURNS bigint
44+
AS 'MODULE_PATHNAME' LANGUAGE C PARALLEL SAFE;
45+
COMMENT ON FUNCTION aqo_reset() IS
46+
'Reset all data gathered by AQO';
3547

36-
/* Now redefine */
3748
CREATE FUNCTION aqo_query_stat(
3849
OUT queryid bigint,
3950
OUT execution_time_with_aqo double precision[],
@@ -50,17 +61,7 @@ AS 'MODULE_PATHNAME', 'aqo_query_stat'
5061
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
5162

5263
CREATE VIEW aqo_query_stat AS SELECT * FROM aqo_query_stat();
53-
54-
--
55-
-- Remove all records in the AQO statistics.
56-
-- Return number of rows removed.
57-
--
58-
CREATE FUNCTION aqo_stat_reset() RETURNS bigint
59-
AS 'MODULE_PATHNAME'
60-
LANGUAGE C PARALLEL SAFE;
61-
62-
COMMENT ON FUNCTION aqo_stat_reset() IS
63-
'Reset query statistics gathered by AQO';
64+
CREATE VIEW aqo_query_texts AS SELECT * FROM aqo_query_texts();
6465

6566
CREATE FUNCTION aqo_stat_remove(fs bigint) RETURNS bool
6667
AS 'MODULE_PATHNAME'
@@ -87,7 +88,7 @@ CREATE TABLE aqo_data (
8788
CREATE UNIQUE INDEX aqo_fss_access_idx ON aqo_data (fspace_hash, fsspace_hash);
8889

8990
INSERT INTO aqo_queries VALUES (0, false, false, 0, false);
90-
INSERT INTO aqo_query_texts VALUES (0, 'COMMON feature space (do not delete!)');
91+
-- INSERT INTO aqo_query_texts VALUES (0, 'COMMON feature space (do not delete!)');
9192
-- a virtual query for COMMON feature space
9293

9394
CREATE TRIGGER aqo_queries_invalidate AFTER UPDATE OR DELETE OR TRUNCATE
@@ -174,11 +175,9 @@ BEGIN
174175

175176
SELECT count(*) FROM aqo_data WHERE fspace_hash = fs INTO num;
176177

177-
/*
178-
* Remove the only from aqo_queries table. All other data will be removed by
179-
* CASCADE deletion.
180-
*/
181178
DELETE FROM aqo_queries WHERE query_hash = queryid;
179+
PERFORM aqo_stat_remove(queryid);
180+
PERFORM aqo_qtexts_remove(queryid);
182181
RETURN num;
183182
END;
184183
$$ LANGUAGE plpgsql;
@@ -216,7 +215,8 @@ BEGIN
216215

217216
-- Remove ALL feature space if one of oids isn't exists
218217
DELETE FROM aqo_queries WHERE fspace_hash = fs;
219-
PERFORM * FROM aqo_stat_remove(fs);
218+
PERFORM * FROM aqo_stat_remove(fs);
219+
PERFORM * FROM aqo_qtexts_remove(fs);
220220
END LOOP;
221221

222222
-- Calculate difference with previous state of knowledge base

aqo.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,6 @@ int get_clause_hash(Expr *clause, int nargs, int *args_hash, int *eclass_hash);
254254
extern bool find_query(uint64 qhash, QueryContextData *ctx);
255255
extern bool update_query(uint64 qhash, uint64 fhash,
256256
bool learn_aqo, bool use_aqo, bool auto_tuning);
257-
extern bool add_query_text(uint64 query_hash, const char *query_string);
258257
extern bool load_fss_ext(uint64 fs, int fss, OkNNrdata *data, List **reloids,
259258
bool isSafe);
260259
extern bool load_fss(uint64 fs, int fss, OkNNrdata *data, List **reloids,

aqo_shared.c

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,40 +180,54 @@ aqo_init_shmem(void)
180180
aqo_state = NULL;
181181
fss_htab = NULL;
182182
stat_htab = NULL;
183+
qtexts_htab = NULL;
183184

184185
LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE);
185-
aqo_state = ShmemInitStruct("aqo", sizeof(AQOSharedState), &found);
186+
aqo_state = ShmemInitStruct("AQO", sizeof(AQOSharedState), &found);
186187
if (!found)
187188
{
188189
/* First time through ... */
189190

190191
LWLockInitialize(&aqo_state->lock, LWLockNewTrancheId());
191192
aqo_state->dsm_handler = DSM_HANDLE_INVALID;
193+
aqo_state->qtexts_dsa_handler = DSM_HANDLE_INVALID;
194+
aqo_state->qtext_trancheid = LWLockNewTrancheId();
195+
aqo_state->qtexts_changed = false;
192196

193197
LWLockInitialize(&aqo_state->stat_lock, LWLockNewTrancheId());
198+
LWLockInitialize(&aqo_state->qtexts_lock, LWLockNewTrancheId());
194199
}
195200

196201
info.keysize = sizeof(htab_key);
197202
info.entrysize = sizeof(htab_entry);
198-
fss_htab = ShmemInitHash("aqo hash",
203+
fss_htab = ShmemInitHash("AQO hash",
199204
aqo_htab_max_items, aqo_htab_max_items,
200205
&info,
201206
HASH_ELEM | HASH_BLOBS);
202207

203208
info.keysize = sizeof(((StatEntry *) 0)->queryid);
204209
info.entrysize = sizeof(StatEntry);
205-
stat_htab = ShmemInitHash("aqo stat hash",
210+
stat_htab = ShmemInitHash("AQO Stat HTAB",
206211
fs_max_items, fs_max_items,
207-
&info,
208-
HASH_ELEM | HASH_BLOBS);
212+
&info, HASH_ELEM | HASH_BLOBS);
213+
214+
/* Init shared memory table for query texts */
215+
info.keysize = sizeof(((QueryTextEntry *) 0)->queryid);
216+
info.entrysize = sizeof(QueryTextEntry);
217+
qtexts_htab = ShmemInitHash("AQO Query Texts HTAB",
218+
fs_max_items, fs_max_items,
219+
&info, HASH_ELEM | HASH_BLOBS);
209220

210221
LWLockRelease(AddinShmemInitLock);
211-
LWLockRegisterTranche(aqo_state->lock.tranche, "aqo");
212-
LWLockRegisterTranche(aqo_state->stat_lock.tranche, "aqo stat storage");
222+
LWLockRegisterTranche(aqo_state->lock.tranche, "AQO");
223+
LWLockRegisterTranche(aqo_state->stat_lock.tranche, "AQO Stat Lock Tranche");
224+
LWLockRegisterTranche(aqo_state->qtexts_lock.tranche, "AQO QTexts Lock Tranche");
225+
LWLockRegisterTranche(aqo_state->qtext_trancheid, "AQO Query Texts Tranche");
226+
213227

214228
if (!IsUnderPostmaster)
215229
{
216-
on_shmem_exit(on_shmem_shutdown, (Datum) 0);
230+
before_shmem_exit(on_shmem_shutdown, (Datum) 0);
217231
aqo_stat_load();
218232
}
219233
}

aqo_shared.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ typedef struct AQOSharedState
3030

3131
/* Storage fields */
3232
LWLock stat_lock; /* lock for access to stat storage */
33+
34+
LWLock qtexts_lock; /* Lock for shared fields below */
35+
dsa_handle qtexts_dsa_handler; /* DSA area for storing of query texts */
36+
int qtext_trancheid;
37+
bool qtexts_changed;
3338
} AQOSharedState;
3439

3540

expected/aqo_controlled.out

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,4 +297,11 @@ DROP INDEX aqo_test1_idx_a;
297297
DROP TABLE aqo_test1;
298298
DROP INDEX aqo_test2_idx_a;
299299
DROP TABLE aqo_test2;
300+
-- XXX: extension dropping doesn't clear file storage. Do it manually.
301+
SELECT aqo_reset();
302+
aqo_reset
303+
-----------
304+
22
305+
(1 row)
306+
300307
DROP EXTENSION aqo;

expected/aqo_disabled.out

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,13 @@ SELECT count(*) FROM aqo_queries WHERE query_hash <> fspace_hash; -- Should be z
215215
0
216216
(1 row)
217217

218+
-- XXX: extension dropping doesn't clear file storage. Do it manually.
219+
SELECT aqo_reset();
220+
aqo_reset
221+
-----------
222+
8
223+
(1 row)
224+
218225
DROP EXTENSION aqo;
219226
DROP INDEX aqo_test0_idx_a;
220227
DROP TABLE aqo_test0;

expected/aqo_forced.out

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,11 @@ DROP INDEX aqo_test0_idx_a;
8282
DROP TABLE aqo_test0;
8383
DROP INDEX aqo_test1_idx_a;
8484
DROP TABLE aqo_test1;
85+
-- XXX: extension dropping doesn't clear file storage. Do it manually.
86+
SELECT aqo_reset();
87+
aqo_reset
88+
-----------
89+
0
90+
(1 row)
91+
8592
DROP EXTENSION aqo;

expected/aqo_intelligent.out

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,4 +503,11 @@ DROP INDEX aqo_test0_idx_a;
503503
DROP TABLE aqo_test0;
504504
DROP INDEX aqo_test1_idx_a;
505505
DROP TABLE aqo_test1;
506+
-- XXX: extension dropping doesn't clear file storage. Do it manually.
507+
SELECT aqo_reset();
508+
aqo_reset
509+
-----------
510+
48
511+
(1 row)
512+
506513
DROP EXTENSION aqo;

expected/aqo_learn.out

Lines changed: 34 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -244,72 +244,36 @@ SELECT aqo_cleanup();
244244

245245
-- Result of the query below should be empty
246246
SELECT * FROM aqo_query_texts aqt1, aqo_query_texts aqt2
247-
WHERE aqt1.query_text = aqt2.query_text AND aqt1.query_hash <> aqt2.query_hash;
248-
query_hash | query_text | query_hash | query_text
249-
------------+------------+------------+------------
247+
WHERE aqt1.query_text = aqt2.query_text AND aqt1.queryid <> aqt2.queryid;
248+
queryid | query_text | queryid | query_text
249+
---------+------------+---------+------------
250250
(0 rows)
251251

252252
-- Fix the state of the AQO data
253-
SELECT reliability,nfeatures,query_text
253+
SELECT min(reliability),sum(nfeatures),query_text
254254
FROM aqo_data ad, aqo_query_texts aqt
255-
WHERE aqt.query_hash = ad.fspace_hash
256-
ORDER BY (md5(query_text))
255+
WHERE aqt.queryid = ad.fspace_hash
256+
GROUP BY (query_text) ORDER BY (md5(query_text))
257257
;
258-
reliability | nfeatures | query_text
259-
-------------+-----------+----------------------------------------------------------------------------------------
260-
{1} | 1 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test1 AS t1, aqo_test0 AS t2 +
261-
| | WHERE t1.a < 1 AND t2.b < 1 AND t2.c < 1 AND t2.d < 1 AND t1.a = t2.a;
262-
{1} | 5 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test1 AS t1, aqo_test0 AS t2 +
263-
| | WHERE t1.a < 1 AND t2.b < 1 AND t2.c < 1 AND t2.d < 1 AND t1.a = t2.a;
264-
{1} | 4 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test1 AS t1, aqo_test0 AS t2 +
265-
| | WHERE t1.a < 1 AND t2.b < 1 AND t2.c < 1 AND t2.d < 1 AND t1.a = t2.a;
266-
{1,1,1} | 4 | EXPLAIN SELECT * FROM aqo_test0 +
267-
| | WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
268-
{1} | 0 | SELECT count(*) FROM tmp1;
269-
{1} | 0 | SELECT count(*) FROM tmp1;
270-
{1} | 6 | EXPlAIN SELECT t1.a, t2.b, t3.c +
271-
| | FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3 +
272-
| | 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;
273-
{1} | 1 | EXPlAIN SELECT t1.a, t2.b, t3.c +
274-
| | FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3 +
275-
| | 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;
276-
{1} | 2 | EXPlAIN SELECT t1.a, t2.b, t3.c +
277-
| | FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3 +
278-
| | 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;
279-
{1} | 3 | EXPlAIN SELECT t1.a, t2.b, t3.c +
280-
| | FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3 +
281-
| | 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;
282-
{1} | 2 | EXPlAIN SELECT t1.a, t2.b, t3.c +
283-
| | FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3 +
284-
| | 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;
285-
{1} | 2 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test0 AS t1, aqo_test0 AS t2 +
286-
| | WHERE t1.a < 1 AND t1.b < 1 AND t2.c < 1 AND t2.d < 1;
287-
{1} | 2 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test0 AS t1, aqo_test0 AS t2 +
288-
| | WHERE t1.a < 1 AND t1.b < 1 AND t2.c < 1 AND t2.d < 1;
289-
{1} | 4 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test0 AS t1, aqo_test0 AS t2 +
290-
| | WHERE t1.a < 1 AND t1.b < 1 AND t2.c < 1 AND t2.d < 1;
291-
{1} | 2 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c +
292-
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3 +
293-
| | WHERE t1.a = t2.b AND t2.a = t3.b;
294-
{1} | 1 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c +
295-
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3 +
296-
| | WHERE t1.a = t2.b AND t2.a = t3.b;
297-
{1} | 0 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c +
298-
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3 +
299-
| | WHERE t1.a = t2.b AND t2.a = t3.b;
300-
{1} | 3 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c, t4.a AS d +
301-
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3, aqo_test1 AS t4 +
302-
| | WHERE t1.a = t2.b AND t2.a = t3.b AND t3.a = t4.b;
303-
{1} | 0 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c, t4.a AS d +
304-
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3, aqo_test1 AS t4 +
305-
| | WHERE t1.a = t2.b AND t2.a = t3.b AND t3.a = t4.b;
306-
{1} | 1 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c, t4.a AS d +
307-
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3, aqo_test1 AS t4 +
308-
| | WHERE t1.a = t2.b AND t2.a = t3.b AND t3.a = t4.b;
309-
{1} | 2 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c, t4.a AS d +
310-
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3, aqo_test1 AS t4 +
311-
| | WHERE t1.a = t2.b AND t2.a = t3.b AND t3.a = t4.b;
312-
(21 rows)
258+
min | sum | query_text
259+
---------+-----+----------------------------------------------------------------------------------------
260+
{1} | 10 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test1 AS t1, aqo_test0 AS t2 +
261+
| | WHERE t1.a < 1 AND t2.b < 1 AND t2.c < 1 AND t2.d < 1 AND t1.a = t2.a;
262+
{1,1,1} | 4 | EXPLAIN SELECT * FROM aqo_test0 +
263+
| | WHERE a < 3 AND b < 3 AND c < 3 AND d < 3;
264+
{1} | 0 | SELECT count(*) FROM tmp1;
265+
{1} | 14 | EXPlAIN SELECT t1.a, t2.b, t3.c +
266+
| | FROM aqo_test1 AS t1, aqo_test0 AS t2, aqo_test0 AS t3 +
267+
| | 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;
268+
{1} | 8 | EXPLAIN SELECT t1.a, t2.b FROM aqo_test0 AS t1, aqo_test0 AS t2 +
269+
| | WHERE t1.a < 1 AND t1.b < 1 AND t2.c < 1 AND t2.d < 1;
270+
{1} | 3 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c +
271+
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3 +
272+
| | WHERE t1.a = t2.b AND t2.a = t3.b;
273+
{1} | 6 | EXPLAIN SELECT t1.a AS a, t2.a AS b, t3.a AS c, t4.a AS d +
274+
| | FROM aqo_test1 AS t1, aqo_test1 AS t2, aqo_test1 AS t3, aqo_test1 AS t4 +
275+
| | WHERE t1.a = t2.b AND t2.a = t3.b AND t3.a = t4.b;
276+
(7 rows)
313277

314278
DROP TABLE tmp1;
315279
SET aqo.mode = 'controlled';
@@ -568,7 +532,7 @@ SELECT count(*) FROM
568532
1
569533
(1 row)
570534

571-
SELECT query_text FROM aqo_query_texts WHERE query_hash <> 0; -- Check query
535+
SELECT query_text FROM aqo_query_texts WHERE queryid <> 0; -- Check query
572536
query_text
573537
----------------------------------------------------------------------------
574538
explain analyze +
@@ -736,10 +700,17 @@ SELECT count(*) FROM (SELECT fspace_hash FROM aqo_data GROUP BY (fspace_hash)) A
736700
9
737701
(1 row)
738702

703+
DROP FUNCTION check_estimated_rows;
739704
RESET aqo.join_threshold;
740705
DROP INDEX aqo_test0_idx_a;
741706
DROP TABLE aqo_test0;
742707
DROP INDEX aqo_test1_idx_a;
743708
DROP TABLE aqo_test1;
709+
-- XXX: extension dropping doesn't clear file storage. Do it manually.
710+
SELECT aqo_reset();
711+
aqo_reset
712+
-----------
713+
18
714+
(1 row)
715+
744716
DROP EXTENSION aqo;
745-
DROP FUNCTION check_estimated_rows;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy