特定PostgreSQL客户端/版本中的慢速查询

特定PostgreSQL客户端/版本中的慢速查询,sql,database,postgresql,query-optimization,Sql,Database,Postgresql,Query Optimization,我有一个返回0行的查询,但在一台特定的机器中,需要大约10秒才能完成。在其他每台机器上,我都使用相同的数据库进行了测试,尽管postgres版本不同,查询几乎是即时的 此外,我通过对查询进行解释分析得到的结果在快速机器中大致相同,但在有问题的机器中有点不同,它似乎从未进行并行顺序扫描,而所有其他机器都进行了并行顺序扫描,尽管每台机器中的并行工作配置都是相同的。结果同一数据库,PC1为问题数据库: PC#1, PostgreSQL 11.5 Seq Scan on cc_parc (cost

我有一个返回0行的查询,但在一台特定的机器中,需要大约10秒才能完成。在其他每台机器上,我都使用相同的数据库进行了测试,尽管postgres版本不同,查询几乎是即时的

此外,我通过对查询进行解释分析得到的结果在快速机器中大致相同,但在有问题的机器中有点不同,它似乎从未进行并行顺序扫描,而所有其他机器都进行了并行顺序扫描,尽管每台机器中的并行工作配置都是相同的。结果同一数据库,PC1为问题数据库:


PC#1, PostgreSQL 11.5

Seq Scan on cc_parc  (cost=0.00..1175721.63 rows=58 width=853) (actual time=9537.152..9537.152 rows=0 loops=1)
  Filter: ((class = 'db1.C_Parcela'::text) AND (fact = 221327))
  Rows Removed by Filter: 217422
  Buffers: shared hit=8034 read=1163008
Planning Time: 0.448 ms
Execution Time: 9537.602 ms

此外,过滤行的数量也不同,具体查询选择*from cc_parc,其中class='db1.C_Parcela'和fact=221327; 返回0行,其计数值为217422,但在不同的计算机中,筛选器行数不同

PC1-被筛选器删除的行:217422

所有其他PC-过滤器移除的行:72474

我还尝试在同一台机器上运行所有相同的测试,但使用PostgreSQL 12,情况得到解决,值再次达到预期值:

PC#1, PostgreSQL 12.2

Gather  (cost=1000.00..11684.59 rows=7 width=377) (actual time=94.210..99.924 rows=0 loops=1)
  Workers Planned: 2
  Workers Launched: 2
  Buffers: shared hit=370 read=8955
  ->  Parallel Seq Scan on cc_parc  (cost=0.00..10683.89 rows=3 width=377) (actual time=51.816..51.816 rows=0 loops=3)
        Filter: ((class = 'db1.C_Parcela'::text) AND (fact = 221327))
        Rows Removed by Filter: 72474
        Buffers: shared hit=370 read=8955
Planning Time: 4.815 ms
Execution Time: 100.059 ms


我可以安全地假设PostgreSQL 11版本中存在某种导致此问题的错误,或者有人有其他想法吗?

我注意到,在同一psql版本中进行转储和恢复后,问题自行解决

在分析pgstattuple'public.cc_parc'中select*的输出之后;比较有缺陷的数据库和正常运行的数据库的结果,我注意到有缺陷的数据库中的表_长度是有缺陷数据库的125倍大。。。这当然不是事实

在工作台上运行全真空后,工作台长度恢复到其正确值,慢度问题完全解决


运行完全真空似乎不可取,因此我将尝试找出是什么像这样使数据库膨胀。显然,中的大多数建议似乎都是适当的

可能类似于@a_horse_with_no_name有趣的文章,但可能不是问题所在,因为对数据库的访问都不是从某个可以限制最大行数的地方完成的,所有访问都是从命令行完成的。此外,计划中的工人甚至没有出现。例如,当我将max_-Worker_进程和相关Worker参数更改为愚蠢的数量99时,我成功地让1个Worker出现,但只有1个出现,并且查询时间没有差异。

PC#3, PostgreSQL 13.2

Gather  (cost=1000.00..11684.39 rows=5 width=1495) (actual time=70.610..88.546 rows=0 loops=1)
  Workers Planned: 2
  Workers Launched: 2
  Buffers: shared hit=212 read=9113
  ->  Parallel Seq Scan on cc_parc  (cost=0.00..10683.89 rows=2 width=1495) (actual time=43.353..43.353 rows=0 loops=3)         Filter: ((class = 'db1.C_Parcela'::text) AND (fact = 221327))
        Rows Removed by Filter: 72474
        Buffers: shared hit=212 read=9113
Planning:
  Buffers: shared hit=311 read=6
Planning Time: 1.047 ms
Execution Time: 88.604 ms


PC#4, PostgreSQL 10.5

Gather  (cost=1000.00..11685.63 rows=6 width=377) (actual time=98.253..121.924 rows=0 loops=1)
  Workers Planned: 2
  Workers Launched: 2
  Buffers: shared hit=2 read=9324
  ->  Parallel Seq Scan on cc_parc  (cost=0.00..10685.03 rows=2 width=377) (actual time=53.534..53.535 rows=0 loops=3)
        Filter: ((class = 'db1.C_Parcela'::text) AND (fact = 221327))
        Rows Removed by Filter: 72474
        Buffers: shared hit=2 read=9324
Planning time: 7.315 ms
Execution time: 122.090 ms

PC#1, PostgreSQL 12.2

Gather  (cost=1000.00..11684.59 rows=7 width=377) (actual time=94.210..99.924 rows=0 loops=1)
  Workers Planned: 2
  Workers Launched: 2
  Buffers: shared hit=370 read=8955
  ->  Parallel Seq Scan on cc_parc  (cost=0.00..10683.89 rows=3 width=377) (actual time=51.816..51.816 rows=0 loops=3)
        Filter: ((class = 'db1.C_Parcela'::text) AND (fact = 221327))
        Rows Removed by Filter: 72474
        Buffers: shared hit=370 read=8955
Planning Time: 4.815 ms
Execution Time: 100.059 ms