Display length and bounds histograms in pg_stats

Values corresponding to STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM and
STATISTIC_KIND_BOUNDS_HISTOGRAM were not exposed to pg_stats when these
slot kinds were introduced in 918eee0c49.

This commit adds the missing fields to pg_stats.

Catversion is bumped.

Discussion: https://postgr.es/m/flat/b67d8b57-9357-7e82-a2e7-f6ce6eaeec67@postgrespro.ru
Author: Egor Rogov, Soumyadeep Chakraborty
Reviewed-by: Tomas Vondra, Justin Pryzby, Jian He
This commit is contained in:
Alexander Korotkov 2023-11-27 01:30:39 +02:00
parent 441c8a3134
commit bc3c8db8ae
4 changed files with 87 additions and 3 deletions

View File

@ -3799,6 +3799,45 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx
non-null elements. (Null for scalar types.)
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>range_length_histogram</structfield> <type>anyarray</type>
</para>
<para>
A histogram of the lengths of non-empty and non-null range values of a
range type column. (Null for non-range types.)
</para>
<para>
This histogram is calculated using the <literal>subtype_diff</literal>
range function regardless of whether range bounds are inclusive.
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>range_empty_frac</structfield> <type>float4</type>
</para>
<para>
Fraction of column entries whose values are empty ranges.
(Null for non-range types.)
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>range_bounds_histogram</structfield> <type>anyarray</type>
</para>
<para>
A histogram of lower and upper bounds of non-empty and non-null range
values. (Null for non-range types.)
</para>
<para>
These two histograms are represented as a single array of ranges, whose
lower bounds represent the histogram of lower bounds, and upper bounds
represent the histogram of upper bounds.
</para></entry>
</row>
</tbody>
</tgroup>
</table>

View File

@ -243,7 +243,28 @@ CREATE VIEW pg_stats WITH (security_barrier) AS
WHEN stakind3 = 5 THEN stanumbers3
WHEN stakind4 = 5 THEN stanumbers4
WHEN stakind5 = 5 THEN stanumbers5
END AS elem_count_histogram
END AS elem_count_histogram,
CASE
WHEN stakind1 = 6 THEN stavalues1
WHEN stakind2 = 6 THEN stavalues2
WHEN stakind3 = 6 THEN stavalues3
WHEN stakind4 = 6 THEN stavalues4
WHEN stakind5 = 6 THEN stavalues5
END AS range_length_histogram,
CASE
WHEN stakind1 = 6 THEN stanumbers1[1]
WHEN stakind2 = 6 THEN stanumbers2[1]
WHEN stakind3 = 6 THEN stanumbers3[1]
WHEN stakind4 = 6 THEN stanumbers4[1]
WHEN stakind5 = 6 THEN stanumbers5[1]
END AS range_empty_frac,
CASE
WHEN stakind1 = 7 THEN stavalues1
WHEN stakind2 = 7 THEN stavalues2
WHEN stakind3 = 7 THEN stavalues3
WHEN stakind4 = 7 THEN stavalues4
WHEN stakind5 = 7 THEN stavalues5
END AS range_bounds_histogram
FROM pg_statistic s JOIN pg_class c ON (c.oid = s.starelid)
JOIN pg_attribute a ON (c.oid = attrelid AND attnum = s.staattnum)
LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace)

View File

@ -57,6 +57,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 202311142
#define CATALOG_VERSION_NO 202311271
#endif

View File

@ -2466,7 +2466,31 @@ pg_stats| SELECT n.nspname AS schemaname,
WHEN (s.stakind4 = 5) THEN s.stanumbers4
WHEN (s.stakind5 = 5) THEN s.stanumbers5
ELSE NULL::real[]
END AS elem_count_histogram
END AS elem_count_histogram,
CASE
WHEN (s.stakind1 = 6) THEN s.stavalues1
WHEN (s.stakind2 = 6) THEN s.stavalues2
WHEN (s.stakind3 = 6) THEN s.stavalues3
WHEN (s.stakind4 = 6) THEN s.stavalues4
WHEN (s.stakind5 = 6) THEN s.stavalues5
ELSE NULL::anyarray
END AS range_length_histogram,
CASE
WHEN (s.stakind1 = 6) THEN s.stanumbers1[1]
WHEN (s.stakind2 = 6) THEN s.stanumbers2[1]
WHEN (s.stakind3 = 6) THEN s.stanumbers3[1]
WHEN (s.stakind4 = 6) THEN s.stanumbers4[1]
WHEN (s.stakind5 = 6) THEN s.stanumbers5[1]
ELSE NULL::real
END AS range_empty_frac,
CASE
WHEN (s.stakind1 = 7) THEN s.stavalues1
WHEN (s.stakind2 = 7) THEN s.stavalues2
WHEN (s.stakind3 = 7) THEN s.stavalues3
WHEN (s.stakind4 = 7) THEN s.stavalues4
WHEN (s.stakind5 = 7) THEN s.stavalues5
ELSE NULL::anyarray
END AS range_bounds_histogram
FROM (((pg_statistic s
JOIN pg_class c ON ((c.oid = s.starelid)))
JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum))))