왜 집계 쿼리가 GROUP BY
없는 경우보다 절을 사용하여 쿼리가 훨씬 빨리 실행되는지 궁금 합니다.
예를 들어이 쿼리를 실행하는 데 거의 10 초가 걸립니다.
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
이건 1 초도 걸리지 않지만
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
CreatedDate
이 경우에는 하나만 있으므로 그룹화 된 쿼리는 그룹화되지 않은 것과 동일한 결과를 반환합니다.
두 쿼리의 실행 계획이 다르다는 것을 알았습니다. 두 번째 쿼리는 Parallelism을 사용하지만 첫 번째 쿼리는 그렇지 않습니다.
GROUP BY 절이 없으면 SQL Server가 집계 쿼리를 다르게 평가하는 것이 정상입니까? 그리고 GROUP BY
절 을 사용하지 않고 첫 번째 쿼리의 성능을 향상시키기 위해 할 수있는 일이 있습니까?
편집하다
방금 OPTION(querytraceon 8649)
병렬 처리의 비용 오버 헤드를 0으로 설정하는 데 사용할 수 있다는 것을 배웠습니다. 이 쿼리를 사용하면 병렬 처리를 사용하고 런타임을 2 초로 단축하지만이 쿼리 힌트를 사용하는 데 단점이 있는지는 알지 못합니다.
SELECT MIN(CreatedDate)
FROM MyTable
WHERE SomeIndexedValue = 1
OPTION(querytraceon 8649)
쿼리는 사용자 선택시 값을 채우는 것이기 때문에 런타임이 더 짧기를 선호하므로 그룹화 된 쿼리와 같이 순간적으로 이상적이어야합니다. 지금은 쿼리를 래핑하고 있지만 실제로 이상적인 솔루션은 아닙니다.
SELECT Min(CreatedDate)
FROM
(
SELECT Min(CreatedDate) as CreatedDate
FROM MyTable WITH (NOLOCK)
WHERE SomeIndexedValue = 1
GROUP BY CreatedDate
) as T
편집 # 2
Martin의 추가 정보 요청에 대한 답변 :
모두 CreatedDate
와 SomeIndexedValue
그들에 별도의 고유하지 않은 비 클러스터형 인덱스가 있습니다. SomeIndexedValue
다른 테이블의 PK (int)를 가리키는 숫자 값을 저장하더라도 실제로는 varchar (7) 필드입니다. 두 테이블 간의 관계는 데이터베이스에 정의되어 있지 않습니다. 데이터베이스를 전혀 변경하지 않아야하며 데이터를 쿼리하는 쿼리 만 쓸 수 있습니다.
MyTable
는 3 백만 개가 넘는 레코드를 포함하며 각 레코드에는 자신이 속한 그룹이 할당됩니다 ( SomeIndexedValue
). 그룹은 1 ~ 200,000 개의 레코드가 될 수 있습니다.
MAXDOP
최대 병렬 처리 수준을 설정하여 쿼리에서 사용할 수있는 프로세서 수를 제한합니다. 기본적으로 두 번째 쿼리가 첫 번째 쿼리보다 느리게 실행됩니다. 병렬 처리 기능을 제거하고 있기 때문에 원하는 것이 아닙니다.