Ich würde gerne in den von a Repo.preload
, warum gibt es eine order by
Klausel.
App.Repo.get(Sopitas.Continent, 1) |> App.Repo.preload(:countries)
Die ausgeführten Abfragen sind:
[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 möchte verstehen, dass dieser Teil so weit ist, wie ich das verstehe order by
Klausel fügt der Ausführung der Abfrage Verarbeitungszeit hinzu. Ich würde es vorziehen, das zu vermeiden order by
.
Antworten:
1 für die Antwort № 1Das liegt nicht an Repo.preload
, das ist weil das so ist preload
Abfrage gibt viele Datensätze zurück.
ORDER BY
Klausel ist hinzugefügt von Ecto
, um Länder (innerhalb der DB-Engine) effektiv zu gruppieren, bevor ein Großteil der Datensätze erzielt wird.
Der von mir bereitgestellte Link zeigt ein generisches Ecto
Ansatz: Sobald die Abfrage viele Datensätze zurückgeben soll, müssen diese nach dem Schlüssel sortiert werden.
1 für die Antwort № 2
Wenn Sie Ihre Abfragefragmente erstellen, können Sie SQL-Klauselfunktionen auch 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, offiziell zu studieren Dokumente ;)