如何估计 PostgreSQL 视图的行数?

Mat*_*ert 5 sql postgresql view count

我阅读了Postgres Wiki中的慢速计数条目。
对于我的表格来说,估计值相当准确。不过,对于观点

SELECT reltuples FROM pg_class WHERE relname = 'tbl';
Run Code Online (Sandbox Code Playgroud)

不起作用并且总是返回 0 条记录。除此之外,还有其他方法可以计算或估计 Postgres 中视图的行数吗?

SELECT COUNT(*) FROM someview; 
Run Code Online (Sandbox Code Playgroud)

ANALYZE对于视图也不起作用(对于表没有问题),我只是得到:

 ANALYZE v_myview;
 WARNING:  skipping "v_myview" --- cannot analyze non-tables or special system tables
 ANALYZE
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

查询返回,0因为这是正确的答案。

SELECT reltuples FROM pg_class WHERE relname = 'someview';
Run Code Online (Sandbox Code Playgroud)

A VIEW(与物化视图不同)不包含任何行。在内部,它是一个带有规则的空表(0 行)ON SELECT DO INSTEAD手册:

该视图并未物理实体化。相反,每次在查询中引用视图时都会运行该查询。

因此,ANALYZE不适用于视图。
系统不维护视图的行计数估计。根据实际的视图定义,您也许能够从基础表的估计中得出一个数字。

AMATERIALIZED VIEW也可能是一个很好的解决方案

CREATE MATERIALIZED VIEW someview_ct AS SELECT count(*) AS ct FROM someview;
Run Code Online (Sandbox Code Playgroud)

或者直接基于实际的视图定义。通常比具体化完整的派生表便宜得多。这是一个快照,就像 中的估计一样pg_class,只是在 后立即更准确REFRESH。您可以运行一次昂贵的计数并重复使用结果,直到您怀疑它是否仍然足够新鲜为止。

有关的: