2016-08-04 47 views
14

在我們的生產環境中,我們注意到Rails應用程序中出現頻繁的尖峯(〜每1小時)。深入挖掘,這是由於以下查詢在單個HTTP請求中累計運行時間大於1.5 s(稱爲100x)。如何修復Rails中pg_attribute表的緩慢隱式查詢

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 

我們沒有明確調用該表的代碼,但似乎Rails調用它來確定每個模型的屬性。 「Unexpected SQL queries to Postgres database on Rails/Heroku」是相關的。

但不應該被Rails重複調用嗎?

我們如何加快速度?

+0

你有沒有發現我們這裏叫什麼名字?如果是這樣,你可能會想出如何在memcache或類似的緩存中緩存這個響應,並減少頻率。我不會一起消除任何核心導軌調用,但用ttl緩存可能會有所幫助。只是一個想法。 – engineersmnky

+0

Thx用於編輯。事情是,我們從來沒有明確地稱呼它。也許是某種事物的副作用。任何想法如何追溯? –

+0

'運行時間大於1.5ms'我不會稱這個*慢*'爲100x',但我不會反覆調用il一百次。這看起來像一個RoR「功能」 – joop

回答

0

我們通過一個稱爲熱切加載的術語來加速它。 eager_load Active Record方法允許我們不對錶中的每一行執行N + 1查詢。否則,rails不知道自己在做什麼,並且對於不在同一個表中的每個屬性,默認爲單獨的SELECT/JOIN。

希望這有助於!

0

我到目前爲止工作過的任何Rails應用程序中都沒遇到過這個問題。我認爲您的解決方案是將active-record-query-trace添加到您的項目中,並檢查觸發此查詢的是什麼。

在工作中我使用此設置:

# 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 

然後,只需啓動你的Rails服務器這樣的:AR_TRACER=1 bundle exec rails s