如何估计PostgreSQL视图的行数?

时间:2015-01-26 19:24:17

标签: sql postgresql view count

我在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

1 个答案:

答案 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后立即更准确。您可以运行一次昂贵的计数并重复使用结果,直到您怀疑它仍然足够新鲜。