Ensure default-only storage parameters for TOAST relations
authorItagaki Takahiro <[email protected]>
Mon, 7 Jun 2010 03:01:35 +0000 (03:01 +0000)
committerItagaki Takahiro <[email protected]>
Mon, 7 Jun 2010 03:01:35 +0000 (03:01 +0000)
to be initialized with proper values. Affected parameters are
fillfactor, analyze_threshold, and analyze_scale_factor.

Especially uninitialized fillfactor caused inefficient page usage
because we built a StdRdOptions struct in which fillfactor is zero
if any reloption is set for the toast table.

In addition, we disallow toast.autovacuum_analyze_threshold and
toast.autovacuum_analyze_scale_factor because we didn't actually
support them; they are always ignored.

Report by Rumko on pgsql-bugs on 12 May 2010.
Analysis by Tom Lane and Alvaro Herrera. Patch by me.

Backpatch to 8.4.

doc/src/sgml/ref/create_table.sgml
src/backend/access/common/reloptions.c

index 1d0b8a4904fc998fd485b419064cc2a4334fa642..01270faf4c6ac2f90a16002a9ee525cb293f3368 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.114.2.2 2010/05/13 18:54:23 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.114.2.3 2010/06/07 03:01:34 itagaki Exp $
 PostgreSQL documentation
 -->
 
@@ -770,7 +770,7 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is:
    </varlistentry>
 
    <varlistentry>
-    <term><literal>autovacuum_analyze_threshold</>, <literal>toast.autovacuum_analyze_threshold</literal> (<type>integer</>)</term>
+    <term><literal>autovacuum_analyze_threshold</> (<type>integer</>)</term>
     <listitem>
      <para>
      Minimum number of inserted, updated, or deleted tuples before initiate an
@@ -780,7 +780,7 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is:
    </varlistentry>
 
    <varlistentry>
-    <term><literal>autovacuum_analyze_scale_factor</>, <literal>toast.autovacuum_analyze_scale_factor</literal> (<type>float4</>)</term>
+    <term><literal>autovacuum_analyze_scale_factor</> (<type>float4</>)</term>
     <listitem>
      <para>
      Multiplier for <structfield>reltuples</> to add to
index 83c41b3da41a2e39ed40110b54ef90c5ead1b496..5cc66c34342a3ea641d4f2344291dfbbe9b0d7b5 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.28.2.2 2010/03/11 21:47:25 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.28.2.3 2010/06/07 03:01:35 itagaki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -114,7 +114,7 @@ static relopt_int intRelOpts[] =
        {
            "autovacuum_analyze_threshold",
            "Minimum number of tuple inserts, updates or deletes prior to analyze",
-           RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
+           RELOPT_KIND_HEAP
        },
        -1, 0, INT_MAX
    },
@@ -175,7 +175,7 @@ static relopt_real realRelOpts[] =
        {
            "autovacuum_analyze_scale_factor",
            "Number of tuple inserts, updates or deletes prior to analyze as a fraction of reltuples",
-           RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
+           RELOPT_KIND_HEAP
        },
        -1, 0.0, 100.0
    },
@@ -1122,10 +1122,21 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 bytea *
 heap_reloptions(char relkind, Datum reloptions, bool validate)
 {
+   StdRdOptions *rdopts;
+
    switch (relkind)
    {
        case RELKIND_TOASTVALUE:
-           return default_reloptions(reloptions, validate, RELOPT_KIND_TOAST);
+           rdopts = (StdRdOptions *)
+               default_reloptions(reloptions, validate, RELOPT_KIND_TOAST);
+           if (rdopts != NULL)
+           {
+               /* adjust default-only parameters for TOAST relations */
+               rdopts->fillfactor = 100;
+               rdopts->autovacuum.analyze_threshold = -1;
+               rdopts->autovacuum.analyze_scale_factor = -1;
+           }
+           return (bytea *) rdopts;
        case RELKIND_RELATION:
            return default_reloptions(reloptions, validate, RELOPT_KIND_HEAP);
        default: