下面是我可能会运行的查询示例,对于每个类别,我希望 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 的父级,而 5678 是 9123 的父级。通过对 CategoryID 进行类似比较,我可以在结果中包含所有子类别。