2012-01-14 37 views
8

Tôi đang thử nghiệm RavenDB cho các dự án tương lai của mình. Hiệu suất cơ sở dữ liệu là một yêu cầu bắt buộc đối với tôi, đó là lý do tại sao tôi muốn có thể điều chỉnh RavenDB ít nhất trong phạm vi hiệu suất của SQL Server, nhưng các thử nghiệm của tôi cho thấy db raven chậm hơn khoảng 10 lần so với SQL Server khi RavenDB được lập chỉ mục và SQL Server không có bất kỳ chỉ mục nào.RavenDB chọn hiệu suất kém

Tôi đã điền dữ liệu 150k vào cơ sở dữ liệu. Mỗi tài liệu có một bộ sưu tập các phần tử con. Kích thước Db là xấp xỉ. 1GB và như vậy là kích thước chỉ mục quá. Raven/ESENT/CacheSizeMax được thiết lập đến 2048 và Raven/ESENT/MaxVerPages được thiết lập để 128. Đây là cách các tài liệu trông giống như:

{ 
    "Date": "2028-09-29T01:27:13.7981628", 
    "Items": [ 
    { 
     { 
     "ProductId": "products/673", 
     "Quantity": 26, 
     "Price": { 
     "Amount": 2443.0, 
     "Currency": "USD" 
     } 
    }, 
    { 
     "ProductId": "products/649", 
     "Quantity": 10, 
     "Price": { 
     "Amount": 1642.0, 
     "Currency": "USD" 
     } 
    } 
    ], 
    "CustomerId": "customers/10" 
} 


public class Order 
{ 
    public DateTime Date { get; set; } 
    public IList<OrderItem> Items { get; set; } 
    public string CustomerId { get; set; } 
} 

public class OrderItem 
{ 
    public string ProductId { get; set; } 
    public int Quantity { get; set; } 
    public Price Price { get; set; } 
} 

public class Price 
{ 
    public decimal Amount { get; set; } 
    public string Currency { get; set; } 
} 

Dưới đây là chỉ số định nghĩa:

from doc in docs.Orders 
from docItemsItem in ((IEnumerable<dynamic>)doc.Items).DefaultIfEmpty() 
select new { Items_Price_Amount = docItemsItem.Price.Amount, Items_Quantity = docItemsItem.Quantity, Date = doc.Date } 

tôi xác định chỉ số sử dụng phòng thu quản lý, không phải từ mã BTW (không biết nếu nó có bất kỳ tác động tiêu cực/tích cực trên perfromance).

Truy vấn này mất từ ​​500ms đến 1500ms để hoàn tất (Lưu ý rằng đây là thời gian cần thiết để thực hiện truy vấn, được hiển thị trực tiếp từ bảng điều khiển của ravendb. Vì vậy, nó không chứa thời gian yêu cầu http và phí trên deserialization. thời gian).

session.Query<Order>("OrdersIndex").Where(o => 
    o.Items.Any(oi => oi.Price.Amount > 0 && oi.Quantity < 100)).Take(128).ToList(); 

Tôi đang chạy truy vấn trên CPU lõi tứ i5 chạy ở tốc độ 4,2 GHz và db nằm trên SSD.

Bây giờ, khi tôi điền cùng một lượng dữ liệu trên máy chủ tốc độ sql, với cùng một lược đồ và cùng một lượng đối tượng liên kết. không có chỉ mục, máy chủ sql thực hiện cùng một truy vấn bao gồm các tham gia trong 35ms. Với chỉ số cần 0ms: |.

Tất cả các thử nghiệm được thực hiện khi máy chủ db được khởi động.

Mặc dù, tôi vẫn rất hài lòng về hiệu suất của RavenDB, tôi tò mò nếu thiếu một thứ gì đó hoặc RavenDB chậm hơn một cơ sở dữ liệu quan hệ? Xin lỗi vì tiếng anh nghèo của tôi.

Cảm ơn

CẬP NHẬT

Ayande, tôi đã cố gắng những gì bạn đề nghị, nhưng khi tôi cố gắng để xác định chỉ số bạn đã gửi cho tôi, tôi nhận được lỗi sau:

public Index_OrdersIndex() 
    { 
     this.ViewText = @"from doc in docs.Orders 
select new { Items_Price_Amount = doc.Items(s=>s.Price.Amount), Items_Quantity = doc.Items(s=>s.Quantity), Date = doc.Date } 
"; 
     this.ForEntityNames.Add("Orders"); 
     this.AddMapDefinition(docs => from doc in docs 
      where doc["@metadata"]["Raven-Entity-Name"] == "Orders" 
      select new { Items_Price_Amount = doc.Items(s => s.Price.Amount), Items_Quantity = doc.Items.(s => s.Quantity), Date = doc.Date, __document_id = doc.__document_id }); 
     this.AddField("Items_Price_Amount"); 
     this.AddField("Items_Quantity"); 
     this.AddField("Date"); 
     this.AddField("__document_id"); 
     this.AddQueryParameterForMap("Date"); 
     this.AddQueryParameterForMap("__document_id"); 
     this.AddQueryParameterForReduce("Date"); 
     this.AddQueryParameterForReduce("__document_id"); 
    } 
} 

