2017-10-25 3 views
1

Ich würde gerne in den Abfragen von einem Repo.preload, warum gibt es einen order by Klausel.Bestellung von in Repo.vorladungen

App.Repo.get(Sopitas.Continent, 1) |> App.Repo.preload(:countries) 

Die Abfragen ausgeführt werden:

[debug] QUERY OK source="continents" db=0.4ms 
SELECT c0.`id`, c0.`name`, c0.`sm_id`, c0.`inserted_at`, c0.`updated_at` 
    FROM `continents` AS c0 WHERE (c0.`id` = ?) [1] 
[debug] QUERY OK source="countries" db=3.5ms decode=1.1ms 
SELECT c0.`id`, c0.`sm_id`, c0.`name`, c0.`continent_id`, c0.`inserted_at`, c0.`updated_at`, c0.`continent_id` 
    FROM `countries` AS c0 WHERE (c0.`continent_id` = ?) 
    ORDER BY c0.`continent_id` [1] 

ich diesen Teil verstehen wollen, weil soweit ich auf die Ausführung der Abfrage die order by Klausel hinzuzufügen Verarbeitungszeit zu verstehen. Ich würde es vorziehen, die order by zu vermeiden.

Antwort

1

Dies ist nicht wegen Repo.preload, das ist, weil diese preload Abfrage viele Datensätze zurückgibt.

ORDER BY Klausel ist added by Ecto, effektiv Länder (innerhalb der DB-Engine) zu gruppieren, bevor eine Masse von Datensätzen erhalten.

Der Link, den ich zur Verfügung gestellt habe, zeigt einen generischen Ecto Ansatz: sobald die Abfrage viele Datensätze zurückgeben soll, ist es, diese mit dem Schlüssel zu sortieren.

+0

Hat die Ausführungszeit es wirklich helfen? Vielleicht ist es für die DB-Engine besser, wenn Sie viele Zeilen haben, stimmt das? Ich kenne diesen Teil des Prozesses nicht sehr gut, wenn Sie Zeilen mit einer Bedingung abrufen. Also, wenn ich richtig verstanden habe, ist es besser, wenn Sie die Zeilen zuerst nach dem Feld filtern, das Sie filtern, und dann die Zeilen abrufen. –

+0

Es hängt stark von der zugrunde liegenden DB-Engine, aber es bringt definitiv keinen Schaden. Wahrscheinlich deshalb haben Ecto-Autoren beschlossen, diesen 'ORDER BY' für alles zu programmieren. – mudasobwa

1

Wenn Sie Ihre Abfragefragmente erstellen, können Sie auch SQL-Klauselfunktionen mit Preload verwenden. Zum Beispiel:

alias App.Repo 

Sopitas.Continent 
|> Repo.get(1) 
|> Repo.preload([countries: (from c in Country, order_by: c.<your_field_goes_here>)]) 

Es ist wirklich gut zu studieren offiziellen docs;)