문제

쿼리에 집계가 수행되지 않을 때 누군가가 그룹을 사용하는 이유는 무엇입니까?

또한 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://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-by-distinct-vs-group-by/

http://www.sqlmag.com/article/articleid/24282/sql_server_24282.html

당신이 정말로 뚜렷한 값을 찾고 있다면, 뚜렷한 소스 코드를 더 읽기 쉽게 만듭니다 (저장 프로 시저의 일부인 경우)가 임시 쿼리를 작성하는 경우 보통 그룹에서 시작하여, 내가있는 경우에도 그룹으로 시작합니다. 내가 종종 그들을 입히게되기 때문에 집계는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top