Бих искал да разбера в заявките, направени от 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>)])
Наистина е добре да се изучава официално документи )