mysql - 이란 - union & union all




SQL 그룹 별 (4)

쿼리에서 집계가 수행되지 않은 경우 누군가가 그룹을 대별로 사용하는 이유는 무엇입니까?

또한 누군가가 MySQL과 SQL Server의 성능 비교 고려 사항을 비교하여 그룹을 알고 있습니까? 필자는 SQL Server가 더 나은 최적화 프로그램을 가지고 있으며 거기에 더 가깝다고 생각합니다. 그러나 MySQL에서는 고유 한 성능 이점을 기대합니다.

dba 답변에 관심이 있습니다.

편집하다:

Bill의 게시물은 흥미롭지 만 적용 할 수 없습니다. 좀 더 자세히 설명해 드리겠습니다 ...

select a, b, c 
from table x
group by a, b,c

select distinct a,b,c
from table x

MS SQL Server의 약간의 경험적 데이터. DB의 무작위 테이블 2 개.

패턴의 경우 :

SELECT col1, col2 FROM table GROUP BY col1, col2

SELECT DISTINCT col1, col2 FROM table 

쿼리의 커버 인덱스가 없으면 두 방법 모두 다음 쿼리 계획을 생성했습니다.

|--Sort(DISTINCT ORDER BY:([table].[col1] ASC, [table].[col2] ASC))
   |--Clustered Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]))

커버 리지 지수가있을 때, 둘 다 생산되었다.

|--Stream Aggregate(GROUP BY:([table].[col1], [table].[col2]))
   |--Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]), ORDERED FORWARD)

그래서 아주 작은 샘플 SQL Server는 똑같이 취급합니다.


고유 한 값을 찾고있는 경우에는 별개로 저장 프로 시저의 일부인 경우처럼 소스 코드를 읽기 쉽도록 만듭니다. 임시 쿼리를 작성하는 경우 대개 그룹별로 시작합니다. 집계를하지 않을 때가 종종 있습니다.


GROUP BY 는 선택 열에있을 필요가없는 특정 열의 고유 한 값마다 하나의 행에 행 그룹을 매핑합니다.

SELECT b, c, d FROM table1 GROUP BY a;

이 쿼리는 정식 SQL입니다 ( 수정 : MySQL에서만, 실제로 표준 SQL이 아니며 다른 브랜드에서는 지원되지 않습니다). MySQL은 그것을 받아들입니다. 그리고 b , c , d 를 선택하는 것은 모호하지 않은 방식으로 당신이하고있는 일을 알고 있다고 믿습니다.

그러나 Microsoft SQL Server 및 기타 브랜드에서는 기능 의존성을 쉽게 판별 할 수 없으므로이 쿼리를 허용하지 않습니다. 편집 : 대신, 표준 SQL은 단일 값 규칙 을 따라야합니다. 즉, 선택 목록의 모든 열은 GROUP BY 절에 이름을 지정하거나 set 함수의 인수 여야합니다.

반면 DISTINCT 항상 선택 목록의 모든 열과 해당 열만 확인합니다. DISTINCT 에서 열을 지정할 수 있다는 것은 일반적인 오해입니다.

SELECT DISTINCT(a), b, c FROM table1;

DISTINCT 함수 호출처럼 보이게하는 괄호에도 불구하고 DISTINCT . 이것은 조회 옵션이며 선택 목록의 세 필드 중 하나에서 고유 한 값은 조회 결과에서 구별되는 행을 가져옵니다. 이 선택 목록의 표현식 중 하나에는 그 주변에 괄호가 있지만 결과에 영향을 미치지 않습니다.


MySQL에서는 DISTINCT보다 성능면에서 GROUP BY를 사용하는 것이 더 나은 것으로 나타났습니다.

"EXPLAIN SELECT DISTINCT"를 수행하면 "Using Using, temporary"를 사용하여 MySQL이 임시 테이블을 생성합니다.

대 "a T1, T2에서 T, A, b, c를 선택하십시오. 여기서 T2.A = T1.A"그냥 보여줍니다 "에 의한 GROUP"





distinct