我想查找行是否是postgresql中索引列的一部分。
例如: 当我打开表对象时,我会看到索引以及每个索引的基数。
我在表中的总行数是1,45,454,但是所有索引的基数是1,45,300。在我创建的任何索引中,未索引约150个奇数行。
我运行以下查询以查找基数,
SELECT relname,
relkind,
reltuples AS cardinality,
relpages
FROM pg_class
WHERE relname LIKE '%table_name%';
有人可以解释为什么有些行作为索引的一部分,以及如何找到原始表中未索引的150行的行。
答案 0 :(得分:2)
我表中的总行数为1,45,454,但所有索引的基数为1,45,300
这意味着您有154个重复的索引条目,因此这154个(或更少)索引条目中的某些指向多于1行(或更多)。
答案 1 :(得分:1)
来自postgres documentation on planner statistics:
出于效率原因,
reltuples
和relpages
不会即时更新,因此它们通常包含一些过时的值。它们由VACUUM
,ANALYZE
和一些DDL命令(例如CREATE INDEX
)更新。不扫描整个表的VACUUM
或ANALYZE
操作(通常是这种情况)将根据它扫描的表的一部分来递增更新reltuples
的计数,得出一个近似值。无论如何,计划者都会缩放在pg_class
中找到的值以匹配当前的物理表大小,从而获得更接近的近似值。
换句话说,只要该数字大致正确,就没有错,也不必担心。如果该选项不正确(例如用“ 203”代替当前值),那么该在表上发布VACUUM
或ANALYZE
作业了。
还值得检查default_statistics_target
的值。如果将其设置得太低,您的统计信息最终将越来越少。