pg_stats 视图中的 n_distinct 字段表示某一列中不同取值(distinct values)的数量。
如果 n_distinct 为负数,其绝对值表示该列中不同取值所占的比例,而不是实际的不同值个数。例如,−1 表示该列中所有值都是唯一的;−3 表示平均而言,每个不同的值大约出现在 3 行中。当估计的不同值数量超过表中总行数的 10% 时,分析器(analyzer)会使用这种“比例”的表示方式。
如果预期数据是均匀分布的,则会直接使用不同值的数量。例如,在估算 column = expression 这种条件的基数(cardinality)时,如果在规划阶段无法确定表达式的具体取值,查询规划器会假设该表达式可以以相同的概率取列中的任意一个值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| => EXPLAIN SELECT * FROM flights WHERE departure_airport = ( SELECT airport_code FROM airports WHERE city = 'Saint Petersburg' ); QUERY PLAN −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Seq Scan on flights (cost=30.56..5340.40 rows=2066 width=63) Filter: (departure_airport = $0) InitPlan 1 (returns $0) −> Seq Scan on airports_data ml (cost=0.00..30.56 rows=1 wi... Filter: ((city −>> lang()) = 'Saint Petersburg'::text) (5 rows)
|