我在Postgres Wiki读了慢计数条目 对于我的表,估算非常准确。但是 views
SELECT reltuples FROM pg_class WHERE relname = 'tbl';
不起作用,始终返回0条记录。有没有办法计算或估计Postgres中除此之外的视图行?
SELECT COUNT(*) FROM someview;
ANALYZE
对于视图都没有用(表没问题),我得到:
ANALYZE v_myview;
WARNING: skipping "v_myview" --- cannot analyze non-tables or special system tables
ANALYZE
答案 0 :(得分:2)
查询返回0,因为这是正确答案。
SELECT reltuples FROM pg_class WHERE relname = 'someview';
VIEW
(与Materialized Views不同)不包含任何行。在内部,它是一个带有ON SELECT DO INSTEAD
规则的空表(0行)。 Per documentation:
视图没有物理实现。而是运行查询 每次在查询中引用视图时。
因此,ANALYZE
不适用于观看次数
系统不维护视图的行数估计值。根据实际的视图定义,您可能能够从基础表的估计值中获取数字。
MATERIALIZED VIEW
也可能是良好解决方案:
CREATE MATERIALIZED VIEW someview_ct AS SELECT count(*) AS ct FROM someview;
或直接基于实际视图定义。通常比实现完整的派生表便宜得多。这是一个快照,就像pg_class
中的估算一样,在REFRESH
后立即更准确。您可以运行一次昂贵的计数并重复使用结果,直到您怀疑它仍然足够新鲜。