2012-03-06 6 views
5

私はDBバックエンドとMSSQLのEntity Frameworkを比較するテストを行っています。RavenDbのパフォーマンスに問題がありますか?

スタートアップ時にRavenDBにドキュメントがあるかどうかをチェックして確認します。そうでない場合、Entity Frameworkを介してSQLデータベースにクエリを実行して、すべてのオブジェクト(約31,000アイテム)を取得します。それをRavenDBに挿入します。この部分は期待どおりに機能しています。

次にテストを実行します。私はEFに対して一連のレコードを照会し、それらをJSONに変換し、同じレコードセットを取得するRavenと同じ処理を繰り返します。私は読書のために最適化されているのでRavenが高速になると予想し、EFはデータを取得するために2つのテーブルに加わる必要があります。しかし、そうではありません。ここで

はテストから出力されます。ここでは

Entity Framework with MS SQL RavenDB Percent Difference Raven to EF 
796.8954 ms (862 records) 1703.1686 ms (862 records) 213.725490196078 
296.8826 ms (862 records) 796.8954 ms (862 records) 268.421052631579 
281.2572 ms (862 records) 781.27 ms (862 records) 277.777777777778 
281.2572 ms (862 records) 796.8954 ms (862 records) 283.333333333333 
296.8826 ms (862 records) 765.6446 ms (862 records) 257.894736842105 
312.508 ms (862 records) 765.6446 ms (862 records) 245 
296.8826 ms (862 records) 750.0192 ms (862 records) 252.631578947368 
296.8826 ms (862 records) 750.0192 ms (862 records) 252.631578947368 
359.3842 ms (862 records) 765.6446 ms (862 records) 213.04347826087 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
281.2572 ms (862 records) 796.8954 ms (862 records) 283.333333333333 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
281.2572 ms (862 records) 812.5208 ms (862 records) 288.888888888889 
265.6318 ms (862 records) 781.27 ms (862 records) 294.117647058824 
296.8826 ms (862 records) 796.8954 ms (862 records) 268.421052631579 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
281.2572 ms (862 records) 828.1462 ms (862 records) 294.444444444444 
281.2572 ms (862 records) 781.27 ms (862 records) 277.777777777778 
328.1334 ms (862 records) 750.0192 ms (862 records) 228.571428571429 
296.8826 ms (862 records) 750.0192 ms (862 records) 252.631578947368 
312.508 ms (862 records) 781.27 ms (862 records) 250 
296.8826 ms (862 records) 796.8954 ms (862 records) 268.421052631579 
281.2572 ms (862 records) 765.6446 ms (862 records) 272.222222222222 
312.508 ms (862 records) 781.27 ms (862 records) 250 
281.2572 ms (862 records) 734.3938 ms (862 records) 261.111111111111 

は、テストを実行するために使用するコードです:

protected void Page_Load(object sender, EventArgs e) 
     { 

      int totalTests = 25; 


      DataTable dt = new DataTable(); 
      dt.Columns.Add("Entity Framework with MS SQL"); 
      dt.Columns.Add("RavenDB"); 
      dt.Columns.Add("Percent Difference Raven to EF"); 

      for (int i = 1; i <= totalTests; i++) 
      { 

       string efMilliseconds = string.Empty; 
       string ravenMilliseconds = string.Empty; 

       double efMS = 0; 
       double ravenMS = 0; 

       // EF 
       using (tamcEntitiesForRavenTest myObjectContext = new tamcEntitiesForRavenTest()) 
       { 
        DateTime startTime = DateTime.Now; 
        List<Treatment> efTreatments = myObjectContext.Treatments.Include("Segments").Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).ToList(); 
        string json = JsonConvert.SerializeObject(efTreatments); 
        TimeSpan TotalTime = DateTime.Now - startTime; 
        efMS = TotalTime.TotalMilliseconds; 
        efMilliseconds = string.Format("{0} ms ({1} records)", efMS.ToString(), efTreatments.Count); 
       } 

       // Raven 
       using (var session = DataDocumentStore.Instance.OpenSession()) 
       { 
        DateTime startTime = DateTime.Now; 
        List<RavenTreatment> ravenTreatments = session.Query<RavenTreatment>().Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).Take(1000).ToList(); 
        string json = JsonConvert.SerializeObject(ravenTreatments); 
        TimeSpan TotalTime = DateTime.Now - startTime; 
        ravenMS = TotalTime.TotalMilliseconds; 
        ravenMilliseconds = string.Format("{0} ms ({1} records)", ravenMS.ToString(), ravenTreatments.Count); 
       } 

       DataRow dr = dt.NewRow(); 
       dr[0] = efMilliseconds; 
       dr[1] = ravenMilliseconds; 
       double percentDifference = (ravenMS * 100)/efMS; 
       dr[2] = percentDifference; 

       dt.Rows.Add(dr); 
      } 

      GridView1.DataSource = dt; 
      GridView1.DataBind(); 
     } 

私はRavenDBインスタンスがSQLサーバーと同じマシン上で実行しています。

これは予想されるパフォーマンス結果ですか?それとも私が間違っていることがありますか?

+0

Where()、OrderBy()、Take()IQueryableはありますか? Ravenでフィルタリングを実行させるのですか、またはすべての行を戻してメモリ内のフィルタを実行していますか? –

+0

私はRavenが私の場所と注文をサーバーに適用してサーバーに乗るという印象を受けました。これが実行されると、whereおよびorder by句の一時インデックスを作成するかどうかがわかります。そのため、サーバー上で実行されているようです。 –

+2

あなたがそれらを使用することがわかっている場合、ああ、それらのインデックスを明示してください。そうすれば、それらを作成することでパフォーマンスが低下することはありません。 (パフォーマンスの変数を削除します) – Rangoric

答えて

7

Amanda、SQL Serverよりも高速なRavenDB自体ではないことを理解する必要があります。 MSSQLは長年にわたり使用されていますが、これは非常にマイクロ最適化されており、上記のようなバルク選択シナリオで可能な最良の結果を得ることができます。これは、RavenDBがMSSQLのような製品を打ち負かすチャンスを持つ場所ではありません。

しかし、それはデータベース自体ではありませんが、ほとんどの場合、それはカモメが有名な雷の性能をもたらすアプリケーションとデータアクセス戦略です。

すべてのことは、ドキュメントデータベースがデータ(骨組みの根、非正規化された参照、事前計算済みのインデックスなど)をどのように構造化できるかについてです。これはRavenDB特有のものではありません.MongoDBやCouchDBでもそうすることができます。おそらく、これらのデータベースの中で最も本質的な違いは、かかしはあなたにとても素敵で簡単な.NET体験を提供し、 -boxマルチドキュメントトランザクション。他にもたくさんのsweetspotがありますが、それらは一般的に、異なるデータベースの間で決めるものです。

+0

@amanda RavenDBは "ドキュメントデータベース"です。私はそれが完璧に機能すると思います。 RavenDBを単なる文書の使用以上に使用する場合、私はSQLと同じように、最高のパフォーマンスを得るためにDBを設計してみることになります。それにもかかわらず、私はそれが意図されていなかったためにDBを使用することはありません、それが使用することがどのようにエキサイティングである! –

関連する問題