2013-07-05 48 views
2

在RavenDB網站上,它顯示「當您知道文檔ID時使用Load Over Query」。在我的大約1,500個對象的簡單集合的測試中,加載總是比較慢。爲什麼?RavenDB查詢<T>總是比加載速度快<T>

負載:

var doc = session.Load<Document>("Documents/123"); 

查詢

var doc = session.Query<Document>().Where(x => x.Id == "123").SingleOrDefault(); 

在測試,檢索每個文件,平均查詢時間爲66毫秒VS 137的負載。 RavenDB實例位於另一個辦公室,因此時間很長。無論應該加載不總是更快?

編輯

這說法我指的是http://ravendb.net/kb/31/my-10-tips-and-tricks-with-ravendb。提示#4。這是錯的嗎?

+1

RavenDB 2.0+不會*允許*您查詢某個ID。所以這不僅僅是一個最佳實踐,這是一個要求。 –

+0

@MattJohnson如果你想補充說,作爲答案,我會選擇它。我其實已經想過刪除這個問題,但顯然其他人也有同樣的問題。也許這沒有完全記錄。無論如何。 – Mark

回答

4

當通過Id檢索項目時,您需要需要才能使用.Load(id)方法。

Load是符合ACID的操作。它直接從文檔存儲中檢索文檔。

Query是「最終一致」的BASE操作。它首先針對索引,在文檔存儲中查找文檔,然後返回它們。如果文檔剛添加並且尚未編入索引,則Id查詢可能會返回null。

RavenDB 2.0添加了一項功能,以防止您通過Id查詢。如果你嘗試這樣做,它會拋出異常。所以使用Load不只是一種最佳實踐,而是一項要求。

6

根據我的理解,Load將保證返回一個結果(如果該ID存在於數據庫中),而如果索引尚未更新,Query可能不會返回結果。

你可能有一個場景,插入一條記錄,然後在下一行嘗試使用Query檢索相同的記錄,然後不會返回任何內容。在這種情況下,負載將返回一條記錄。

所以我猜你看到的性能下降可能與你在使用查詢時按索引查詢的事實有關,而Load則是在實際的數據存儲上。

+0

你的回答是有道理的,是我的假設,但RavenDB網站上的'當你知道文檔Id時使用Load Over Query'使我相信我做錯了什麼。 – Mark