From a7cffa2b7bbee27f272eb078ee97cea48b2051cb Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sat, 29 Oct 2022 17:46:51 +0200 Subject: [PATCH 02/11] 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 14fff22247a..2a4ae5a028e 100644 --- a/src/backend/access/brin/brin_minmax.c +++ b/src/backend/access/brin/brin_minmax.c @@ -28,6 +28,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; @@ -493,6 +497,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++) { @@ -515,6 +526,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; } @@ -540,6 +561,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". @@ -588,6 +616,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; } @@ -619,6 +659,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) @@ -641,6 +688,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 } /* @@ -665,6 +725,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) @@ -716,6 +783,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 cd3d97a3a63..6abefe24be3 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -97,6 +97,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 @@ -1231,6 +1235,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.2