2012-04-14 9 views
0

Zwei scheinbar identische Abfragen (soweit ein Neuling wie ich kann sagen, aber die erste ist insgesamt schneller in der partiellen Vorlage Renderzeit (nichts anderes als die IDs-Anweisung geändert). Auch beim Testen durch Rails-Konsole wird letzteres sichtbar eine Abfrage ausführen, die ehemalige nicht.Ich verstehe nicht warum - und warum die erste Aussage ist ein paar ms schneller als die zweite - obwohl ich erraten kann, ist es aufgrund der kürzeren Methode Verkettung, um das gleiche Ergebnis zu erhalten.Zwei (scheinbar) identische Abfragen, eine ist schneller, warum?

UPDATE: Meine schlechte.Sie führen nicht die gleiche Abfrage, aber es ist immer noch interessant, wie eine Auswahl in allen Spalten schneller ist als eine Auswahl in einer Spalte.Vielleicht ist es ein vernachlässigbarer Unterschied im Vergleich zu der Methode Verkettung.

ids = current_user.activities.map(&:person_id).reverse 
SELECT "activities".* FROM "activities" WHERE "activities"."user_id" = 1 
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (7.4ms) 


ids = current_user.activities.order('id DESC').select{person_id}.map(&:person_id) 
SELECT "activities"."person_id" FROM "activities" WHERE "activities"."user_id" = 1 ORDER BY id DESC  
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (10.3ms) 

Der Zweck der Anweisung besteht darin, den Fremdschlüsselverweis auf Personen in der Reihenfolge abzurufen, in der sie in der Aktivitätstabelle (auf seiner PK) auftauchten. Hinweis: Ich verwende Squeel für SQL.

+1

Was soll 'select {person_id}' tun? –

+1

Ich weiß nicht, die Antwort sicher, weshalb ich nur einen Kommentar hinterlassen, aber meine Vermutung ist, dass Arel ist nur schneller kompilieren der erste. Sie können es vielleicht sogar noch schneller mit etwas wie 'ids = current_user.activities.reverse_order.pluck (: person_id)' – x1a4

+0

'select {person_id}' erreichen, verfeinert nur das Ergebnis und ignoriert alle anderen Spalten mit 'person_id'. – Jonathan

Antwort

1

In der ersten Abfrage haben Sie .map und .reverse angekettet, während Sie in der zweiten Abfrage .order ('id DESC') .select (person_id) verwendet haben, die beim Hinzufügen unnötig waren. umgekehrt

+0

Guter Punkt, ich hatte tatsächlich von der Bestellung auf 'created_at' geändert, da sie im Wesentlichen dasselbe in diesem Szenario taten, und vergaß, dass Reverse das sowieso macht. Guter Punkt – Jonathan

+0

Ich optimierte die Abfrage zu 'ids = current_user.activities.select (: person_id) .map (&: person_id) .reverse', danke für das Hinzeigen – Jonathan

Verwandte Themen