2012-01-14 12 views
8

今後のプロジェクトでRavenDBをテストしています。 SQL Serverのパフォーマンス範囲内にあるようにRavenDBを調整できるようにするためにデータベースのパフォーマンスが必要ですが、テストではSQL Serverよりも選択クエリでraven dbの方が約10倍〜20倍遅くなっていますRavenDBがインデックスされ、SQL Serverにインデックスがない場合RavenDBの選択パフォーマンスが悪い

150,000個のドキュメントを含むデータベースが作成されました。各ドキュメントには、子要素の集合があります。 Dbサイズは約です。 1GBと同様にインデックスサイズです。

{ 
    "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; } 
} 

ここで定義されたインデックスです:レイヴン/ ESENT/CacheSizeMaxはここで文書がどのように見えるかだ2048年に設定されており、レイヴン/ ESENT/MaxVerPagesが128 に設定されている

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 } 

は私が定義されましたコードはBTWからではなく、管理スタジオを使用してインデックスを作成します(パーフォロマンスに否定的/肯定的な効果があるかどうかはわかりません)。

このクエリには500ms〜1500msの時間がかかります(これは、ravendbのコンソールから直接表示されるクエリを実行するために必要な時間であるため、http要求時間とデシリアライゼーションオーバーヘッドは含まれていません。時間)。

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

4.2GHzで動作するクアッドコアi5 cpuでクエリを実行していますが、dbはSSDにあります。

SQL Server Expressの同じ量のデータを同じスキーマおよび関連するオブジェクトの同じ量で移入しました。インデックスなしでは、SQL Serverは35ミリ秒での結合を含む同じクエリを実行します。インデックスでは、0ms:|が必要です。

すべてのテストは、dbサーバーのウォームアップ時に実行されました。

私はまだRavenDBのパフォーマンスに満足していますが、何か不足している、またはRavenDBがリレーショナルデータベースよりも遅いのが不思議です。 私の貧しい私の英語のために申し訳ありません。

おかげ

UPDATE

Ayandeは、私はあなたが提案し何をしようとしたが、私はあなたが私を送ったインデックスを定義しようとすると、私は次のエラーを取得:

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"); 
    } 
} 

エラーをCS1977:ラムダ式を、デリゲートまたは式ツリータイプにキャストすることなく、動的にディスパッチされた操作の引数として使用することはできません。

+0

Raven DBのパフォーマンスが低いことに驚いています。これは、基礎となるデータ構造または索引定義に深刻な問題があることを示します。 –

+1

Davita、これはまったくそう思わない。そのようなクエリは最大50 ms程度かかるはずです。 –

+1

再現可能なテストケースを作成してメーリングリストに送信できますか? perfを非常に高く評価し、そのようなシナリオをバグとして扱います。それが価値あるものであれば、あなたのシナリオは私たちの運転パラメータの範囲内にあり、引用した数字は私たちが経験した数をはるかに超えているので、ここで何か間違っています。テストケースは何が起こっているのか把握するのに非常に役立つでしょう。 –

答えて

6

ダヴィータ・ヘルスケア・パートナーズ、 次のインデックスが生成〜800万のインデックスエントリ:

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 } 

この1が生成するはるかに少ない:

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 } 

と同じ結果を照会することができますが、我々のテストでは、現れました約2倍の速さになる。

大きな問題は、多数の潜在的な値を持つ高価な複数の範囲問合せを作成していて、その問合せに対して多数の実際の一致があることです。

完全一致を実行するのはかなり速いです。

私たちはまだ物事をスピードアップする方法に取り組んでいます。

+0

Ayendeありがとうございます。しかし、インデックス付きルックアップを高速化することができれば素晴らしいと思いますが、8百万のエントリは、私が思っているDBMSの速度を落とすためのものであり、偉大な作業とサポートに感謝します。 ) – Davita

+0

問題は、エントリの数ではなく、クエリの種類にあります。このためには多くのデータをメモリに保存しなければならず、高価です。 –

+0

完全一致または単一の範囲クエリでこれを試してください。大きな違いがあります。 –

関連する問題