[英]Rails Application keep heating pg_type and pg_attribute table how to reduse this call
[英]How to fix a slow implicit query on pg_attribute table in Rails
在我們的生產環境中,我們注意到Rails應用程序中頻繁出現峰值(〜每1小時一次)。 深入挖掘,這是由於以下查詢在單個HTTP請求中累計運行> 1.5 s(稱為100x)。
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調用它來計算每個模型的屬性。 “ 對Rails / Heroku上的Postgres數據庫的意外SQL查詢 ”是相關的。
但不應該被Rails稱為非重復性的嗎?
我們如何加快速度?
在生產中,每個Rails進程將為它遇到的每個表/模型運行一次該查詢。 這是每個rails s
一次,而不是每個請求:如果你反復看到它,我會調查你的進程是否因某種原因頻繁重啟。
要完全消除這些運行時查詢,可以在服務器上生成模式緩存文件 :
RAILS_ENV=production rails db:schema:cache:dump
(Rails 4: RAILS_ENV=production bin/rake db:schema:cache:dump
)
該命令將立即執行查詢,然后將其結果寫入緩存文件,未來的Rails進程將直接加載而不是檢查數據庫。 當然,您將需要在任何未來的數據庫架構更改后重新生成緩存。
我到目前為止工作的任何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
。
按照本期評論中的建議,您可以將其添加到Procfile
:
web: rails db:schema:cache:dump && rails s ...
如果您使用的是Heroku,則不能簡單地使用heroku run ...
運行它heroku run ...
因為模式轉儲僅在每個服務器的基礎上生成,並且命令將在一次性dyno上運行,該命令將在命令后立即消失運行。 您需要確保它在引導時在每個服務器上運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.