2016-03-24 13 views
2

Ich versuche, die Ausführungszeit für eine Aggregation query.Query zu finden, ist unten wie:MongoDB Ausführungszeit von Aggregate Abfrage

db.table.aggregate([{$sort: {count:-1}}]); 

es die 100K Dokumente sortiert nach desc.The Kommandozeile zählen nicht zeigen alle Aufzeichnungen so habe ich die folgende Stelle:

db.table.aggregate([{$sort: {count:-1}}]).toArray(); 

I db.setProfilingLevel (2) getan haben;

als ich die erste Abfrage ausführen und zu tun:

db.system.profile.find((),{millis:1}); 
I get millis : 18 

wenn ich zweite Abfrage ausführen und finde Zeit vom Profil

I get millis:18 , millis:87 , millis: 81 ... millis:75, millis:35. I get 12 different execution times. 

ich, wenn ich die Ausführungszeit richtig messen will wissen wollte Aggregation, bei der ich die gesamte Kollektion durch count desc bestelle. Was ist der richtige Weg? Ist die Abfrage mit .toArray() die richtige Abfrage zum Messen der Ausführung. Kannst du mir bitte helfen, wie ich die Ausführungszeit messen soll?

+0

Ich würde '.toArray()' nicht verwenden, da das bedeutet, dass es tatsächlich alles aus der Datenbank "holt". Es wirkt sich nicht wirklich darauf aus, was in 'system.profile' geht, aber die" fetch "-Zeit ist nicht die" Ausführungszeit ", die der Profiler aufzeichnet. Verwenden Sie '.toArray()' nur dann, wenn Sie vom Senden bis zum Abrufen der Ergebnisse tatsächlich nach einer Gesamtzeit suchen. Und natürlich wäre der einzige gültige Zeitpunkt, einen Timer vor der Ausführung zu starten und die Differenz danach zu messen. Es ist alles ein bisschen "iffy" sowieso. Ihre Abfrage und Ihr Aggregat sind auch hier "Äpfel" und "Orangen". –

+0

Können Sie erklären, was meinst du mit Abfrage und Aggregat sind Äpfel und Orangen. Zweitens, wenn ich nur die Zeit für die Ausführung messen soll, indem ich einen Timer vor und nach der Ausführung starte, wie soll ich das machen? –

Antwort

0

Versuchen Sie, Ihre Abfrageprotokollstufe auf 1 zu ändern. Dadurch wird viel Unordnung reduziert. Führen Sie nun Ihre Aggregationsabfrage aus und suchen Sie in der Protokolldatei nach protocol:op_command xxxms für Ihre Abfrage.

in meinem Fall, ich bin Ausführung

var cursor = db.doc.aggregate([{$sort:{_id:-1}},{$group:{_id:null, count:{$sum:1}}}]); 

Diese Abfrage Cursor zurückgibt und es ist Protokolleintrag

2016-03-24T00:00:52.590-0400 I COMMAND [conn7] command test.doc command: 
aggregate { aggregate: "doc", pipeline: [ { $sort: { _id: -1.0 } }, 
{ $group: { _id: null, count: { $sum: 1.0 } } } ], cursor: {} } 
keyUpdates:0 writeConflicts:0 numYields:5431 reslen:127 locks:{ 
Global: { acquireCount: { r: 10934 } }, Database: { acquireCount: 
{ r: 5467 } }, Collection: { acquireCount: { r: 5467 } } } protocol:op_command 1497ms 

Bitte sehen am Ende der Abfrageoperation in Protokoll als

erscheint. Dies ist Ihre Ausführungszeit, ohne über den Cursor zu iterieren.

+1

Ich denke nicht erklären gibt die Ausführungszeit –

+1

Nein, es gibt nicht die Ausführungszeit. –

+0

Ich weiß Profiling gibt die Ausführungszeit, aber ich bin mir nicht sicher, ob toArray() die Zeit erhöhen würde oder nicht. Die Ausführungszeit sollte minimal sein, da ich eine ähnliche Abfrage für einen ähnlichen Datensatz und eine ähnliche Struktur auf SQL Server ausführen möchte. Sql gibt mir ungefähr 450 ms. Wenn ich alle Zeiten zusammenfasse, die ich durch die Ausführung von aggregation() .zuArray() erhalte, beträgt die durchschnittliche Zeit ungefähr 750 ms. Es ist normal? –