Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1a2bec2

Browse files
committed
Fix subquery problems.
All query-related AQO parameters (use_aqo, starttime e.t.c) is contained in QueryContextData structure.Before query execution it is stored into query context and is extracted before AQO learn to correct learning.Also fix zero-matrix problem.
1 parent922c510 commit1a2bec2

File tree

8 files changed

+180
-139
lines changed

8 files changed

+180
-139
lines changed

‎aqo.c‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,12 @@ intaqo_k = 3;
3535
intaqo_K=30;
3636
doublelog_selectivity_lower_bound=-30;
3737

38-
/* Parameters for current query */
39-
intquery_hash;
40-
boollearn_aqo;
41-
booluse_aqo;
42-
intfspace_hash;
43-
boolauto_tuning;
44-
boolcollect_stat;
45-
booladding_query;
46-
boolexplain_only;
47-
boolexplain_aqo;
48-
49-
/* Query execution time */
50-
instr_timequery_starttime;
51-
doublequery_planning_time;
52-
5338
/*
5439
* Currently we use it only to store query_text string which is initialized
5540
* after a query parsing and is used during the query planning.
5641
*/
5742
MemoryContextAQOMemoryContext;
43+
QueryContextDataquery_context;
5844

5945
/* Saved hook values */
6046
post_parse_analyze_hook_typeprev_post_parse_analyze_hook;

‎aqo.h‎

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,23 @@ typedef struct
188188
int64executions_without_aqo;
189189
}QueryStat;
190190

191+
/* Parameters for current query */
192+
typedefstructQueryContextData
193+
{
194+
intquery_hash;
195+
boollearn_aqo;
196+
booluse_aqo;
197+
intfspace_hash;
198+
boolauto_tuning;
199+
boolcollect_stat;
200+
booladding_query;
201+
boolexplain_only;
202+
boolexplain_aqo;
203+
/* Query execution time */
204+
instr_timequery_starttime;
205+
doublequery_planning_time;
206+
}QueryContextData;
207+
191208
/* Parameters of autotuning */
192209
externintaqo_stat_size;
193210
externintauto_tuning_window_size;
@@ -204,19 +221,7 @@ extern intaqo_K;
204221
externdoublelog_selectivity_lower_bound;
205222

206223
/* Parameters for current query */
207-
externintquery_hash;
208-
externintfspace_hash;
209-
externboollearn_aqo;
210-
externbooluse_aqo;
211-
externboolauto_tuning;
212-
externboolcollect_stat;
213-
externbooladding_query;
214-
externboolexplain_only;
215-
externboolexplain_aqo;
216-
217-
/* Query execution time */
218-
externinstr_timequery_starttime;
219-
externdoublequery_planning_time;
224+
externQueryContextDataquery_context;
220225

221226
/* Memory context for long-live data */
222227
externMemoryContextAQOMemoryContext;

‎auto_tuning.c‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,14 @@ automatical_query_tuning(int query_hash, QueryStat * stat)
137137
int64num_iterations;
138138

139139
num_iterations=stat->executions_with_aqo+stat->executions_without_aqo;
140-
learn_aqo= true;
140+
query_context.learn_aqo= true;
141141
if (stat->executions_without_aqo<auto_tuning_window_size+1)
142-
use_aqo= false;
142+
query_context.use_aqo= false;
143143
elseif (!converged_cq(stat->cardinality_error_with_aqo,
144144
stat->cardinality_error_with_aqo_size)&&
145145
!is_in_infinite_loop_cq(stat->cardinality_error_with_aqo,
146146
stat->cardinality_error_with_aqo_size))
147-
use_aqo= true;
147+
query_context.use_aqo= true;
148148
else
149149
{
150150
t_aqo=get_estimation(stat->execution_time_with_aqo,
@@ -163,12 +163,12 @@ automatical_query_tuning(int query_hash, QueryStat * stat)
163163
p_use /=1-2 / (1+exp(-0.5 /unstability));
164164

165165
/* borrowed from drandom() in float.c */
166-
use_aqo= (random() / ((double)MAX_RANDOM_VALUE+1))<p_use;
167-
learn_aqo=use_aqo;
166+
query_context.use_aqo= (random() / ((double)MAX_RANDOM_VALUE+1))<p_use;
167+
query_context.learn_aqo=query_context.use_aqo;
168168
}
169169

170170
if (num_iterations <=auto_tuning_max_iterations||p_use>0.5)
171-
update_query(query_hash,learn_aqo,use_aqo,fspace_hash, true);
171+
update_query(query_hash,query_context.learn_aqo,query_context.use_aqo,query_context.fspace_hash, true);
172172
else
173-
update_query(query_hash, false, false,fspace_hash, false);
173+
update_query(query_hash, false, false,query_context.fspace_hash, false);
174174
}

