Changeset: 84cb3b570a20 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=84cb3b570a20
Added Files:
monetdb5/optimizer/opt_fastpath.c
monetdb5/optimizer/opt_fastpath.h
Modified Files:
monetdb5/optimizer/opt_commonTerms.c
monetdb5/optimizer/opt_constants.c
monetdb5/optimizer/opt_pipes.c
monetdb5/optimizer/opt_support.c
monetdb5/optimizer/opt_support.h
Branch: default
Log Message:
Fast path implementation of dominant optimizers.
Also involves a triage to differentiate between
simple and complex SQL queries.
diffs (268 lines):
diff --git a/monetdb5/optimizer/opt_commonTerms.c
b/monetdb5/optimizer/opt_commonTerms.c
--- a/monetdb5/optimizer/opt_commonTerms.c
+++ b/monetdb5/optimizer/opt_commonTerms.c
@@ -60,7 +60,7 @@ OPTcommonTermsImplementation(Client cntx
lng usec = GDKusec();
/* catch simple insert operations */
- if( isSQLinsert(mb)){
+ if( isSimpleSQL(mb)){
goto wrapup;
}
diff --git a/monetdb5/optimizer/opt_constants.c
b/monetdb5/optimizer/opt_constants.c
--- a/monetdb5/optimizer/opt_constants.c
+++ b/monetdb5/optimizer/opt_constants.c
@@ -39,7 +39,7 @@ OPTconstantsImplementation(Client cntxt,
str msg = MAL_SUCCEED;
InstrPtr q;
- if( isSQLinsert(mb)){
+ if( isSimpleSQL(mb)){
goto wrapup;
}
alias= (int*) GDKzalloc(sizeof(int) * mb->vtop);
diff --git a/monetdb5/optimizer/opt_fastpath.c
b/monetdb5/optimizer/opt_fastpath.c
new file mode 100644
--- /dev/null
+++ b/monetdb5/optimizer/opt_fastpath.c
@@ -0,0 +1,136 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V.
+ */
+
+#include "monetdb_config.h"
+#include "opt_fastpath.h"
+#include "opt_aliases.h"
+#include "opt_bincopyfrom.h"
+#include "opt_coercion.h"
+#include "opt_commonTerms.h"
+#include "opt_candidates.h"
+#include "opt_constants.h"
+#include "opt_costModel.h"
+#include "opt_dataflow.h"
+#include "opt_deadcode.h"
+#include "opt_emptybind.h"
+#include "opt_evaluate.h"
+#include "opt_garbageCollector.h"
+#include "opt_generator.h"
+#include "opt_inline.h"
+#include "opt_jit.h"
+#include "opt_projectionpath.h"
+#include "opt_matpack.h"
+#include "opt_json.h"
+#include "opt_oltp.h"
+#include "opt_postfix.h"
+#include "opt_mask.h"
+#include "opt_mergetable.h"
+#include "opt_mitosis.h"
+#include "opt_multiplex.h"
+#include "opt_profiler.h"
+#include "opt_pushselect.h"
+#include "opt_querylog.h"
+#include "opt_reduce.h"
+#include "opt_remap.h"
+#include "opt_remoteQueries.h"
+#include "opt_reorder.h"
+#include "opt_volcano.h"
+#include "opt_fastpath.h"
+#include "opt_wlc.h"
+#include "optimizer_private.h"
+#include "mal_interpreter.h"
+
+str
+OPTminimalfastImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr p)
+{
+ int actions = 0;
+ char buf[256];
+ lng usec = GDKusec();
+ str msg = MAL_SUCCEED;
+
+ (void)cntxt;
+ (void)stk;
+ (void) p;
+
+
+ msg = OPTinlineImplementation(cntxt, mb, stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTremapImplementation(cntxt, mb, stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTbincopyfromImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTdeadcodeImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTmultiplexImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTgeneratorImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTprofilerImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTcandidatesImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTgarbageCollectorImplementation(cntxt,
mb, stk, p);
+
+ /* Defense line against incorrect plans handled by optimizer steps */
+ /* keep all actions taken as a post block comment */
+ usec = GDKusec()- usec;
+ snprintf(buf,256,"%-20s actions=1 time=" LLFMT " usec","minimalfast",
usec);
+ newComment(mb,buf);
+ if( actions > 0)
+ addtoMalBlkHistory(mb);
+
+ return msg;
+}
+
+str
+OPTdefaultfastImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr p)
+{
+ int actions = 0;
+ char buf[256];
+ lng usec = GDKusec();
+ str msg = MAL_SUCCEED;
+
+ (void)cntxt;
+ (void)stk;
+ (void) p;
+
+
+ msg = OPTinlineImplementation(cntxt, mb, stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTremapImplementation(cntxt, mb, stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTcostModelImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTcoercionImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTaliasesImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTevaluateImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTemptybindImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTdeadcodeImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTpushselectImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTaliasesImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTmitosisImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTmergetableImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTbincopyfromImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTaliasesImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTconstantsImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTcommonTermsImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTprojectionpathImplementation(cntxt,
mb, stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTdeadcodeImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTreorderImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTmatpackImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTdataflowImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTquerylogImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTmultiplexImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTgeneratorImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTprofilerImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTcandidatesImplementation(cntxt, mb,
stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTdeadcodeImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTpostfixImplementation(cntxt, mb, stk,
p);
+ // if( msg == MAL_SUCCEED) msg = OPTjitImplementation(cntxt, mb, stk,
p);
+ if( msg == MAL_SUCCEED) msg = OPTwlcImplementation(cntxt, mb, stk, p);
+ if( msg == MAL_SUCCEED) msg = OPTgarbageCollectorImplementation(cntxt,
mb, stk, p);
+
+ /* Defense line against incorrect plans handled by optimizer steps */
+ /* keep all actions taken as a post block comment */
+ usec = GDKusec()- usec;
+ snprintf(buf,256,"%-20s actions=1 time=" LLFMT " usec","defaultfast",
usec);
+ newComment(mb,buf);
+ if( actions > 0)
+ addtoMalBlkHistory(mb);
+
+ return msg;
+}
diff --git a/monetdb5/optimizer/opt_fastpath.h
b/monetdb5/optimizer/opt_fastpath.h
new file mode 100644
--- /dev/null
+++ b/monetdb5/optimizer/opt_fastpath.h
@@ -0,0 +1,18 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V.
+ */
+
+#ifndef _MAL_MINIMAL_PIPE_
+#define _MAL_MINIMAL_PIPE_
+#include "opt_prelude.h"
+#include "opt_support.h"
+#include "mal_instruction.h"
+
+extern str OPTminimalfastImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr p);
+extern str OPTdefaultfastImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr p);
+
+#endif
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -20,6 +20,7 @@
*/
#include "monetdb_config.h"
#include "opt_pipes.h"
+#include "opt_support.h"
#include "mal_client.h"
#include "mal_instruction.h"
#include "mal_function.h"
@@ -537,15 +538,25 @@ addOptimizerPipe(Client cntxt, MalBlkPtr
InstrPtr p,q;
str msg = MAL_SUCCEED;
- for (i = 0; i < MAXOPTPIPES && pipes[i].name; i++)
- if (strcmp(pipes[i].name, name) == 0)
- break;
+ if (strcmp(name, "default_fast") == 0 && isSimpleSQL(mb)){
+ for (i = 0; i < MAXOPTPIPES && pipes[i].name; i++)
+ if (strcmp(pipes[i].name, "minimal_fast") == 0)
+ break;
+ } else {
+ for (i = 0; i < MAXOPTPIPES && pipes[i].name; i++)
+ if (strcmp(pipes[i].name, name) == 0)
+ break;
+ }
if (i == MAXOPTPIPES)
throw(MAL, "optimizer.addOptimizerPipe", SQLSTATE(HY013) "Out
of slots");
- if (pipes[i].mb == NULL)
- msg = compileOptimizer(cntxt, name);
+ if (pipes[i].mb == NULL){
+ if (strcmp(name, "default_fast") == 0 && isSimpleSQL(mb))
+ msg = compileOptimizer(cntxt, name);
+ else
+ msg = compileOptimizer(cntxt, "minimal_fast");
+ }
if (pipes[i].mb && pipes[i].mb->stop) {
for (j = 1; j < pipes[i].mb->stop - 1; j++) {
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -90,7 +90,7 @@ isOptimizerUsed(MalBlkPtr mb, str opt)
/* Simple insertion statements do not require complex optimizer steps */
int
-isSQLinsert(MalBlkPtr mb)
+isSimpleSQL(MalBlkPtr mb)
{
int cnt = 0;
int i;
@@ -101,8 +101,11 @@ isSQLinsert(MalBlkPtr mb)
if (p && getModuleId(p) == sqlRef && getFunctionId(p) ==
appendRef ){
cnt ++;
}
- if (p && getModuleId(p) == sqlRef && getFunctionId(p) ==
setVariableRef ){
- cnt ++;
+ if (p && getModuleId(p) == sqlRef && getFunctionId(p) ==
setVariableRef ){
+ return 1;
+ }
+ if (p && getModuleId(p) == sqlcatalogRef ){
+ return 1;
}
}
diff --git a/monetdb5/optimizer/opt_support.h b/monetdb5/optimizer/opt_support.h
--- a/monetdb5/optimizer/opt_support.h
+++ b/monetdb5/optimizer/opt_support.h
@@ -21,7 +21,7 @@
mal_export str MALoptimizer(Client c);
mal_export str optimizeMALBlock(Client cntxt, MalBlkPtr mb);
-extern int isSQLinsert(MalBlkPtr mb);
+extern int isSimpleSQL(MalBlkPtr mb);
extern int optimizerIsApplied(MalBlkPtr mb, str name);
extern int isUnsafeInstruction(InstrPtr q);
extern int isUnsafeFunction(InstrPtr q);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list