私はによって行われたクエリで理解したいのですが 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>)])
役人を勉強するのは本当に良いことです ドキュメント ;)