Warum ist SQL Server 2012 für diese Abfrage schneller als MongoDB? [geschlossen]

7

Ich mache einige Leistungstests zwischen SQL Server 2012 und MongoDB 2.4.9. Ich habe ein wenig online recherchiert und viele Vergleiche gefunden, die nur die Performance zwischen diesen beiden Datenbanken vergleichen. Ich bin nur an select Leistung ohne Indizes interessiert. Ich habe einen sehr einfachen Test eingerichtet. Hier sind die Spezifikationen

SQL Server-Setup

  • Setup SQL Server mit nur einem ganzzahligen Feld.
  • Fügen Sie 1 Million zufällige Ganzzahlen ein

MongoDB-Konfiguration

  • Hat zwei Felder _id und id1
  • Fügen Sie 1 Million zufällige Ganzzahlen in das ID1-Feld
  • ein

Wenn ich die Zahlen eingegeben habe, sind es genau dieselben Zahlen, die in beide Datenbanken gehen. Die Zufallszahlen liegen zwischen 1 und 1000.

SQL Server-Abfrage

%Vor%

MongoDB-Abfrage

%Vor%

Ergebnisse:

  • SQL Server: 192 ms
  • MongoDB: 1109 ms

Für mein Schema brauche ich keine Joins und habe nur denormalisierte Daten - deshalb habe ich MongoDB berücksichtigt. Ich habe erwartet, dass mongoDB nach dem online Lesen der Benchmarks um ein Vielfaches schneller ist als SQL Server. Kann ich etwas falsch machen? Auch hier wollte ich ohne Indizes testen.

    
Luke101 23.03.2014, 16:38
quelle

1 Antwort

7

MongoDB ist in diesem Fall wahrscheinlich fünfmal langsamer, weil es fünfmal mehr Daten lesen und ausgeben muss.

Eine Zeile in Ihrer SQL-Tabelle ist nur 4 Byte. Aber in MongoDB ist es eine 4-Byte-Ganzzahl plus eine 12-Byte-Objekt-ID. Außerdem sind die Feldnamen Teil jedes einzelnen Dokuments. Die Zeichenfolgen _id und id1 sind Teil jedes Dokuments, das Sie abrufen, daher werden einige zusätzliche Bytes hinzugefügt.

Und das ist nur die eigentliche Nutzlast. Wenn Sie sich BSONSpec.org ansehen, können Sie sehen, dass Ihr Dokument folgendermaßen dargestellt wird:

  • 4 Byte für eine 32-Bit-Ganzzahl, die die Gesamtlänge des Dokuments angibt
  • 1 Byte 0x01 für "Jetzt kommt eine ObjectId"
  • 4 Bytes für die nullterminierte Zeichenkette _id
  • 12 Bytes für die ObjectId
  • 1 Byte 0x10 für "jetzt kommt eine 32bit Ganzzahl" (kleinste Ganzzahl gibt es)
  • 4 Bytes für die nullterminierte Zeichenkette id1
  • 4 Bytes für die 32-Bit-Ganzzahl
  • 1 nachstehendes 0x00 , das das Ende des Dokuments markiert

was insgesamt 31 Byte ist.

    
Philipp 23.03.2014, 18:26
quelle