sql 그룹 대 구별
쿼리에 집계가 수행되지 않는데 그룹을 구분하여 사용하는 이유는 무엇입니까?
또한 MySQL 및 SQL Server의 성능 고려 사항과 비교하여 그룹을 알고 있는 사람이 있습니까?SQL Server가 더 나은 최적화 기능을 가지고 있고 거기에 상응하는 수준에 가까울 수도 있겠지만 MySQL에서는 상당한 성능상의 이점이 있을 것으로 예상합니다.
dba 답변에 관심이 있습니다.
편집:
빌의 게시물은 흥미롭지만, 해당되지는 않습니다.좀 더 구체적으로...
select a, b, c
from table x
group by a, b,c
대
select distinct a,b,c
from table x
GROUP BY는 행 그룹을 특정 열의 고유 값당 하나의 행에 매핑합니다. 이 값은 선택 목록에 있어야 할 필요도 없습니다.
SELECT b, c, d FROM table1 GROUP BY a;
이 쿼리는 합법적인 SQL입니다(수정: MySQL에서만 해당되며 실제로는 표준 SQL이 아니며 다른 브랜드에서 지원되지 않습니다).MySQL은 이를 받아들이며, 사용자가 자신이 무엇을 하고 있는지 알고, 선택할 것을 신뢰합니다.b,c,그리고.d그들이 기능적으로 의존하기 때문에 명확한 방식으로a.
그러나 Microsoft SQL Server 및 다른 브랜드에서는 이 쿼리를 허용하지 않습니다. 기능 종속성을 쉽게 결정할 수 없기 때문입니다.edit: 대신 표준 SQL에서는 단일 값 규칙을 따르도록 요구합니다. 즉, 선택 목록의 모든 열은 에서 이름을 지정해야 합니다.GROUP BY절 또는 그렇지 않으면 집합 함수의 인수가 됩니다.
반면에.DISTINCT는 항상 선택 목록의 모든 열과 해당 열만 봅니다.일반적으로 잘못 알고 있는 것은DISTINCT열을 지정할 수 있습니다.
SELECT DISTINCT(a), b, c FROM table1;
괄호 만들기에도 불구하고DISTINCT함수 호출처럼 보입니다. 그렇지 않습니다.쿼리 옵션이며 선택 목록의 세 필드 중 하나에 있는 고유한 값은 쿼리 결과에 고유한 행으로 이어집니다.이 선택 목록에 있는 식 중 하나에 주변에 괄호가 있지만 결과에는 영향을 주지 않습니다.
마이크로소프트 SQL 서버의 약간(아주 조금)의 경험적 데이터, DB의 몇 개의 임의 테이블에 대한 것입니다.
패턴의 경우:
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는 매우 작은 샘플에서 두 가지 모두를 동일하게 취급합니다.
MySQL에서는 DISTINCT보다 GROUP BY를 사용하는 것이 성능 면에서 더 우수한 경우가 많습니다.
EXPLAIN SELECT DISTINCT를 수행하면 "Using where; Using there; Using temporary" MySQL이 임시 테이블을 만듭니다.
vs "T1, T2에서 선택 a,b,c를 설명합니다.A=T1.A GROUP by a"는 "Using where"를 표시합니다.
둘 다 MS SQL Server에서 동일한 쿼리 계획을 생성합니다.MS SQL 서버가 있는 경우 실제 실행 계획을 실행하여 어떤 것이 필요에 더 적합한지 확인할 수 있습니다.
다음 게시물을 확인해 주시기 바랍니다.
http://www.sqlmag.com/Article/ArticleID/24282/sql_server_24282.html
별개의 값을 정말로 찾고 있다면, 별개는 소스 코드를 더 쉽게 읽을 수 있도록 해줍니다(예: 저장 프로시저에 포함되어 있는 경우). 임시 쿼리를 작성하는 경우에는 그룹을 사용하는 경우가 많기 때문에 집계가 없더라도 보통 그룹을 사용하여 시작합니다.
언급URL : https://stackoverflow.com/questions/426723/sql-group-by-versus-distinct
'programing' 카테고리의 다른 글
| Google 지도 마커 아이콘 이미지 크기 조정 (0) | 2023.10.31 |
|---|---|
| a의 내용을 변경하는 방법a의 내용을 변경하는 방법a의 내용을 변경하는 방법 (0) | 2023.10.31 |
| wmain과 main의 차이점은 무엇입니까? (0) | 2023.10.31 |
| GSSAPI-PHP를 사용한 MariaDB 인증(Windows) (0) | 2023.10.31 |
| AngularJS + Safari:페이지 전환 시 페이지를 맨 위로 강제 스크롤 (0) | 2023.10.31 |