特定PostgreSQL客户端/版本中的慢速查询
我有一个返回0行的查询,但在一台特定的机器中,需要大约10秒才能完成。在其他每台机器上,我都使用相同的数据库进行了测试,尽管postgres版本不同,查询几乎是即时的 此外,我通过对查询进行解释分析得到的结果在快速机器中大致相同,但在有问题的机器中有点不同,它似乎从未进行并行顺序扫描,而所有其他机器都进行了并行顺序扫描,尽管每台机器中的并行工作配置都是相同的。结果同一数据库,PC1为问题数据库:特定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
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