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

Reply via email to