/ / поръчка по в Repo.preload - еликсир, ecto

по поръчка в Repo.preload - еликсир, ecto

Бих искал да разбера в заявките, направени от a Repo.preload, защо има order by клауза.

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

Изпълнените заявки са:

[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]

Искам да разбера тази част, защото доколкото разбирам order by клауза добави време за обработка към изпълнението на заявката. Предпочитам да избягвам order by.

Отговори:

1 за отговор № 1

Това не е заради Repo.preload, това е така preload заявката връща много записи.

ORDER BY клауза добавено от Ecto, за ефективно групиране на страни (вътре в DB машината), преди да се получи голяма част от записите.

Предоставената от мен връзка показва родово Ecto подход: веднага щом заявката иска да върне много записи, е да ги подредите с ключа.


1 за отговор № 2

Когато изграждате фрагментите на заявките си, можете да използвате и SQL клауза с презареждане. Например:

alias App.Repo

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

Наистина е добре да се изучава официално документи )