Optimize MCV stats for sortable types and utilize sorted-order properties

From: ZizhuanLiu X-MAN <44973863(at)qq(dot)com>
To: pgsql-hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Optimize MCV stats for sortable types and utilize sorted-order properties
Date: 2026-09-15 02:18:06
Message-ID: tencent_0489DF3C961BD4D48D32F04F6D6EB4301308@qq.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi, hackers

Optimize MCV stats for sortable types and utilize sorted-order properties.

1.Preserve ascending-ordered MCV values for sort-comparable types when filling
pg_statistic. In compute_scalar_stats(), retain existing logic and allocate
extra ScalarMCVItem workspace to hold sorted MCV entries.

2.When applying statistics, use the pre-sorted MCV list:
-compare against min/max boundaries. Boundary hits finish in 1-2 comparisons.
-Values inside MCV range use binary-search (average N/2 -> log(n)).
-Values outside MCV range skip full MCV iteration (N -> at most 2 comparisons).

3.TODO(I will take this on.):
- Audit functions for benefits / regressions caused by sorted MCV and apply fixes
- Compatibility support for non-sortable types and sorted-state detection

This patch builds on earlier work; I’d like to start a new thread for it:
Discussion: https://www.postgresql.org/message-id/flat/tencent_A15A9D89A86F2E4B086ABA462578B9B64307(at)qq(dot)com
Commitfest: https://commitfest.postgresql.org/patch/7075/

Feedback is welcome; please point out any problems or deficiencies.

Test SQL:
drop table if exists t_analyze_mcv;
create table t_analyze_mcv(id int);

insert into t_analyze_mcv select (g+45) % 10 from generate_series(1, 90) g;
insert into t_analyze_mcv select 12 from generate_series(1, 10) g;
insert into t_analyze_mcv select * from t_analyze_mcv;

analyze t_analyze_mcv;

select attname,null_frac,n_distinct,most_common_vals,most_common_freqs,correlation
from pg_catalog.pg_stats where tablename = 't_analyze_mcv'\gx

-[ RECORD 1 ]-----+--------------------------------------------------------
attname | id
null_frac | 0
n_distinct | 11
most_common_vals | {0,1,2,3,4,5,6,7,8,9,12}
most_common_freqs | {0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.1}
correlation | 0.20327759

xman7=# select id,count(*) from t_analyze_mcv group by id ;
id | count
----+-------
8 | 18
9 | 18
7 | 18
1 | 18
5 | 18
4 | 18
2 | 18
0 | 18
6 | 18
12 | 20
3 | 18
(11 rows)

xman7=#

-- Test SQL queries
explain select * from t_analyze_mcv where id = -1; -- 1 row, low out-of-MCV-range: compute sumcommon directly, skip comparisons against other MCV values
explain select * from t_analyze_mcv where id = 0; -- 18 rows, match first MCV element: lookup completes immediately
explain select * from t_analyze_mcv where id = 5; -- 18 rows, within MCV range, present in list: found via binary search
explain select * from t_analyze_mcv where id = 10; -- 1 row, within MCV range, not present in list: compute sumcommon directly after binary-search miss
explain select * from t_analyze_mcv where id = 12; -- 20 rows, match last MCV element: lookup completes immediately
explain select * from t_analyze_mcv where id = 13; -- 1 row, high out-of-MCV-range: compute sumcommon directly, skip comparisons against other MCV values

regards,
--
ZizhuanLiu (X-MAN) 
44973863(at)qq(dot)com

Attachment Content-Type Size
v1-0001-Optimize-MCV-stats-for-sortable-types-and-utilize.patch application/octet-stream 11.1 KB

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2026-09-15 02:51:24 Re: First draft of PG 19 release notes
Previous Message Nikolay Samokhvalov 2026-09-15 02:13:54 Re: PG19: two RI fast-path issues found while testing the batching revert