Rails

2016-08-04 19 views
14

'daki pg_attribute tablosundaki yavaş örtülü bir sorgunun düzeltilmesi Üretim ortamımızda, Rails uygulamasında sık sık ani (her 1 saatte bir) fark ettik. Daha derine inmek, tek bir HTTP isteğinde kümülatif olarak> 1.5 s (100x) olarak adlandırılan aşağıdaki sorgudan kaynaklanır.Rails

SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a 
LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
WHERE a.attrelid = ?::regclass AND a.attnum > ? AND NOT a.attisdropped 
ORDER BY a.attnum 

Biz açıkça bu tabloyu çağıran kod var ama her model için özelliklerini anlamaya Raylar tarafından denir görünüyor yoktur. "Unexpected SQL queries to Postgres database on Rails/Heroku" ile ilgili.

Ancak Rails tarafından tekrarlı olarak çağrılmamalı mıydı?

Bunu nasıl hızlandırabiliriz?

+0

Bu aramanın nerede olduğunu belirlediniz mi? Öyleyse, muhtemelen bu yanıtı memcache veya benzerlerinde nasıl önbelleğe alabileceğinizi ve sıklığı nasıl azaltabileceğinizi anlayabilirsiniz. Çekirdek rayları bir araya getirmeyi asla ortadan kaldırmazdım, ancak bir ttl ile önbelleğe alma yardımcı olabilir. Sadece bir düşünce. Düzenleme için – engineersmnky

+0

Thx. Mesele şu ki, bunu asla açık bir şekilde değiliz. Belki de bir şeyin yan etkisi. İzlemenin nasıl bir fikri var? –

+0

'' 1.5 ms'de çalışır. Ben buna * yavaş * diyemezdim ve 100x' denir ama tekrar tekrar yüzlerce kez çağırmazdım. Bu bir RoR "özelliği" – joop

cevap

0

Bunu, istekli yükleme denilen bir terimle hızlandırıyoruz. Eager_load Aktif Kayıt yöntemi, tablonuzdaki her satır için N + 1 sorgusunu yapmamamızı sağlar. Aksi halde raylar ne yaptığınızı bilmez ve aynı tabloda bulunmayan her bir özellik için ayrı bir SELECT/JOIN varsayılanıdır.

Bu yardımcı olur umarım !!!

0

Şimdiye kadar çalıştığım herhangi bir Rails uygulamasında bu sorunu yaşamadım. Çözümünüzün projenize active-record-query-trace eklemesini ve bu sorguyu tetikleyen neyin kontrol ettiğini düşünüyorum.

# Gemfile 
group :test, :development do 
    gem "active-record-query-trace" 
end 

# config/initializers/ar_tracer.rb 
if ENV.has_key?("AR_TRACER") && defined? ActiveRecordQueryTrace 
    ActiveRecordQueryTrace.enabled = true 
    ActiveRecordQueryTrace.lines = 20 # you may want to increase if not enough 
end 

Sonra sadece bu gibi raylar sunucusu başlatmak: İş yerinde

ben bu kurulum kullanabilirsiniz AR_TRACER=1 bundle exec rails s.