如何查找该行是否为索引的一部分?

时间:2019-05-13 16:11:07

标签: postgresql indexing cardinality

我想查找行是否是postgresql中索引列的一部分。

例如: 当我打开表对象时,我会看到索引以及每个索引的基数。

我在表中的总行数是1,45,454,但是所有索引的基数是1,45,300。在我创建的任何索引中,未索引约150个奇数行。

我运行以下查询以查找基数,

SELECT relname, 
       relkind, 
       reltuples AS cardinality, 
       relpages 
FROM   pg_class 
WHERE  relname LIKE '%table_name%'; 

有人可以解释为什么有些行作为索引的一部分,以及如何找到原始表中未索引的150行的行。

2 个答案:

答案 0 :(得分:2)

  

我表中的总行数为1,45,454,但所有索引的基数为1,45,300

这意味着您有154个重复的索引条目,因此这154个(或更少)索引条目中的某些指向多于1行(或更多)。

答案 1 :(得分:1)

来自postgres documentation on planner statistics

  

出于效率原因,reltuplesrelpages不会即时更新,因此它们通常包含一些过时的值。它们由VACUUMANALYZE和一些DDL命令(例如CREATE INDEX)更新。不扫描整个表的VACUUMANALYZE操作(通常是这种情况)将根据它扫描的表的一部分来递增更新reltuples的计数,得出一个近似值。无论如何,计划者都会缩放在pg_class中找到的值以匹配当前的物理表大小,从而获得更接近的近似值。

换句话说,只要该数字大致正确,就没有错,也不必担心。如果该选项不正确(例如用“ 203”代替当前值),那么该在表上发布VACUUMANALYZE作业了。

还值得检查default_statistics_target的值。如果将其设置得太低,您的统计信息最终将越来越少。