簡體   English   中英

如何在Rails中修復pg_attribute表上的慢速隱式查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM