2011-07-17 64 views
3

在意識到應用程序由於ORM而遭受N + 1問題之後,我想要獲得有關可以執行的改進的更多信息以及使用時間比較之前的改進(與N + 1問題)和之後。
那麼這樣的改進之前和之後的時間差是多少?
任何人都可以給我一個鏈接到一些分析問題和檢索統計的文章嗎?Rails:N + 1問題...需要統計數據

回答

4

你真的不需要這個統計數據,只是數學。 N + 1(或更好的1 + N)表示

  • 1查詢來獲取記錄,並
  • N次查詢得到它

更大的N是,相關聯的所有記錄性能會受到更多影響,特別是如果您的查詢通過網絡發送到遠程數據庫。這就是爲什麼N + 1問題在生產中不斷出現的原因 - 它們在開發模式中通常微不足道,而數據庫中的數據很少,但隨着數據在生產中增長到數千或數百萬行,您的查詢將緩慢地窒息您的服務器。

您可以改用

  • 單個查詢(通過連接)或
  • 2查詢(一個用於主記錄,一個所有相關記錄

第一個查詢會返回比嚴格需要的數據更多的數據(第一條記錄的數據將在每一行中被複制),但這通常是一個很好的權衡。第二個查詢可能會對大數據集有點麻煩,因爲所有外鍵都作爲一個單一的範圍,但再次,它通常是一個值得做的折衷。

實際數字取決於太多的變量,使統計數據有意義。數字或記錄,數據庫版本,硬件等。

由於您用rails標記了這個問題,ActiveRecord在避免N + 1查詢方面做得很好,如果您知道如何使用它。查看eager loading的解釋。

0

時差將取決於由於N + 1問題而執行了多少次附加選擇。下面是關於給予另一stackoverflow question答案報價N + 1 -

報價開始

SELECT * FROM Cars; 

/* for each car */ 
SELECT * FROM Wheel WHERE CarId = ? 

換句話說,你有一個選擇的汽車,然後再增加額外的N選擇,其中N是汽車總數。

報價結束

在上述時間差的例子將取決於許多汽車的記錄是如何在數據庫中,並花了多長時間,每次查詢「輪」表中的代碼/ ORM獲取的新紀錄。如果你只有2輛車的記錄,那麼消除N + 1問題後的差異可以忽略不計,但如果你有一百萬輛汽車記錄,那麼它將會產生重大影響。