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.
Was soll 'select {person_id}' tun? –
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
'select {person_id}' erreichen, verfeinert nur das Ergebnis und ignoriert alle anderen Spalten mit 'person_id'. – Jonathan