将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;
我已经重新创建了索引并清理了表,但对我来说没有任何作用。
这个问题讲的是如何查看索引上的统计数据
我认为问题可能是随着时间的推移,索引变得陈旧——如果你不更新表上的统计信息,它们可能会变得“糟糕”,然后就无法工作。当您创建一个新表时,您会创建一个新索引,因此新表始终具有新的统计数据。
如果您懒得做这些,您也可以删除索引并重新创建它。如果这解决了问题,那么您知道您需要设置一个后台作业来经常(每周?)更新统计数据