/ Repo.preload内の/ order by - elixir、ecto

Repo.preloadでの順に並べ替え - elixir、ecto

私はによって行われたクエリで理解したいのですが 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 アプローチ:クエリが多くのレコードを返すようになるとすぐに、キーでそれらをソートすることです。


回答№2の場合は1

あなたがあなたのクエリフラグメントを構築しているとき、あなたは同様にpreloadでSQL節関数を使うかもしれません。例えば:

alias App.Repo

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

役人を勉強するのは本当に良いことです ドキュメント ;)