我有一张很大的桌子。所以我分了这张桌子。并将所有记录从主表复制到子表。然后我从主表中删除了所有记录。现在我的主桌空了。对子表进行查询非常快。但是在主表上进行查询仍然非常缓慢。怎么了?

postgres=# select count(*) from only cdr;
 count
-------
     0
(1 row)

postgres=# explain select count(*) from only cdr;
                              QUERY PLAN
-----------------------------------------------------------------------
 Aggregate  (cost=2045094.31..2045094.32 rows=1 width=0)
   ->  Seq Scan on cdr  (cost=0.00..2044867.85 rows=90585 width=0)
(2 rows)

postgres=# EXPLAIN ANALYZE select count(*) from only cdr;
                                                        QUERY PLAN

----------------------------------------------------------------------------------------------------------------------
-----
 Aggregate  (cost=2045094.31..2045094.32 rows=1 width=0) (actual time=168385.356..168385.356 rows=1 loops=1)
   ->  Seq Scan on cdr  (cost=0.00..2044867.85 rows=90585 width=0) (actual time=168385.351..168385.351 rows=0 loop
s=1)
 Total runtime: 168385.404 ms
(3 rows)

我还在主桌上做了真空分析。但还是没有运气。
postgres=#真空分析cdr;
真空
我发现其他人也有同样的问题。可能根本原因是尽管主表中的旧记录已被删除,但psql仍然以某种方式扫描这些垃圾数据。一种解决方案是创建一个新的主表,并放弃旧的主表。但这个办法不适合我。有没有其他没有停机时间的解决方案?谢谢!

最佳答案

我解决了这个问题。只需要在主桌上运行“vacuum full”或“cluster”。

08-17 11:47