On Wed, 2 Oct 2002 14:07:19 -0600 (MDT), "scott.marlowe"
<[EMAIL PROTECTED]> wrote:
>I'd certainly be willing to do some testing on my own data with them.  
>Gotta patch?

Yes, see below.  Disclaimer:  Apart from "make; make check" this is
completely untested.  Use at your own risk.  Have fun!

Servus
 Manfred
diff -ruN ../base/src/backend/optimizer/path/costsize.c 
src/backend/optimizer/path/costsize.c
--- ../base/src/backend/optimizer/path/costsize.c       2002-07-04 18:04:57.000000000 
+0200
+++ src/backend/optimizer/path/costsize.c       2002-10-03 09:53:06.000000000 +0200
@@ -72,6 +72,7 @@
 double         cpu_tuple_cost = DEFAULT_CPU_TUPLE_COST;
 double         cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST;
 double         cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST;
+int                    index_cost_algorithm = DEFAULT_INDEX_COST_ALGORITHM;
 
 Cost           disable_cost = 100000000.0;
 
@@ -213,8 +214,8 @@
        Cost            indexStartupCost;
        Cost            indexTotalCost;
        Selectivity indexSelectivity;
-       double          indexCorrelation,
-                               csquared;
+       double          indexCorrelation;
+       Cost            IO_cost;
        Cost            min_IO_cost,
                                max_IO_cost;
        Cost            cpu_per_tuple;
@@ -329,13 +330,62 @@
        min_IO_cost = ceil(indexSelectivity * T);
        max_IO_cost = pages_fetched * random_page_cost;
 
-       /*
-        * Now interpolate based on estimated index order correlation to get
-        * total disk I/O cost for main table accesses.
-        */
-       csquared = indexCorrelation * indexCorrelation;
+       switch (index_cost_algorithm) {
+       case 1: {
+               /*
+               ** Use abs(correlation) for linear interpolation
+               */
+               double absC = fabs(indexCorrelation);
+
+               IO_cost = absC * min_IO_cost + (1 - absC) * max_IO_cost;
+       }
+
+       case 2: {
+               /*
+               ** First estimate number of pages and cost per page,
+               ** then multiply the results.  min_IO_cost is used for
+               ** min_pages, because seq_page_cost = 1.
+               */
+               double absC = fabs(indexCorrelation);
+
+               double estPages = absC * min_IO_cost + (1 - absC) * pages_fetched;
+               double estPCost = absC * 1 + (1 - absC) * random_page_cost;
+               IO_cost = estPages * estPCost;
+       }
+
+       case 3: {
+               /*
+               ** Interpolate based on independence squared, thus forcing the
+               ** result to be closer to min_IO_cost
+               */
+               double independence = 1 - fabs(indexCorrelation);
+               double isquared = independence * independence;
+
+               IO_cost = (1 - isquared) * min_IO_cost + isquared * max_IO_cost;
+       }
+
+       case 4: {
+               /*
+               ** Interpolate geometrically
+               */
+               double absC = fabs(indexCorrelation);
+
+               IO_cost = exp(absC * log(min_IO_cost) +
+                             (1 - absC) * log(max_IO_cost));
+       }
+
+       default: {
+               /*
+                * Interpolate based on estimated index order correlation
+                * to get total disk I/O cost for main table accesses.
+                */
+               double csquared = indexCorrelation * indexCorrelation;
+
+               IO_cost = max_IO_cost + csquared * (min_IO_cost - max_IO_cost);
+       }
+       }
 
-       run_cost += max_IO_cost + csquared * (min_IO_cost - max_IO_cost);
+       run_cost += IO_cost;
 
        /*
         * Estimate CPU costs per tuple.
diff -ruN ../base/src/backend/utils/misc/guc.c src/backend/utils/misc/guc.c
--- ../base/src/backend/utils/misc/guc.c        2002-07-20 17:27:19.000000000 +0200
+++ src/backend/utils/misc/guc.c        2002-10-03 10:03:37.000000000 +0200
@@ -644,6 +644,11 @@
        },
 
        {
+               { "index_cost_algorithm", PGC_USERSET }, &index_cost_algorithm,
+               DEFAULT_INDEX_COST_ALGORITHM, 0, INT_MAX, NULL, NULL
+       },
+
+       {
                { NULL, 0 }, NULL, 0, 0, 0, NULL, NULL
        }
 };
diff -ruN ../base/src/include/optimizer/cost.h src/include/optimizer/cost.h
--- ../base/src/include/optimizer/cost.h        2002-06-21 02:12:29.000000000 +0200
+++ src/include/optimizer/cost.h        2002-10-03 09:56:28.000000000 +0200
@@ -24,6 +24,7 @@
 #define DEFAULT_CPU_TUPLE_COST 0.01
 #define DEFAULT_CPU_INDEX_TUPLE_COST 0.001
 #define DEFAULT_CPU_OPERATOR_COST  0.0025
+#define DEFAULT_INDEX_COST_ALGORITHM 3
 
 /* defaults for function attributes used for expensive function calculations */
 #define BYTE_PCT 100
@@ -43,6 +44,7 @@
 extern double cpu_tuple_cost;
 extern double cpu_index_tuple_cost;
 extern double cpu_operator_cost;
+extern int index_cost_algorithm;
 extern Cost disable_cost;
 extern bool enable_seqscan;
 extern bool enable_indexscan;

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly

Reply via email to