Query объяснение:COUNT (1) + COUNT (DISTINCT()) гораздо медленнее, чем делать по 2 запросов отдельно
Person
(идентифицируютсяPersonID
) может иметь или не иметь соответствующийJob
(идентифицированныйJobID
).- Если имеется соответствующий
Job
, связывание хранится в таблицеPersonJob
(PersonID
< =>JobID
). Person
безJob
игнорируются.Job
также естьCityID
.- За каждый
Job.CityID
, запрос хочет знать общее колPerson
, а также подсчитывать уникальныхPerson.HouseID
Запрос:
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,000SELECT COUNT(1) FROM Person
~ 800.000SELECT COUNT(DISTINCT(Person.HouseID)) FROM Person
~ 10,000SELECT COUNT(1) FROM Job
~ 500- MS SQL Server 10,50
Проблема:
COUNT(1)
часть запроса, при запуске отдельно, работает в 0.25sec.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.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 - 3 раза медленнее, почему?
планов выполнения:
- Я не эксперт в чтении тех, извините.
- Насколько я могу сказать, что проблема заключается в COUNT (DISTINCT)
- При частичном запросе:
- 25% матча Hash (агрегированной) (выход
Job.CityID
) - 15% матча Hash (Inner Регистрация) (выход
Job.CityID
,Person.HouseID
)- 30% Индекс сканирования (выход
Person.PersonID
,Person.HouseID
) - 14% Индекс искать (выход
PersonJob.PersonID
)
- 30% Индекс сканирования (выход
- 25% матча Hash (агрегированной) (выход
- В полном запросе:
- 03% матча Hash (Partial агрегатного) (выход
Job.CityID
,COUNT(*)
) - 31% совпадению Hash (совокупный) (выход
Job.CityID
) - 29% Столовая катушка (выход
Job.CityID
,Person.HouseID
)
- 03% матча Hash (Partial агрегатного) (выход
В ваших сравнениях используется 'join'? –
Не знаете, что вы имеете в виду, возможно, частичные запросы? Добавили их. – Codeguard
Несвязанный, но: 'distinct' is *** NOT *** функция. 'distinct (Person.HouseID)' is ** точно ** то же самое, что и 'different Person.HouseID' –