Ниже приведен пример запроса, который я могу выполнить, где для каждой категории я хочу, чтобы NumberOfCourses представлял не только эту конкретную категорию, но и любые дочерние категории в ней. Я думаю, что запрос довольно понятен.
select c.CategoryID, courses.MarketID, count(distinct courses.CourseID) NumberOfCourses
from Category c
join CategoryHierarchy tch on tch.HierarchyKey like '%~' + cast(c.CategoryID as varchar) + '~%'
join vLiveEvents courses on tch.CategoryID = courses.CategoryID
where courses.MarketID is not null
group by c.CategoryHumanID, courses.MarketID
Когда я запускаю это как есть, это может занять почти две минуты, однако, если я добавлю подсказку Option (Force Order)
, тогда это займет всего несколько секунд. Итак, мой вопрос: я делаю что-то не так, что приводит к тому, что SQL создает плохой план, или движок SQL на самом деле просто не хорош для оптимизации иерархических объединений, как это?
Я пытался включить план sql, но он слишком длинный, и ТАК не позволяет мне иметь столько символов. Я рад поделиться этим, хотя, если кто-нибудь может сказать мне, как это сделать.
РЕДАКТИРОВАТЬ: Я думаю, вероятно, не все знают, как работают эти виды иерархий. Ключ иерархии будет выглядеть примерно так: ~ 1234 ~ 5678 ~ 9123 ~, где 1234 является родителем 5678, который является родителем 9123. Путем сравнения идентификаторов CategoryID я могу включить в результаты все дочерние категории.