今後のプロジェクトで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:ラムダ式を、デリゲートまたは式ツリータイプにキャストすることなく、動的にディスパッチされた操作の引数として使用することはできません。
Raven DBのパフォーマンスが低いことに驚いています。これは、基礎となるデータ構造または索引定義に深刻な問題があることを示します。 –
Davita、これはまったくそう思わない。そのようなクエリは最大50 ms程度かかるはずです。 –
再現可能なテストケースを作成してメーリングリストに送信できますか? perfを非常に高く評価し、そのようなシナリオをバグとして扱います。それが価値あるものであれば、あなたのシナリオは私たちの運転パラメータの範囲内にあり、引用した数字は私たちが経験した数をはるかに超えているので、ここで何か間違っています。テストケースは何が起こっているのか把握するのに非常に役立つでしょう。 –