PostgreSQL:为什么“选择进入”比来自同一源表的“选择计数”更快?

问题描述 投票:0回答:1

将PG从11升级到15后,我遇到以下情况:

旧(工作)设置: Postgres 11 PostGIS 2.5

设置: Postgres 15 PostGIS 3.3

table_1(~14.000.000 行)

当我这样做时

select count(*) from table_1
,它似乎永远不会完成。 当我做
select * into table_2 from table_1
select count(*) from table_2
时,它会在〜15分钟内完成。

具体说法是:

-- this never stops
select count(*)
FROM table_1 t1
INNER JOIN table_1 t2 ON (ST_Equals(t1.wkb_geometry, t2.wkb_geometry))
WHERE t1.gid > t2.gid
;
-- this works
select *
into table_2
from table_1 
;
select count(*)
FROM table_2 t1
INNER JOIN table_2 t2 ON (ST_Equals(t1.wkb_geometry, t2.wkb_geometry))
WHERE t1.gid > t2.gid
;

在这两种情况下,都会在 wkb_geometry 上创建索引,如下所示:

CREATE INDEX table_1_geom ON table_1 
USING gist (wkb_geometry)
TABLESPACE pgdata;

我已经重新创建了索引并清理了表,但对我来说没有任何作用。

sql postgresql postgis postgresql-11 postgresql-15
1个回答
0
投票

这个问题讲的是如何查看索引上的统计数据

我如何知道 Postgres 表的统计信息是否是最新的?

我认为问题可能是随着时间的推移,索引变得陈旧——如果你不更新表上的统计信息,它们可能会变得“糟糕”,然后就无法工作。当您创建一个新表时,您会创建一个新索引,因此新表始终具有新的统计数据。

如果您懒得做这些,您也可以删除索引并重新创建它。如果这解决了问题,那么您知道您需要设置一个后台作业来经常(每周?)更新统计数据

© www.soinside.com 2019 - 2024. All rights reserved.