PostgreSQL n_distinct 统计设置

问题描述

在 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 控制为此列累积的统计信息的详细级别。见:

Basics in the manual.

设置 n_distinct 是完全不同的。这意味着对给定列期望的不同值的数量(或比率)进行硬编码。 (但仅在下一个 ANALYZE 之后有效。)

有关 dba.SE 的相关答案以及更多关于 n_distinct 的内容:

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...