by 내몸매GROUPBY [MySQL] [2019.05.18 16:21:48]
간단한 질문이긴한데 대게 제 주변 사람들은 GROUP BY가 정렬까지 해주는거야 라고 알고있고 저도 그렇게 알고있었는데
요즘 책을보며 느끼는게 뭐냐면 과연 술집 이모가 서비스로 계란말이 주는거마냥 정렬까지 해준다라는 표현이 맞을까라는 생각이 들었습니다
아무래도 그룹핑을 하려면 GROUP BY절에 명시된 컬럼들을 기준으로 정렬 작업을 실행한 후에 그룹핑을 하는게 훨씬 효율적이라고 생각하는데
그렇게되면 사실 정렬까지 해주는게 아니라 정렬이 되야지만 그룹핑을 하는거라고 생각하거든요
정렬까지 해준다 vs 정렬을 해야만 한다
어떤게 맞을까요??
당연한 얘기지만 DBMS는 효율에 집중합니다. 그래서 order by 절이 없다면 정렬은 신경쓰지 않습니다.
다만, 그룹핑을 처리하는 과정에서 종종 이미 정렬된 인덱스를 사용하거나 내부적으로 정렬하여 처리하는게 효율적이기 때문에.. 그 결과가 정렬되어 있을 뿐이죠.
그럼.. 신경쓰진 않지만 결과적으로는 항상 정렬되어 있는가?
그렇지는 않습니다. 옵티마이저가 어떤 실행계획을 채택하는가에 따라 정렬되지 않은 결과도 나올 수 있습니다.
즉, DBMS가 정렬을 보장하도록 하는 방법은.. order by 절을 사용하는 것이 유일한 방법입니다.
(때로는 정렬된 결과가 나오다가도.. 데이터가 많이 쌓이면서 갑자기 정렬되지 않은 결과가 나오기도 합니다. 데이터 분포가 변하면서 실행 계획이 바뀐거죠)
다만, 정렬해야하는가? 와 관련해서는.. order by는 종종 file sort를 발생시키기 때문에.. 피할 수 있다면 피하는게 좋다고 생각합니다. (WAS나 클라이언트에서 정렬 또는 힌트를 사용한 실행계획의 고정)