0

Rails 3.2.12 应用程序带有一个外部 PG DB,它有一个客户表。我有一个本地 PG DB,它有一个“地理代码”表。外部客户表可能有也可能没有任何给定客户的纬度和经度,因此如果客户表没有任何纬度/经度,我使用本地地理编码表临时填充纬度和经度。

因此,在 Rails 中,我的客户表“has_one”地理编码。

发生的事情是我在选择客户时间歇性地收到 PG Explain 错误,然后尝试确定他们的纬度和经度:

PG::Error: ERROR: relation "geocodes" does not exist ~ |: EXPLAIN SELECT "geocodes".* FROM "geocodes" WHERE "geocodes"."customer_id" = 1417 LIMIT 1 ~ |Completed 500 Internal Server Error in 586ms ~ |
~ |ActiveRecord::StatementInvalid (PG::Error: ERROR: relation "geocodes" does not exist ~ |: EXPLAIN SELECT "geocodes".* FROM "geocodes" WHERE "geocodes"."customer_id" = 1417 LIMIT 1): ~ | app/controllers/maps_controller.rb:6:in `all'

这些错误是由 PG EXPLAIN 语句触发的,这些语句似乎与我设置的 LIMIT 成半正比变化。如果客户的 LIMIT 是 100,我永远不会触发 EXPLAIN,因此不会出错。如果我将它设置为 200,我大约有 50% 的时间会出错。LIMIT 500 没有我见过的工作机会。

当我将 LIMIT 设置为 200 时,我有大约 50% 的机会让应用程序页面正常工作(这是显示客户位置的谷歌地图)。我刷新页面的速度与它是否有效之间似乎存在相关性例如:如果我在失败后快速刷新页面,看起来它的工作率很高。如果我在超过几秒的时间间隔后查看页面,它似乎失败了。

关于如何治愈这个的任何想法?

我自己普遍认为外部 PG DB 不知道本地地理编码表,并且 EXPLAIN 正在该外部 DB 上被触发,因此它爆炸了。

我对 PG 的内部运作知之甚少,无法真正弄清楚如何阻止这些 EXPLAIN 语句的发生。

4

1 回答 1

0

对于那些寻求不那么迂回的答案的人,请注意,也可以config.active_record.silence_auto_explain在适当的环境中设置。

于 2014-08-25T19:03:00.433 回答