问题描述
在 Postgresql 中是否有多种设置 n_distinct
的方法?这两个似乎都在做同样的事情,但最终在 pg_attribute
中更改了不同的值。这两个命令有什么区别?
alter table my_table alter column my_column set (n_distinct = 500);
alter table my_table alter column my_column set statistics 1000;
select
c.relname,a.attname,a.attoptions,a.attstattarget
from
pg_class c
inner join
pg_attribute a
on c.oid = a.attrelid
where
c.relname = 'my_table'
and
a.attname = 'my_column'
order by
c.relname,a.attname;
Name |Value
-------------|----------------
relname |my_table
attname |my_column
attoptions |{n_distinct=500}
attstattarget|1000
解决方法
这两个似乎都在做同样的事情
为什么这么说?这两个命令显然是不同的。两者都与列统计和查询计划有关。但他们做的事情却截然不同。
统计目标...
通过 ANALYZE
控制为此列累积的统计信息的详细级别。见:
设置 n_distinct
是完全不同的。这意味着对给定列期望的不同值的数量(或比率)进行硬编码。 (但仅在下一个 ANALYZE
之后有效。)
有关 dba.SE 的相关答案以及更多关于 n_distinct
的内容: