2012-01-03 36 views
6

Trong khi truy vấn RavenDB tôi nhận thấy rằng nó không nhận được kết quả mong đợi ngay lập tức. Có thể nó đã làm với lập chỉ mục, tôi không biết.RavenDB - vấn đề truy vấn - Kết quả/chỉ mục cũ

Ví dụ:

int ACount = session.Query<Patron>() 
        .Count(); 

    int BCount = session.Query<Theaters>() 
        .Count(); 

    int CCount = session.Query<Movies>() 
        .Where(x => x.Status == "Released")            
        .Count(); 

    int DCount = session.Query<Promotions>() 
        .Count(); 

Khi tôi thực hiện điều này sau đó ACountBCount có được giá trị của họ ngay lập tức trên chạy đầu tiên). Tuy nhiên CCountDCount không nhận được giá trị của chúng cho đến sau ba hoặc bốn lần chạy. Chúng hiển thị giá trị 0 (không) trong vài lần chạy đầu tiên.

Tại sao điều này xảy ra cho hai truy vấn dưới cùng và không phải là hai truy vấn hàng đầu? Nếu nó do kết quả cũ (hoặc chỉ mục) thì làm thế nào tôi có thể sửa đổi truy vấn của tôi để có được kết quả chính xác mỗi lần, khi tôi chạy nó lần đầu tiên. Cảm ơn bạn đã giúp đỡ.

Trả lời

14

Nếu bạn chưa xác định chỉ mục cho truy vấn Phim, Raven sẽ tạo một Dynamic Index. Nếu bạn sử dụng truy vấn nhiều lần, chỉ mục sẽ tự động được duy trì. Nếu không Raven sẽ loại bỏ nó và điều đó có thể giải thích tại sao bạn nhận được 0 kết quả trong một vài lần chạy đầu tiên. Bạn cũng có thể hướng dẫn Raven đợi quá trình lập chỉ mục để đảm bảo rằng bạn sẽ luôn nhận được kết quả chính xác nhất (mặc dù điều này có thể không tốt vì nó sẽ làm chậm truy vấn của bạn) bằng cách sử dụng WaitForNonStaleResults hướng dẫn:

session.Query<Movies>() 
.Customize(x => x.WaitForNonStaleResults()) 
.Where(x => x.Status == "Released")            
.Count(); 
+0

Làm cách nào để giải quyết vấn đề thời gian chờ? Tôi nhận được một lỗi thời gian ra khi tôi đang sử dụng .waitfornonstaleresults() trong truy vấn. – ZVenue

+0

TimeOutException được giải mã bởi mã người dùng: {"Chờ 15.250ms cho truy vấn trả lại kết quả không cũ."} - là thông báo. . – ZVenue

+3

Tôi đã sử dụng .... Tùy chỉnh (x => x.WaitForNonStaleResults (TimeSpan.FromSeconds (100))) để sửa lỗi ngoại lệ. – ZVenue

1

Cần đặt WaitForNonStaleResults trong mỗi truy vấn có cảm giác giống như "mùi mã" lớn (có vẻ như hoàn toàn thích hợp ở đây).

Các giải pháp thực tế duy nhất mà tôi đã tìm thấy cho đến nay là:

var store = new DocumentStore(); // do whatever 
store.DatabaseCommands.DisableAllCaching(); 

Performance bị cho phù hợp, nhưng tôi nghĩ rằng hiệu suất chậm hơn là ít của một tội lỗi hơn không đáng tin cậy nếu kết quả không hoàn toàn chính xác.

0

Bạn có các tùy chọn sau đây theo the official documentation (các thích hợp nhất đầu tiên):

  1. Setting cắt điểm.

    WaitForNonStaleResultsAsOfLastWrite(TimeSpan.FromSeconds(10)) hoặc WaitForNonStaleResultsAsOfNow()

    Điều này sẽ đảm bảo rằng bạn sẽ có được kết quả mới nhất đến thời điểm đó trong thời gian (hoặc cho đến khi ghi cuối cùng). Và bạn có thể đặt một nắp trên nó (ví dụ 10s), nếu bạn muốn hy sinh độ tươi của kết quả để nhận phản hồi nhanh hơn.

  2. Rõ ràng chờ đợi kết quả phi cũ WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    Một lần nữa, xác định một time-out sẽ là một thực hành tốt.

  3. Setting truy vấn ước để áp dụng các quy tắc tương tự cho tất cả các yêu cầu

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite.

Các vấn đề liên quan