쿼리 설명을하고 다음 COUNT (PersonID
로 식별)COUNT (1) + (DISTINCT()) 훨씬 느린 2 개 쿼리를 별도로
Person
은 (JobID
로 식별)Job
대응이 있거나 없을 수 있습니다.- 해당하는
Job
이있는 경우 바인딩은PersonJob
(PersonID
< =>JobID
) 테이블에 저장됩니다. Person
Job
이 없으면 무시됩니다.Job
도CityID
입니다.SELECT Job.CityID, COUNT(1) NumTotal, COUNT(DISTINCT(Person.HouseID)) NumDistinct FROM Job INNER JOIN PersonJob ON (PersonJob.JobID = Job.JobID) INNER JOIN Person ON (Person.PersonID = PersonJob.PersonID) GROUP BY Job.CityID
통계 :
SELECT COUNT(1) FROM PersonJob
~ 600.000- 모든
Job.CityID
당 - 는 쿼리
Person
의 총 수를 알고도 독특한Person.HouseID
쿼리의 계산 싶어
SELECT COUNT(1) FROM Person
~ 800.000SELECT COUNT(DISTINCT(Person.HouseID)) FROM Person
~ 10.000SELECT COUNT(1) FROM Job
~ 500- MS SQL 서버 10.50
문제 : 쿼리 별도로 실행할 때, 0.25sec에서 실행의
COUNT(1)
부분. 별도로 실행할 때 쿼리의SELECT Job.CityID, COUNT(1) NumTotal FROM Job INNER JOIN PersonJob ON (PersonJob.JobID = Job.JobID) INNER JOIN Person ON (Person.PersonID = PersonJob.PersonID) GROUP BY Job.CityID
COUNT(DISTINCT(Person.HouseID))
부분은, 0.80sec에서 실행됩니다. 3 배 느린 이유 -SELECT Job.CityID, COUNT(DISTINCT(Person.HouseID)) NumDistinct FROM Job INNER JOIN PersonJob ON (PersonJob.JobID = Job.JobID) INNER JOIN Person ON (Person.PersonID = PersonJob.PersonID) GROUP BY Job.CityID
전체 쿼리는 3.10sec에서 실행?
실행 계획 :
- 내가 그 읽기에 어떤 전문가는 아니지만, 죄송합니다.(
- 25 % 해시 일치 (집계) (출력
Job.CityID
) - 15 % 해시 일치 내부를 :
- 는 지금까지 내가 말할 수있는 문제가 일부 쿼리에서
- (DISTINCT) COUNT 내에있는 (출력 이
- 14 % 지수가 추구 (출력
Job.CityID
,Person.HouseID
)- 30 % 인덱스 스캔 (출력
Person.PersonID
,Person.HouseID
)) 가입PersonJob.PersonID
)
전체 쿼리에서
- 30 % 인덱스 스캔 (출력
- 25 % 해시 일치 (집계) (출력
- :
- 03퍼센트 해시 매치 (부분 집합) (출력
Job.CityID
,COUNT(*)
) - 31 % 해시 일치 (집계) (출력
Job.CityID
) - 29 % 테이블 스풀 (출력
Job.CityID
,Person.HouseID
)
,
- 03퍼센트 해시 매치 (부분 집합) (출력
비교 작업에'join's을 사용합니까? –
어쩌면 부분 쿼리 일까? 그들을 추가했습니다. – Codeguard
관련 없음, 그러나 :'distinct'는 *** NOT *** 함수입니다. 'distinct (Person.HouseID)'는 ** 정확히 ** distinct Person.HouseID'와 동일합니다. –