【问题标题】:Slow query with good plan好计划的慢查询
【发布时间】:2015-05-13 08:52:34
【问题描述】:

我们有两台服务器,最新的将替换最旧的。它们在性能方面几乎相同,除了单个查询。两个不同服务器中的相同查询(相同的数据库定义、相同的数据、刚刚从头开始重建的索引)在最新实例中需要更多时间。

这两个计划是相同的,而且非常简单:

 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.2 毫秒。在新服务器和旧服务器中都是如此。但是旧服务器中的时间是 30 毫秒,新服务器中的时间是 200 倍(2.2 秒 vs 30 毫秒)

什么会导致这种差异? postgresql 文档说,在 select 语句中,总运行时间和时间应该几乎相同......

谢谢

【问题讨论】:

  • 您是否分析或清理了相关表格?
  • 是的,两者都有。顺便说一句,该表是从另一台服务器中的一个转储创建的,因此从一开始它就应该是最佳的。

标签: postgresql sql-execution-plan


【解决方案1】:

据我了解,这是一个使用带有适当索引的嵌套循环的简单连接。问题应该是由于第二个(大)表的缓存不正确。这里可能第二个表就所使用的索引而言聚集严重。试试CLUSTER 命令看看是否有帮助。

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

【讨论】:

  • 总运行时间(0.153 毫秒)中没有缓存时间吗?文档指出总运行时间“不包括解析、重写或规划时间”[postgresql.org/docs/9.3/static/using-explain.html] 另外,什么可以改变两台服务器之间的缓存策略?
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2013-02-19
相关资源
最近更新 更多