我们有两台服务器,最新的将取代最旧的服务器。除了单个查询之外,它们的性能几乎相同。两个不同服务器中的相同查询(相同的数据库定义,相同的数据,从头开始重建的索引)在最新的实例中花费的时间更多。
两个计划完全相同,qwery非常简单:
Nested Loop (cost=0.00..17.83 rows=1 width=2262) (actual time=0.032..0.032 rows=0 loops=1)
Buffers: shared hit=3
-> Index Scan using psan_para_fk_ix on parasetana a0 (cost=0.00..9.48 rows=1 width=1735) (actual time=0.030..0.030 rows=0 loops=1)
Index Cond: (((ca)::text = 'r'::text) AND (idp = 36678502::numeric))
Filter: (flg = '1'::bpchar)
Buffers: shared hit=3
-> Index Scan using seta_pk on seta a1 (cost=0.00..8.33 rows=1 width=527) (never executed)
Index Cond: (((a1.ca)::text = 'r'::text) AND (a1.idgrla = a0.idgrla ) AND (a1.prog = a0.prog_set))
Filter: (a1.flgp = '0'::bpchar)
Total runtime: 0.153 ms
(10 rows)
时间:2217.074毫秒
如您所见,总运行时间为0.2ms。新服务器和旧服务器都是如此。但旧服务器中的时间是30ms,新服务器中的时间是200倍(2.2秒对30毫安)
什么能造成这种差异? postgresql doc说,在select语句中,总运行时间和时间应该几乎相同......
感谢
答案 0 :(得分:0)
据我所知,这是一个使用嵌套循环和适当索引的简单连接。问题应该是由于第二(大)表的缓存不良。这里可能第二个表相对于使用的索引严重聚类。尝试使用CLUSTER
命令查看是否有帮助。
您也可以尝试更改计划。您可能需要的选项 - 交换连接顺序,使用散列连接。