group by 절에서 열 순서가 중요합니까?


85

카디널리티가 매우 높은 하나와 카디널리티가 매우 낮은 (고유 한 값 수) 하나의 두 개의 열이있는 경우 그룹화 기준에 따라 순서가 중요합니까?

예를 들면 다음과 같습니다.

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values

중요한 상황이 있습니까?


2
관련 게시물도 참조하십시오 : MYSQL5 order of group by ...
trcarden 2011-12-09

답변:


74

아니요, GROUP BY 절에서는 순서가 중요하지 않습니다.

MySQL과 SQLite는 (비표준, 이식 가능하지 않음) 그룹에서 생략 된 열을 선택할 수있는 유일한 데이터베이스이지만 순서도 중요하지 않습니다.


27

SQL은 선언적입니다.

이 경우 옵티 마이저에게 데이터를 그룹화하는 방법을 알려주고이를 수행하는 방법을 알아냅니다.

한 줄씩 (절차 적) 평가하지 않고 먼저 한 열을 봅니다.

주요 장소 열 순서 문제는 인덱스에 대한 것입니다. col1, col2과 같지 않습니다 col2, col1. 조금도.


15
ORDER BY에도 중요합니다.
Vincent McNabb 2014 년

12

ROLLUP이라는 Microsoft SQL Server의 레거시 비표준 기능이 있습니다. ROLLUP은 GROUP BY 구문에 대한 확장이며 사용되는 경우 GROUP BY 열의 순서에 따라 결과에서 그룹화되어야하는 열이 결정됩니다. 그러나 ROLLUP은 더 이상 사용되지 않습니다. 표준 SQL 대안은 SQL Server 2008 이상 버전에서 지원하는 그룹화 집합을 사용하는 것입니다.


10

이것은 여기에 언급되지 않았기 때문에. 위의 답변은 정확합니다. 즉, "group by"절 이후의 열 순서 는 쿼리 의 정확성 (예 : 합계 금액)에 영향을주지 않습니다 .

그러나 검색되는 행의 순서는 "group by"절 다음에 지정된 열의 순서에 따라 달라집니다. 예를 들어 A다음 행이있는 테이블 을 고려 하십시오.

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1Col2오름차순으로 정렬 된 행을 검색합니다 .

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

이제 그룹의 열 순서를 Col1, Col2. 검색된 행은 asc에 의해 정렬됩니다 Col1.

select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700

참고 : 합계 금액 (예 : 쿼리의 정확성)은 정확히 동일하게 유지됩니다.


7
그러나 "ORDER BY"를 사용하지 않는 한 선택 결과의 행 순서는 어차피 정의되지 않습니까? 따라서 GROUP BY를 전혀 사용하지 않더라도 특정 행 순서에 의존해서는 안됩니다.
avl_sweden

@avl_sweden에 동의하면 응답이 최소한이 동작이 구현에 따라 다르다는 것을 나타내야한다고 생각합니다. 최신 (또는 동일한) 버전의 SQL 서버가 다른 순서를 생성하지 않을 것이라는 보장은 없습니다.
NobodysNightmare

2

카디널리티가 매우 높은 하나와 카디널리티가 매우 낮은 (고유 한 값 수) 하나의 두 개의 열이있는 경우 그룹화 기준에 따라 순서가 중요합니까?

쿼리 -1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

쿼리 -2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

둘 다 같고 순서는 절에 의해 작동하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.