From 7e59c0889ffd7553e8e6c8572603ebb32b1fb649 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sat, 29 Oct 2022 17:46:51 +0200 Subject: [PATCH 02/10] wip: introduce debug_brin_stats --- src/backend/access/brin/brin_minmax.c | 80 +++++++++++++++++++++++++++ src/backend/utils/misc/guc_tables.c | 18 ++++++ 2 files changed, 98 insertions(+) diff --git a/src/backend/access/brin/brin_minmax.c b/src/backend/access/brin/brin_minmax.c index 67e68a8b8ed..6e20a34fbcd 100644 --- a/src/backend/access/brin/brin_minmax.c +++ b/src/backend/access/brin/brin_minmax.c @@ -27,6 +27,10 @@ #include "utils/syscache.h" #include "utils/timestamp.h" +#ifdef DEBUG_BRIN_STATS +bool debug_brin_stats = false; +#endif + typedef struct MinmaxOpaque { Oid cached_subtype; @@ -479,6 +483,13 @@ brin_minmax_count_overlaps(BrinRange **minranges, int nranges, { int64 noverlaps; +#ifdef DEBUG_BRIN_STATS + TimestampTz start_ts; + + if (debug_brin_stats) + start_ts = GetCurrentTimestamp(); +#endif + noverlaps = 0; for (int i = 0; i < nranges; i++) { @@ -501,6 +512,16 @@ brin_minmax_count_overlaps(BrinRange **minranges, int nranges, */ noverlaps *= 2; +#ifdef DEBUG_BRIN_STATS + if (debug_brin_stats) + { + elog(WARNING, "----- brin_minmax_count_overlaps -----"); + elog(WARNING, "noverlaps = %ld", noverlaps); + elog(WARNING, "duration = %ld", TimestampDifferenceMilliseconds(start_ts, + GetCurrentTimestamp())); + } +#endif + stats->avg_overlaps = (double) noverlaps / nranges; } @@ -527,6 +548,13 @@ brin_minmax_match_tuples_to_ranges(BrinRanges *ranges, int64 *unique = (int64 *) palloc0(sizeof(int64) * nvalues); +#ifdef DEBUG_BRIN_STATS + TimestampTz start_ts; + + if (debug_brin_stats) + start_ts = GetCurrentTimestamp(); +#endif + /* * Build running count of unique values. We know there are unique[i] * unique values in values array up to index "i". @@ -572,6 +600,18 @@ brin_minmax_match_tuples_to_ranges(BrinRanges *ranges, Assert(nmatches >= 0); Assert(nmatches_unique >= 0); +#ifdef DEBUG_BRIN_STATS + if (debug_brin_stats) + { + elog(WARNING, "----- brin_minmax_match_tuples_to_ranges -----"); + elog(WARNING, "nmatches = %ld %f", nmatches, (double) nmatches / numrows); + elog(WARNING, "nmatches unique = %ld %ld %f", nmatches_unique, nvalues_unique, + (double) nmatches_unique / nvalues_unique); + elog(WARNING, "duration = %ld", TimestampDifferenceMilliseconds(start_ts, + GetCurrentTimestamp())); + } +#endif + stats->avg_matches = (double) nmatches / numrows; stats->avg_matches_unique = (double) nmatches_unique / nvalues_unique; } @@ -603,6 +643,13 @@ brin_minmax_value_stats(BrinRange **minranges, BrinRange **maxranges, minval_corr = 0, maxval_corr = 0; +#ifdef DEBUG_BRIN_STATS + TimestampTz start_ts; + + if (debug_brin_stats) + start_ts = GetCurrentTimestamp(); +#endif + for (int i = 1; i < nranges; i++) { if (range_values_cmp(&minranges[i-1]->min_value, &minranges[i]->min_value, typcache) != 0) @@ -625,6 +672,19 @@ brin_minmax_value_stats(BrinRange **minranges, BrinRange **maxranges, stats->minval_correlation = (double) minval_corr / nranges; stats->maxval_correlation = (double) maxval_corr / nranges; + +#ifdef DEBUG_BRIN_STATS + if (debug_brin_stats) + { + elog(WARNING, "----- brin_minmax_value_stats -----"); + elog(WARNING, "minval ndistinct " INT64_FORMAT " correlation %f", + stats->minval_ndistinct, stats->minval_correlation); + elog(WARNING, "maxval ndistinct " INT64_FORMAT " correlation %f", + stats->maxval_ndistinct, stats->maxval_correlation); + elog(WARNING, "duration = %ld", TimestampDifferenceMilliseconds(start_ts, + GetCurrentTimestamp())); + } +#endif } /* @@ -649,6 +709,13 @@ brin_minmax_increment_stats(BrinRange **minranges, BrinRange **maxranges, max_minval = 0, max_maxval = 0; +#ifdef DEBUG_BRIN_STATS + TimestampTz start_ts; + + if (debug_brin_stats) + start_ts = GetCurrentTimestamp(); +#endif + for (int i = 1; i < nranges; i++) { if (range_values_cmp(&minranges[i-1]->min_value, &minranges[i]->min_value, typcache) != 0) @@ -700,6 +767,19 @@ brin_minmax_increment_stats(BrinRange **minranges, BrinRange **maxranges, } } +#ifdef DEBUG_BRIN_STATS + if (debug_brin_stats) + { + elog(WARNING, "----- brin_minmax_increment_stats -----"); + elog(WARNING, "minval ndistinct %ld sum %f max %f avg %f", + minval_ndist, sum_minval, max_minval, sum_minval / minval_ndist); + elog(WARNING, "maxval ndistinct %ld sum %f max %f avg %f", + maxval_ndist, sum_maxval, max_maxval, sum_maxval / maxval_ndist); + elog(WARNING, "duration = %ld", TimestampDifferenceMilliseconds(start_ts, + GetCurrentTimestamp())); + } +#endif + stats->minval_increment_avg = (sum_minval / minval_ndist); stats->minval_increment_max = max_minval; diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 67687d158e6..f8d06296fb1 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -96,6 +96,10 @@ extern bool ignore_checksum_failure; extern bool ignore_invalid_pages; extern bool synchronize_seqscans; +#ifdef DEBUG_BRIN_STATS +extern bool debug_brin_stats; +#endif + #ifdef TRACE_SYNCSCAN extern bool trace_syncscan; #endif @@ -1230,6 +1234,20 @@ struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, +#ifdef DEBUG_BRIN_STATS + /* this is undocumented because not exposed in a standard build */ + { + {"debug_brin_stats", PGC_USERSET, DEVELOPER_OPTIONS, + gettext_noop("Print info about calculated BRIN statistics."), + NULL, + GUC_NOT_IN_SAMPLE + }, + &debug_brin_stats, + false, + NULL, NULL, NULL + }, +#endif + { {"exit_on_error", PGC_USERSET, ERROR_HANDLING_OPTIONS, gettext_noop("Terminate session on any error."), -- 2.39.1