2013-04-01 3 views
0

고객 테이블이있는 외부 PG DB가있는 Rails 3.2.12 앱으로 인해 Rails 앱이 간헐적으로 중단됩니다. "geocodes"테이블이있는 로컬 PG DB가 있습니다. 외부 고객 테이블에 주어진 고객에 대한 위도가 & 일 수도 있고 없을 수도 있습니다. 따라서 고객 테이블에 위도/경도가없는 경우 로컬 지오 코드 테이블을 사용하여 잠시라도 잠자리에 &을 채우게됩니다.Postgres 설명문

그래서 레일에서는 내 고객 테이블 "has_one"지오 코드를 사용합니다.

어떤 일이 일어나고 것은 내가 결정하려고 나는 고객을 선택하고 할 때 PG가 간헐적으로 오류를 설명 받고, 그리고 오전 자신의 위도 & 긴 :

는 이러한 오류는 PG에 의해 트리거되는

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'

보일 문을 EXPLAIN 내가 설정 한 LIMIT에 반비례하여 변한다. 고객의 LIMIT이 100 인 경우 EXPLAIN이 실행되지 않으므로 오류가 발생하지 않습니다. 200으로 설정하면 오류가 약 50 % 발생합니다. 500의 한도는 내가 본 작업의 기회가 없습니다.

LIMIT를 200으로 설정하면 앱 페이지가 작동 할 확률이 약 50 % (고객 위치를 보여주는 Google지도)입니다. 거기에 것 같습니다 얼마나 빨리 내가 ​​페이지 & 그것이 새로 고침 사이의 상관 관계가 될 것입니다. 예 : 실패 후 페이지를 빠르게 새로 고치면 시간이 많이 걸리는 것처럼 보입니다. 몇 초가 지난 후 페이지를 보면 실패 할 것입니다.

치료 방법에 대한 아이디어가 있으십니까?

외부 PG 데이터베이스가 로컬 지오 코드 테이블에 대해 알지 못하고 EXPLAIN이 해당 외부 DB에서 트리거되고 있으므로 불만이 터집니다.

이러한 EXPLAIN 문을 실제로 멈추는 방법을 알아 내기 위해서는 PG의 내부 동작에 대해 충분히 알지 못합니다.

+0

Rails는 개발 모드에서 장기 실행 쿼리에 대해 자동으로'EXPLAIN'을 실행합니다. 왜 그것이 오류를 일으키는 지 모르겠습니다. 테이블이 존재하지 않는 것처럼 보이지만, 실행하는 데 걸리는 시간과 상관없이 모든 사용에 오류가 발생해야합니다. 마이그레이션되지 않은 DB에 대해이 작업을 실행하고 있습니까? 구성에 대한 설명은 [Riding Rails 문서] (http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/)를 참조하십시오. 그것은 개발 모드에서만 켜져 있어야하며 여전히 쿼리를 실행해야합니다. –

+1

당신은'config/environments/development.rb'에서'config.active_record.auto_explain_threshold_in_seconds'를 변경하기 위해 설명을 해제 할 수 있습니다. 이것을 0으로 설정하십시오. – house9

+0

Excellent! 설명 임계 값을 0으로 설정하면됩니다! – user2188073

답변

0

회답이 아닌 사람들은 적절한 환경에서 config.active_record.silence_auto_explain을 설정할 수 있습니다.