카디널리티가 매우 높은 하나와 카디널리티가 매우 낮은 (고유 한 값 수) 하나의 두 개의 열이있는 경우 그룹화 기준에 따라 순서가 중요합니까?
예를 들면 다음과 같습니다.
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, Col1
Col2
오름차순으로 정렬 된 행을 검색합니다 .
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;
둘 다 같고 순서는 절에 의해 작동하지 않습니다.