2015-11-29 40 views
1

當我用大約25K記錄填充我的數據庫時,我注意到我的應用程序開始工作緩慢。我已經檢出了日誌,並意識到ActiveRecord不是一個SQL請求,而是執行更多的八個。我已經重寫了代碼以使用一個SQL請求,並且它已經將應用程序的速度提高了兩倍。在某些情況下使用原始SQL請求是否正確?

那麼,在重負載的應用程序的部分編寫原始SQL請求是否正確?

+1

簡短的回答 - 是的 – dotnetom

+0

一個問題可能是,你成爲DB依賴。所以儘量避免使用非常特殊的SQL命令(或者接受依賴)。但除此之外:是的。 – knut

+0

這是一個問題,更多的是討論而不是可以被接受爲正確答案的答案。如果您不使用它作爲討論平臺,堆棧溢出最有效。 – Meier

回答

1

有時您需要eager load您的數據。其他時候,你真的需要編寫原始SQL查詢

1

使用原始SQL有時是正確的,因爲ActiveRecord和Arel不容易使用完整的SQL語法,有時候將範圍表達爲一個原始的SQL片段,但對性能問題的第一個響應是使用原始SQL是不正確的。

在使用原始SQL之前,最好先探索加載和加載方法以及其他選項,因爲您可能會使應用程序對將來的更改變得不靈活。

如果您發佈導致問題的代碼以及由它生成的SQL,那麼您可能會得到有關如何避免原始SQL的有用建議。

+0

「通過達到原始SQL來響應性能問題是不正確的」。考慮遞歸查詢,使用遞歸CTE(即'WITH RECURSIVE')可以爲您提供超越手動遞歸的巨大性能優勢。窗口功能也可以爲您帶來巨大的性能提升。不要介意數據庫沒有普遍支持的類型或AR對SQL的解釋。所有這些東西都將你推到SQL中。是的,您可以使用Arel避免編寫SQL,但只有瘋子(或虐待者)親手寫Arel。 –

+0

@ muistooshort爲了更好地表達我自己,我稍微調整了措辭。確實,SQL可以帶來巨大的性能提升 - 我的Rails應用中有一個PostgreSQL存儲過程,其中包含一行400行SQL語句 - 但我建議先用盡所有合理的基於Rails的替代方法。 –

相關問題