인프런 커뮤니티 질문&답변

홍태경님의 프로필 이미지
홍태경

작성한 질문수

다양한 사례로 익히는 SQL 데이터 분석

일/주/월/분기별 매출액 및 주문건수를 SQL로 구하기

order by 정렬 문의

작성

·

374

0

안녕하세요 강사님

group by + distinct를 비교해보다

이유는 모르겠지만 위에 distinct를 넣은 것은

day 컬럼이 자동으로 정렬이 되었고

아래의 distinct를 넣지 않은 컬럼은 정렬 되지 않았습니다 아래도 역시 distinct 를 넣으니 자동 오름차순이 되었습니다 (count( DISTINCT oi.order_id))

 

혹시 그 이유가 궁금합니다

또, order by 처리 시 쿼리 속도가 느려진다는 말이 있는데 이런식으로 order by 를 넣지 않고 자동 정렬 되는 것이 있다면 쿼리 속도 향상에 도움이 될까요?

 

 

쿼리문


자동 정렬

 

SELECT date_part( 'day', o.order_date) AS DAY

, sum(amount) AS sum_amount

, count(DISTINCT o.order_id) AS daily_ord_cut

FROM orders o

, order_items oi

WHERE 1 = 1

AND o.order_id = oi.order_id

GROUP BY date_part( 'day', o.order_date)

ORDER BY 1

;

정렬 안됨

SELECT date_part( 'day', o.order_date) AS DAY

, sum(amount) AS sum_amount

, count( oi.order_id) AS daily_ord_cut

FROM orders o

, order_items oi

WHERE 1 = 1

AND o.order_id = oi.order_id

GROUP BY date_part( 'day', o.order_date);

 

 

 

 

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

올려주신 자동 정렬 쿼리를 보면 맨 마지막에 order by가 있습니다. 그래서 정렬이 된 것 같습니다.

SELECT date_part( 'day', o.order_date) AS DAY

, sum(amount) AS sum_amount

, count(DISTINCT o.order_id) AS daily_ord_cut

FROM orders o

, order_items oi

WHERE 1 = 1

AND o.order_id = oi.order_id

GROUP BY date_part( 'day', o.order_date)

ORDER BY 1

그런데 질문하신 대로 group by 를 이용할 경우 group by 절 컬럼값으로 자동 정렬이 될 때가 있습니다.

DBMS 초기에는 group by 를 수행하면 내부적으로 정렬을 수행해서 grouping을 적용합니다. 그래서 group by만 해도 별도의 order by 없이 group by 컬럼값으로 자동 정렬이 되었습니다.

그런데 SQL 성능을 향상 시키기 위해서 group by 를 Hash 기반으로 적용을 하게 되면서 내부 자동 정렬을 수행하지 않게 됩니다. 지금은 DBMS 내부적으로 group by를 Hash 기반으로 기본 적용합니다. 하지만 SQL이 Group by 외에도 별도의 정렬이 필요하다고 DBMS가 판단할 경우는 group by를 Hash가 아닌 자동 정렬 방식을 적용할 수 있습니다.

때문에 SQL의 유형에 따라 order by 를 사용하지 않아도 group by 만으로 group by 컬럼값으로 자동 정렬이 될 수도 있습니다.

그리고 group by 를 자동 정렬로 적용하면 상대적으로 Hash대비 group by 속도가 덜 나옵니다. 물론 group by 후에 다시 불필요하게 order by 를 수행하는 것 보다는 약간 빠를 수 있지만, 정렬에 대한 부하는 여전합니다.

감사합니다.

홍태경님의 프로필 이미지
홍태경
질문자

아! 아래 쿼리의 ORDER BY 는 위 쿼리처럼 자동 자동 정렬이 안되어 통일 하기 위해 ORDER BY 절을 넣은 것입니다 !

답변 감사합니다 ㅎㅎ

홍태경님의 프로필 이미지
홍태경

작성한 질문수

질문하기