‎cardinality_hooks.c‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,13 @@ aqo_set_baserel_rows_estimate(PlannerInfo *root, RelOptInfo *rel)
126126
List*relids;
127127
List*selectivities=NULL;
128128

129-
if (use_aqo||learn_aqo)
129+
if (query_context.use_aqo||query_context.learn_aqo)
130130
selectivities=get_selectivities(root,rel->baserestrictinfo,0,
131131
JOIN_INNER,NULL);
132132

133-
if (!use_aqo)
133+
if (!query_context.use_aqo)
134134
{
135-
if (learn_aqo)
135+
if (query_context.learn_aqo)
136136
list_free_deep(selectivities);
137137

138138
call_default_set_baserel_rows_estimate(root,rel);
@@ -174,7 +174,7 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
174174
int*eclass_hash;
175175
intcurrent_hash;
176176

177-
if (use_aqo||learn_aqo)
177+
if (query_context.use_aqo||query_context.learn_aqo)
178178
{
179179
allclauses=list_concat(list_copy(param_clauses),
180180
list_copy(rel->baserestrictinfo));
@@ -197,9 +197,9 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
197197
pfree(eclass_hash);
198198
}
199199

200-
if (!use_aqo)
200+
if (!query_context.use_aqo)
201201
{
202-
if (learn_aqo)
202+
if (query_context.learn_aqo)
203203
{
204204
list_free_deep(selectivities);
205205
list_free(allclauses);
@@ -241,13 +241,13 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
241241
List*outer_selectivities;
242242
List*current_selectivities=NULL;
243243

244-
if (use_aqo||learn_aqo)
244+
if (query_context.use_aqo||query_context.learn_aqo)
245245
current_selectivities=get_selectivities(root,restrictlist,0,
246246
sjinfo->jointype,sjinfo);
247247

248-
if (!use_aqo)
248+
if (!query_context.use_aqo)
249249
{
250-
if (learn_aqo)
250+
if (query_context.learn_aqo)
251251
list_free_deep(current_selectivities);
252252

253253
call_default_set_joinrel_size_estimates(root,rel,
@@ -304,13 +304,13 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
304304
List*outer_selectivities;
305305
List*current_selectivities=NULL;
306306

307-
if (use_aqo||learn_aqo)
307+
if (query_context.use_aqo||query_context.learn_aqo)
308308
current_selectivities=get_selectivities(root,restrict_clauses,0,
309309
sjinfo->jointype,sjinfo);
310310

311-
if (!use_aqo)
311+
if (!query_context.use_aqo)
312312
{
313-
if (learn_aqo)
313+
if (query_context.learn_aqo)
314314
list_free_deep(current_selectivities);
315315

316316
returncall_default_get_parameterized_joinrel_size(root,rel,

‎hash.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ get_fss_for_object(List *clauselist, List *selectivities, List *relidslist,
144144
sizeof(**features),double_cmp);
145145
i=j;
146146
}
147+
147148
*nfeatures=n-sh;
148149
(*features)=repalloc(*features, (*nfeatures)*sizeof(**features));
149150

‎postprocessing.c‎

Lines changed: 80 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include"aqo.h"
2+
#include"utils/queryenvironment.h"
23

34
/*****************************************************************************
45
*
@@ -37,7 +38,8 @@ static void update_query_stat_row(double *et, int *et_size,
3738
doubleexecution_time,
3839
doublecardinality_error,
3940
int64*n_exec);
40-
41+
staticvoidStoreToQueryContext(QueryDesc*queryDesc);
42+
staticvoidExtractFromQueryContext(QueryDesc*queryDesc);
4143

4244
/*
4345
* This is the critical section: only one runner is allowed to be inside this
@@ -100,21 +102,26 @@ learn_sample(List *clauselist, List *selectivities, List *relidslist,
100102
get_fss_for_object(clauselist,selectivities,relidslist,
101103
&matrix_cols,&fss_hash,&features);
102104

103-
matrix=palloc(sizeof(*matrix)*aqo_K);
104-
for (i=0;i<aqo_K;++i)
105-
matrix[i]=palloc0(sizeof(**matrix)*matrix_cols);
106-
targets=palloc0(sizeof(*targets)*aqo_K);
107-
108-
/* Here should be critical section */
109-
atomic_fss_learn_step(fss_hash,matrix_cols,matrix,targets,
110-
features,target);
111-
/* Here should be the end of critical section */
105+
/* In the case of zero matrix we not need to learn */
106+
if (matrix_cols>0)
107+
{
108+
matrix=palloc(sizeof(*matrix)*aqo_K);
109+
for (i=0;i<aqo_K;++i)
110+
matrix[i]=palloc0(sizeof(**matrix)*matrix_cols);
111+
targets=palloc0(sizeof(*targets)*aqo_K);
112+
113+
/* Here should be critical section */
114+
atomic_fss_learn_step(fss_hash,matrix_cols,matrix,targets,
115+
features,target);
116+
/* Here should be the end of critical section */
117+
118+
for (i=0;i<aqo_K;++i)
119+
pfree(matrix[i]);
120+
pfree(matrix);
121+
pfree(targets);
122+
}
112123

113-
for (i=0;i<aqo_K;++i)
114-
pfree(matrix[i]);
115-
pfree(matrix);
116124
pfree(features);
117-
pfree(targets);
118125
}
119126

120127
/*
@@ -304,14 +311,17 @@ aqo_ExecutorStart(QueryDesc *queryDesc, int eflags)
304311
instr_timecurrent_time;
305312

306313
INSTR_TIME_SET_CURRENT(current_time);
307-
INSTR_TIME_SUBTRACT(current_time,query_starttime);
308-
query_planning_time=INSTR_TIME_GET_DOUBLE(current_time);
314+
INSTR_TIME_SUBTRACT(current_time,query_context.query_starttime);
315+
query_context.query_planning_time=INSTR_TIME_GET_DOUBLE(current_time);
309316

310-
explain_only= ((eflags&EXEC_FLAG_EXPLAIN_ONLY)!=0);
317+
query_context.explain_only= ((eflags&EXEC_FLAG_EXPLAIN_ONLY)!=0);
311318

312-
if (learn_aqo&& !explain_only)
319+
if (query_context.learn_aqo&& !query_context.explain_only)
313320
queryDesc->instrument_options |=INSTRUMENT_ROWS;
314321

322+
/* Save all query-related parameters into the query context. */
323+
StoreToQueryContext(queryDesc);
324+
315325
if (prev_ExecutorStart_hook)
316326
prev_ExecutorStart_hook(queryDesc,eflags);
317327
else
@@ -369,13 +379,15 @@ learn_query_stat(QueryDesc *queryDesc)
369379
QueryStat*stat;
370380
instr_timeendtime;
371381

372-
if (explain_only)
382+
ExtractFromQueryContext(queryDesc);
383+
384+
if (query_context.explain_only)
373385
{
374-
learn_aqo= false;
375-
collect_stat= false;
386+
query_context.learn_aqo= false;
387+
query_context.collect_stat= false;
376388
}
377389

378-
if (learn_aqo)
390+
if (query_context.learn_aqo)
379391
{
380392
cardinality_sum_errors=0;
381393
cardinality_num_objects=0;
@@ -392,29 +404,29 @@ learn_query_stat(QueryDesc *queryDesc)
392404
}
393405
}
394406

395-
if (collect_stat)
407+
if (query_context.collect_stat)
396408
{
397409
INSTR_TIME_SET_CURRENT(endtime);
398-
INSTR_TIME_SUBTRACT(endtime,query_starttime);
410+
INSTR_TIME_SUBTRACT(endtime,query_context.query_starttime);
399411
totaltime=INSTR_TIME_GET_DOUBLE(endtime);
400-
if (learn_aqo&&cardinality_num_objects)
412+
if (query_context.learn_aqo&&cardinality_num_objects)
401413
cardinality_error=cardinality_sum_errors /
402414
cardinality_num_objects;
403415
else
404416
cardinality_error=-1;
405417

406-
stat=get_aqo_stat(fspace_hash);
418+
stat=get_aqo_stat(query_context.fspace_hash);
407419
if (stat!=NULL)
408420
{
409-
if (use_aqo)
421+
if (query_context.use_aqo)
410422
update_query_stat_row(stat->execution_time_with_aqo,
411423
&stat->execution_time_with_aqo_size,
412424
stat->planning_time_with_aqo,
413425
&stat->planning_time_with_aqo_size,
414426
stat->cardinality_error_with_aqo,
415427
&stat->cardinality_error_with_aqo_size,
416-
query_planning_time,
417-
totaltime-query_planning_time,
428+
query_context.query_planning_time,
429+
totaltime-query_context.query_planning_time,
418430
cardinality_error,
419431
&stat->executions_with_aqo);
420432
else
@@ -424,13 +436,14 @@ learn_query_stat(QueryDesc *queryDesc)
424436
&stat->planning_time_without_aqo_size,
425437
stat->cardinality_error_without_aqo,
426438
&stat->cardinality_error_without_aqo_size,
427-
query_planning_time,
428-
totaltime-query_planning_time,
439+
query_context.query_planning_time,
440+
totaltime-query_context.query_planning_time,
429441
cardinality_error,
430442
&stat->executions_without_aqo);
431-
if (!adding_query&&auto_tuning)
432-
automatical_query_tuning(query_hash,stat);
433-
update_aqo_stat(fspace_hash,stat);
443+
if (!query_context.adding_query&&query_context.auto_tuning)
444+
automatical_query_tuning(query_context.query_hash,stat);
445+
446+
update_aqo_stat(query_context.fspace_hash,stat);
434447
pfree_query_stat(stat);
435448
}
436449
}
@@ -443,3 +456,36 @@ learn_query_stat(QueryDesc *queryDesc)
443456
else
444457
standard_ExecutorEnd(queryDesc);
445458
}
459+
460+
staticchar*AQOPrivateData="AQOPrivateData";
461+
462+
staticvoid
463+
StoreToQueryContext(QueryDesc*queryDesc)
464+
{
465+
EphemeralNamedRelationenr=palloc(sizeof(EphemeralNamedRelationData));
466+
467+
if (queryDesc->queryEnv==NULL)
468+
queryDesc->queryEnv=create_queryEnv();
469+
470+
enr->md.name=AQOPrivateData;
471+
enr->md.enrtuples=0;
472+
enr->md.enrtype=0;
473+
enr->md.reliddesc=InvalidOid;
474+
enr->md.tupdesc=NULL;
475+
enr->reldata=MemoryContextAlloc(AQOMemoryContext,sizeof(QueryContextData));
476+
memcpy(enr->reldata,&query_context,sizeof(QueryContextData));
477+
register_ENR(queryDesc->queryEnv,enr);
478+
}
479+
480+
staticvoid
481+
ExtractFromQueryContext(QueryDesc*queryDesc)
482+
{
483+
EphemeralNamedRelationenr;
484+
485+
Assert(queryDesc->queryEnv!=NULL);
486+
487+
enr=get_ENR(queryDesc->queryEnv,AQOPrivateData);
488+
memcpy(&query_context,enr->reldata,sizeof(QueryContextData));
489+
unregister_ENR(queryDesc->queryEnv,AQOPrivateData);
490+
pfree(enr);
491+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp