Home Explore Blog CI



postgresql

10th chunk of `doc/src/sgml/planstats.sgml`
912a224f6ab7e6fffab03874d9ea2f5d91d89173c212c4140000000100000ae3
 |         0.0001
    98 | {98, 98} | {f,f} |      0.01 |         0.0001
    99 | {99, 99} | {f,f} |      0.01 |         0.0001
(100 rows)
</programlisting>

    This confirms there are 100 distinct combinations in the two columns, and
    all of them are about equally likely (1% frequency for each one).  The
    base frequency is the frequency computed from per-column statistics, as if
    there were no multi-column statistics. Had there been any null values in
    either of the columns, this would be identified in the
    <structfield>nulls</structfield> column.
   </para>

   <para>
    When estimating the selectivity, the planner applies all the conditions
    on items in the <acronym>MCV</acronym> list, and then sums the frequencies
    of the matching ones. See <function>mcv_clauselist_selectivity</function>
    in <filename>src/backend/statistics/mcv.c</filename> for details.
   </para>

   <para>
    Compared to functional dependencies, <acronym>MCV</acronym> lists have two
    major advantages. Firstly, the list stores actual values, making it possible
    to decide which combinations are compatible.

<programlisting>
EXPLAIN (ANALYZE, TIMING OFF, BUFFERS OFF) SELECT * FROM t WHERE a = 1 AND b = 10;
                                 QUERY PLAN
-------------------------------------------------------------------&zwsp;--------
 Seq Scan on t  (cost=0.00..195.00 rows=1 width=8) (actual rows=0.00 loops=1)
   Filter: ((a = 1) AND (b = 10))
   Rows Removed by Filter: 10000
</programlisting>

    Secondly, <acronym>MCV</acronym> lists handle a wider range of clause types,
    not just equality clauses like functional dependencies. For example,
    consider the following range query for the same table:

<programlisting>
EXPLAIN (ANALYZE, TIMING OFF, BUFFERS OFF) SELECT * FROM t WHERE a &lt;= 49 AND b &gt; 49;
                                QUERY PLAN
-------------------------------------------------------------------&zwsp;--------
 Seq Scan on t  (cost=0.00..195.00 rows=1 width=8) (actual rows=0.00 loops=1)
   Filter: ((a &lt;= 49) AND (b &gt; 49))
   Rows Removed by Filter: 10000
</programlisting>

   </para>

  </sect2>

 </sect1>

 <sect1 id="planner-stats-security">
  <title>Planner Statistics and Security</title>

  <para>
   Access to the table <structname>pg_statistic</structname> is restricted to
   superusers, so that ordinary users cannot learn about the contents of the
   tables of other users from it.  Some selectivity estimation functions will
   use a user-provided operator (either the operator appearing in the query or
   a related operator) to analyze the stored statistics.  For example, in order
   to determine whether a stored most common value is applicable, the
   selectivity estimator will have to run the appropriate

Title: Advantages of MCV Lists over Functional Dependencies
Summary
MCV lists have two major advantages over functional dependencies: they store actual values, allowing for more accurate selectivity estimation, and they can handle a wider range of clause types, including range queries and non-equality clauses. This is demonstrated through examples of queries using MCV lists, which provide more accurate estimates than functional dependencies. Additionally, access to planner statistics is restricted to superusers for security reasons, and selectivity estimation functions may use user-provided operators to analyze stored statistics.