2017-02-10 2 views
0

Ich bin kaum zu überprüfen, die Ausführungsgeschwindigkeit von zwei Abfragen, zu erklären, analysieren und benchmarken, weil ich Timeout für eine Abfrage bekam, aber ich bin nicht sicher, dass diese Abfrage dies verursacht.ActiveRecord Zählungsanalyse in Schienen Abfrage

queue_count = purchase.purchase_items.where("queue_id = ?", queue.id).count 

gleiche SQL-Abfrage

SELECT COUNT(*) FROM "purchase_items" WHERE "purchase_items"."purchase_id" = 1241422 AND (queue_id = 3479783) 

so muss ich die Zählung entfernen dann bekam ich eine Lösung, die alle Rekord in Reihe zu nehmen und die Zählung tun dann bekam ich die Abfrage wie diese

queue_count = purchase.purchase_items.where("queue_id = ?", queue.id).all.count 

gleiche sQL-Abfrage

SELECT "purchase_items".* FROM "purchase_items" WHERE "purchase_items"."purchase_id" = 1241422 AND (queue_id = 3479783) 

habe endlich eine kleine Variation bekommen, als ich mit query analyze und auch mit Benchmark gesucht habe, also war das der richtige Weg? oder mache ich etwas falsch?

Antwort

1

In Bezug auf die Leistung wird zweite Abfrage ziemlich schrecklich sein. Es lädt alle Datensätze im Speicher und zählt sie mit Ruby. Die Datenbank wurde entwickelt, um solche Dinge schnell zu erledigen.

Um die Abfrage zu analysieren, können Sie EXPLAIN ANALYZE in Psql-Konsole tun. Mein Long Shot ist, dass Sie einige Indizes (auf Kauf_ID und Queue_id) vermissen. Sie können in diese aussehen, indem Sie:

EXPLAIN ANALYZE SELECT COUNT(*) FROM purchase_items WHERE purchase_id = 1241422 AND (queue_id = 3479783) 

Wenn Sie sehen, dass PostgreSQL gesamte Tabelle scannt, dann die Leistung nicht optimal sein wird. Versuchen Sie, Indizes hinzuzufügen:

und die Leistung unter Verwendung EXPLAIN ANALYZE dann überprüfen. Aber nie laden Sie alle Datensätze in Ruby, um einfach .count auf sie zu tun.

+0

Ich habe bereits diesen Index, aber eine weitere Sache, wenn ich analysiere EXPLAIN ANALYZE SELECT COUNT (*) VON Kauf_Elemente WHERE Purchase_ID = 1241422 UND (queue_id = 3479783) diese Abfrage im ersten Treffer zeigt dies Ausführungszeit: 1,088 ms, Sekunde hit this zeigt 0.148 ms an, gibt es irgendeine Logik, die noch einmal überprüft werden muss oder die Ausführungszeit des ersten Treffers korrekt ist? – django

+1

Sie müssen es einige Male ausführen und berechnen f.e. Durchschnitt - ein Versuch reicht nicht aus, um korrekte Daten zu erhalten. Und wenn es 1 ms oder 0,1 ms ist, dann ist es wirklich schnell und definitiv kein Flaschenhals – Esse

Verwandte Themen