SQL 그룹 대 뚜렷한 그룹
-
06-07-2019 - |
문제
쿼리에 집계가 수행되지 않을 때 누군가가 그룹을 사용하는 이유는 무엇입니까?
또한 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의 임의 테이블 몇 개입니다.
패턴 :
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
그것들 때문에 모호하지 않은 방식으로 기능적 종속성 의 a
.
그러나 Microsoft SQL Server 및 기타 브랜드는 기능 의존성을 쉽게 결정할 수 없기 때문에이 쿼리를 허용하지 않습니다. 편집하다: 대신 표준 SQL은 다음을 따라야합니다 단일 가치 규칙, 즉, select-list의 모든 열은 GROUP BY
조항 또는 그렇지 않으면 설정 함수에 대한 인수가됩니다.
반면 DISTINCT
Select-List의 모든 열을 항상보고 해당 열만 살펴 봅니다. 그것은 일반적인 오해입니다 DISTINCT
열을 지정할 수 있습니다.
SELECT DISTINCT(a), b, c FROM table1;
괄호 안에도 불구하고 DISTINCT
기능 호출처럼 보이지만 그렇지 않습니다. 선택 목록의 세 필드 중 하나에서 쿼리 옵션이며 쿼리 결과에서 뚜렷한 행으로 연결됩니다. 이 선택 목록의 표현 중 하나에는 주변의 괄호가 있지만 결과에는 영향을 미치지 않습니다.
MySQL에서 나는 그룹을 사용하는 것이 종종 성능이 뚜렷한 것보다 더 좋습니다.
MySQL을 사용하여 "Select Select"쇼 "쇼를 수행하면 임시 테이블이 생성됩니다.
vs vs a "설명 a, b, c에서 t2에서 t2를 선택하십시오.
둘 다 MS SQL Server에서 동일한 쿼리 계획을 생성합니다 .... MS SQL Server가있는 경우 실제 실행 계획이 귀하의 요구에 더 나은 것이 더 나은 것을 확인할 수 있습니다 ...
그 게시물을 살펴보십시오.
http://www.sqlmag.com/article/articleid/24282/sql_server_24282.html
당신이 정말로 뚜렷한 값을 찾고 있다면, 뚜렷한 소스 코드를 더 읽기 쉽게 만듭니다 (저장 프로 시저의 일부인 경우)가 임시 쿼리를 작성하는 경우 보통 그룹에서 시작하여, 내가있는 경우에도 그룹으로 시작합니다. 내가 종종 그들을 입히게되기 때문에 집계는 없습니다.