Sql Postgres错误的行估计

Sql Postgres错误的行估计,sql,postgresql,Sql,Postgresql,我有一个包含2.69亿行的表fp\u v2\u fp\u basic\u prices,它有一个主键:(fsym\u id,p\u date) 查询: select fsym_id, max(p_price) price_max, min(p_price) price_min from fds.fp_v2_fp_basic_prices where p_date > date_trunc('day', current_timestamp + '-52 weeks'::interval)

我有一个包含2.69亿行的表
fp\u v2\u fp\u basic\u prices
,它有一个主键:
(fsym\u id,p\u date)

查询:

select fsym_id, max(p_price) price_max, min(p_price) price_min 
from fds.fp_v2_fp_basic_prices
where p_date > date_trunc('day', current_timestamp + '-52 weeks'::interval)
group by fsym_id
执行计划

HashAggregate  (cost=8650606.43..8650637.33 rows=3090 width=17)"
  Group Key: fsym_id"
  ->  Seq Scan on fp_v2_fp_basic_prices  (cost=0.00..8431874.20 rows=29164298 width=17)"
        Filter: (p_date > date_trunc('day'::text, (now() + '-364 days'::interval)))"
如您所见,估计的行数是3090,但查询实际上返回的是cca。13万行

我试着运行
analyze fp_v2_fp_basic_prices
vacuum analyze fp_v2_fp_basic_prices
,但没有任何变化

这个查询实际上是一个大得多的查询的一部分,我怀疑错误的估计导致了错误的执行计划,从而使整个查询变慢


有什么想法吗?

如果ANALYZE在估计列时做得不好,可以使用
alter table…alter column
为列设置n_distinct。这应该传递到子集的估计


使用的抽样方法存在一个缺陷,当表中的值高度聚集时,可能会严重低估n_distinct。

提供整个执行计划,并进行
解释(分析、成本、详细、缓冲区)
分组前符合日期条件的行数和表中的行总数是多少?整个表中分组的行数是多少?它认为整个表有多少分组行?@eshirvana整个执行计划是不相关的,因为仅此计划就返回了一个错误的估计值。@jjanes整个表有2.69亿条记录(不像我最初写的30条)。满足日期条件的记录数约为3000万条。由于查询未完成而找不到的分组行数(选择count(distinct fsym_id)…)。至于它认为整个表中有多少分组行:27897(我认为这是远远不够的)。