2017-10-25 5 views
1

Repo.preload에 의해 수행 된 쿼리에서 왜 order by 절이 있는지 알고 싶습니다. 실행order by Repo.preload

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

이것은 쿼리가 많은 레코드를 반환하기 때문에 Repo.preload이 아니기 때문이 아닙니다.

ORDER BY 절은 대량의 레코드를 가져 오기 전에 국가를 (DB 엔진 내부에서) 효과적으로 그룹화하기 위해 added by Ecto입니다.

내가 제공 한 링크는 일반적인 Ecto 접근 방식을 보여줍니다. 쿼리가 많은 레코드를 반환하는 즉시 키를 기준으로 정렬합니다.

+0

는 정말 실행 시간에 도움이됩니까? 어쩌면 당신은 행이 많을 때 DB 엔진에 더 좋을 것입니다. 사실입니까? 조건부로 행을 검색 할 때 프로세스의 해당 부분에 익숙하지 않습니다. 그래서, 올바르게 이해한다면, 필터링하는 필드에 의해 행을 먼저 정렬 한 다음 행을 검색하는 것이 좋습니다. –

+0

그것은 크게 기본 DB 엔진에 따라 다르지만 아무런 해를 끼치 지 않습니다. 아마도 이것이 Ecto 제작자가 모든 것을 위해이 '주문'을 하드 코딩하기로 결정한 이유 일 것입니다. – mudasobwa

1

쿼리 조각을 만들 때 미리로드 된 SQL 절 함수를 사용할 수도 있습니다. 예를 들어 :

alias App.Repo 

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

그것은 docs 공식 공부하기 정말 좋은)