همبستگی فیزیکی ستونها: نامزدهای BRIN و CLUSTER
pg_stats.correlation رو برای ستونهای ایندکسشده میخونه: نزدیک ۱ که باشه، یک BRIN ریز کافیه؛ نزدیک ۰ روی ستونی که مدام مبنای مرتبسازیه، یک CLUSTER جدول رو بازچینی میکنه و I/O رو چند برابر کم میکنه.
کاربرد
انتخاب نوع درست ایندکس روی جدولهای بزرگ append-only (لاگ، اندازهگیری، رویداد).
پیشنیازها
PostgreSQL (pg_stats, ANALYZE récent)
SQL
SELECT
s.tablename,
s.attname AS colonne,
ROUND(s.correlation::numeric, 3) AS correlation,
c.reltuples::bigint AS lignes,
pg_size_pretty(pg_relation_size(c.oid)) AS taille_table,
CASE
WHEN abs(s.correlation) > 0.95 THEN 'BRIN candidat idéal'
WHEN abs(s.correlation) < 0.10 THEN 'CLUSTER utile si tris fréquents'
ELSE '-'
END AS recommandation
FROM pg_stats s
JOIN pg_class c ON c.relname = s.tablename
JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = s.schemaname
WHERE s.schemaname = 'public'
AND c.reltuples > 1000000
AND s.attname IN ('created_at', 'recorded_at', 'order_date', 'customer_id')
ORDER BY abs(s.correlation) DESC;نتیجه
tablename | colonne | correlation | lignes | taille_table | recommandation -------------+-------------+-------------+----------+--------------+--------------------------------- events_raw | recorded_at | 0.998 | 48211570 | 11 GB | BRIN candidat idéal order_lines | order_date | 0.971 | 14201930 | 2.1 GB | BRIN candidat idéal orders | created_at | 0.964 | 5522010 | 1.2 GB | BRIN candidat idéal order_lines | customer_id | 0.042 | 14201930 | 2.1 GB | CLUSTER utile si tris fréquents (4 rows) 3 colonnes quasi parfaitement corrélées : BRIN = ~1000x plus petit qu'un B-tree
SQLBRINCLUSTERStatistiquesPerformance