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

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

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

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

중요한 상황이 있습니까?



답변

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

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


답변

SQL은 선언적입니다.

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

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

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


답변

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


답변

이것은 여기에 언급되지 않았기 때문에. 위의 답변은 정확합니다. 즉, “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

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


답변

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

쿼리 -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;

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


답변