lỗi CS1977: Không thể sử dụng biểu thức lambda làm đối số cho thao tác được gửi động mà không cần phải đưa nó vào một loại cây đại diện hoặc biểu thức

+0

Ngạc nhiên khi thấy hiệu suất kém của Raven DB. Điều này sẽ cho thấy có một vấn đề nghiêm trọng với cấu trúc dữ liệu cơ bản hoặc định nghĩa chỉ mục. –

+1

Davita, điều này không có vẻ gì cả. Các truy vấn như vậy sẽ mất tối đa 50 ms hoặc lâu hơn. –

+1

Bạn có thể tạo một trường hợp thử nghiệm có thể tái tạo và gửi nó vào danh sách gửi thư không? Chúng tôi đánh giá perf rất cao và xử lý các tình huống như lỗi. Đối với những gì nó có giá trị, kịch bản của bạn là tốt trong các thông số hoạt động của chúng tôi, và những con số bạn trích dẫn là xa bên ngoài những gì chúng tôi có kinh nghiệm, do đó, một cái gì đó là sai ở đây. Một trường hợp thử nghiệm sẽ rất hữu ích để tìm ra những gì đang xảy ra –

Trả lời

6

Davita, Chỉ số sau đây tạo ra ~ 8 triệu index mục:

from doc in docs.Orders 
from docItemsItem in ((IEnumerable<dynamic>)doc.Items).DefaultIfEmpty() 
select new { Items_Price_Amount = docItemsItem.Price.Amount, Items_Quantity = docItemsItem.Quantity, Date = doc.Date } 

Cái này tạo ra ít:

from doc in docs.Orders 
select new { Items_Price_Amount = doc.Items(s=>s.Price.Amount), Items_Quantity = doc.Items.(s=>s.Quantity), Date = doc.Date } 

Và có thể được truy vấn với kết quả tương tự, nhưng các bài kiểm tra của chúng tôi cho thấy lên nhanh gấp đôi.

Vấn đề chính là bạn đang thực hiện một số truy vấn phạm vi, rất tốn kém với một số lượng lớn giá trị tiềm năng và sau đó bạn có một số lượng lớn đối sánh thực tế cho truy vấn.

Thực hiện đối sánh chính xác nhanh hơn đáng kể, nhân tiện.

Chúng tôi vẫn đang nỗ lực để cố gắng tăng tốc mọi thứ.

+0

Cảm ơn Ayende, tôi sẽ kiểm tra các giải pháp trong một vài giờ và cho bạn biết kết quả, tuy nhiên, sẽ rất tuyệt nếu chúng tôi có thể tăng tốc độ tìm kiếm được lập chỉ mục, 8 triệu mục là rất nhiều cho việc làm chậm DBMS mà tôi nghĩ.) – Davita

+0

Vấn đề không phải với số mục nhập, nó là với loại truy vấn. Chúng tôi phải giữ rất nhiều dữ liệu trong bộ nhớ cho điều này, và nó là tốn kém. –

+0

Hãy thử điều này với một kết hợp chính xác, hoặc chỉ là một truy vấn phạm vi duy nhất, và bạn sẽ thấy một sự khác biệt lớn. –

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