慢的查询与良好的计划

时间:2015-05-13 08:52:35

标签: postgresql sql-execution-plan

我们有两台服务器,最新的将取代最旧的服务器。除了单个查询之外,它们的性能几乎相同。两个不同服务器中的相同查询(相同的数据库定义,相同的数据,从头开始重建的索引)在最新的实例中花费的时间更多。

两个计划完全相同,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语句中,总运行时间和时间应该几乎相同......

感谢

1 个答案:

答案 0 :(得分:0)

据我所知,这是一个使用嵌套循环和适当索引的简单连接。问题应该是由于第二(大)表的缓存不良。这里可能第二个表相对于使用的索引严重聚类。尝试使用CLUSTER命令查看是否有帮助。

您也可以尝试更改计划。您可能需要的选项 - 交换连接顺序,使用散列连接。