2014-09-01 5 views
18

Ich machte ein Benchmarking, also hatte ich eine SQL-Datenbank mit 2500 Datensätzen. Ich habe diese Datensätze in DocumentDB eingefügt.Ist DocumentDB langsamer als SQL, wenn viele Datensätze abgerufen werden?

Ich schrieb zwei Zeilen Code, einen mit Entity-Framework, um alle 2500 in ein Array in C# zu ziehen. Die nächste Zeile, um alle 2500 in ein Array von DocuementDB zu ziehen.

-Code verwendet:

var test= await Task<Test>.Run(() => 
       client.CreateDocumentQuery<Test>(collection.DocumentsLink) 
       .ToList()); 

Das DocumentDB Beispiel dauerte mehr als 20 Sekunden. Die SQL Server-Zeile war fast sofort verfügbar. Die Objekte sind einfache DTO mit 5 Eigenschaften, und ich habe die SQL-Abfrage über das Internet gemacht.

Verwende ich DocumentDB? Ich dachte, es wurde gemacht, um alle deine Aufzeichnungen in den Speicher zu ziehen und dann mit linq zu verbinden.

+0

Probieren Sie die gleiche Sache w/Azure Table Storage - Fast sofortige Ergebnisse. – bladefist

+2

Finden Sie heraus, wo die Zeit verbracht wird. Profiliere den Prozess. Könnte Netzwerk Roundtrips sein. Verwenden Sie Fiddler, um zu sehen, wie viele Anfragen ausgegeben werden. – usr

+1

Beachten Sie, dass es nicht wirklich anwendbar ist, ein RDBMS mit nichtrelationalen zu vergleichen. Sie dienen zum Speichern verschiedener Arten von Datenmodellen. Wenn Sie einen genaueren Vergleich wünschen, benötigen Sie ein Rich-Objekt-Diagramm, für das Sie EntityFramework verwenden, und ein einzelnes .NET-Objekt benötigt 3-10 Tabellen zum Speichern (mehrere Joins, Subselects usw.). Sie möchten das gesamte Objekt mit EF geladen werden. Diese genau gleichen Objekte können direkt in DocumentDB gespeichert werden. Dann möchten Sie die Leistung von 'Foos.ToList()' –

Antwort

15

@bladefist, Sie sollten in der Lage sein, mit DocumentDB eine viel bessere Leistung zu erreichen. Sehen Sie sich beispielsweise diesen Code-Stub an und geben Sie ihn sowohl in Westeuropa als auch in einem Azure-VM- und DocumentDB-Konto aus.

Stopwatch watch = new Stopwatch(); 
for (int i = 0; i < 10; i++) 
{ 
    watch.Start(); 
    int numDocumentsRead = 0; 
    foreach (Document d in client.CreateDocumentQuery(collection.SelfLink, 
     new FeedOptions { MaxItemCount = 1000 })) 
    { 
     numDocumentsRead++; 
    } 

    Console.WriteLine("Run {0} - read {1} documents in {2} ms", i, numDocumentsRead, 
     watch.Elapsed.TotalMilliseconds); 
    watch.Reset(); 
} 

//Output 
Run 0 - read 2500 documents in 426.1359 ms 
Run 1 - read 2500 documents in 286.506 ms 
Run 2 - read 2500 documents in 227.4451 ms 
Run 3 - read 2500 documents in 270.4497 ms 
Run 4 - read 2500 documents in 275.7205 ms 
Run 5 - read 2500 documents in 281.571 ms 
Run 6 - read 2500 documents in 268.9624 ms 
Run 7 - read 2500 documents in 275.1513 ms 
Run 8 - read 2500 documents in 301.0263 ms 
Run 9 - read 2500 documents in 288.1455 ms 

Einige Best Practices für die Leistung folgen:

  • Verwenden direkte Verbindung und TCP-Protokoll
  • Verwenden Sie eine große Seitengröße (max: 1000), wenn Sie in großen Chargen gerade lesen zu minimieren die Anzahl der Roundtrips
  • Um die Latenz zu reduzieren, führen Sie Ihren Client in derselben Region wie Ihr DocumentDB-Konto
  • Der bereitgestellte Durchsatz (und Speicher) der Kapazität, die Ihr Einkauf ist auf die Kollektionen verteilt. Wenn Sie also den Durchsatz messen möchten, sollten Sie sicherstellen, dass Ihre App die Arbeitslast auf alle Sammlungen verteilt. Wenn Sie beispielsweise 1 CU gekauft haben, können Sie den gesamten Durchsatz auf eine einzelne Sammlung oder auf drei Sammlungen verteilen.
+4

Danke vergleichen. Ich habe Ihren Code von zu Hause aus laufen lassen und bekam Antwortzeiten von ~ 15 Sekunden. Der Code wurde in eine Azure-VM kopiert, befindet sich jedoch nicht im selben Rechenzentrum wie der Dienst DocumentDB. Das lief bei ca. ~ 5 Sekunden ab. Das ist ziemlich bezeichnend, Sie müssen im Grunde alles im selben Rechenzentrum ablegen. Ich verstehe das aber immer noch nicht, da Azure Table Storage von zu Hause aus blitzschnell ist. – bladefist

+0

@bladefist Azure Tabellenspeicher und Azure SQL-Dienste sind allgemein verfügbar, so dass sie (Microsoft) bereits für die Verwendung in allen Rechenzentren optimiert sind, aber DocumentDB ist in der Vorschau, so dass es noch nicht optimiert ist –

+1

Ich habe genau dieses Problem, nur diese Vorschläge beheben es nicht. Ich lade 5500 Dokumente und es dauert ungefähr 30 Sekunden. Genau wie in der ursprünglichen Frage ist das Laden von Daten aus Sql Azure oder Table Storage blitzschnell. – BowserKingKoopa

Verwandte Themen