Sql server 2012 为什么我必须对这些层次结构查询强制排序/
下面是一个我可能运行的查询示例,其中对于每个类别,我希望NumberOfCourses不仅表示该特定类别,还表示其下的任何子类别。我认为这个问题是不言自明的Sql server 2012 为什么我必须对这些层次结构查询强制排序/,sql-server-2012,hierarchical-data,sql-execution-plan,query-hints,Sql Server 2012,Hierarchical Data,Sql Execution Plan,Query Hints,下面是一个我可能运行的查询示例,其中对于每个类别,我希望NumberOfCourses不仅表示该特定类别,还表示其下的任何子类别。我认为这个问题是不言自明的 select c.CategoryID, courses.MarketID, count(distinct courses.CourseID) NumberOfCourses from Category c join CategoryHierarchy tch on tch.HierarchyKey like '%~
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
当我按原样运行时,可能需要将近两分钟的时间,但是如果我添加提示选项(强制命令)
,那么运行只需要几秒钟。所以我的问题是,我是否做了一些错误的事情导致SQL创建了一个糟糕的计划,或者SQL引擎实际上只是不擅长像这样优化层次连接
我试着包括sql计划,但它太长了,所以不会让我有那么多字符。如果有人能告诉我怎么做,我很乐意与大家分享
编辑:我想可能不是每个人都知道这种层次结构是如何工作的。它们的层次结构键类似于~1234~5678~9123~其中1234是5678的父项,5678是9123的父项。通过对CategoryID进行类似的比较,我可以在结果中包含所有子类别。从SQL Server 2016+开始,引入了查询存储功能以监控性能。它提供了对查询计划选择和性能的深入了解 它还提供了强制执行计划的选项 它并不是跟踪或扩展事件的完全替代品,但随着它从一个版本发展到另一个版本,我们可能会在SQL Server的未来版本中获得一个功能齐全的查询存储。 查询存储的主要流程
- 计划存储-持久化执行计划信息
- 运行时统计存储-持久化执行统计信息
- 查询等待统计信息存储-持久化等待统计信息
- 默认情况下,查询存储对于新数据库不处于活动状态
- 无法为主数据库或
数据库启用查询存储tempdb
- 可用DMV (Transact-SQL)
- 查询计划存储: 持久化执行计划信息,它负责捕获与查询编译相关的所有信息 (Transact-SQL) (Transact-SQL) (Transact-SQL)
- 运行时统计数据存储: 持久化执行统计信息,它可能是最频繁更新的存储。这些统计数据表示查询执行数据 (Transact-SQL)
- 查询等待统计数据存储: 保存和捕获等待统计信息 (Transact-SQL)
注意:Query Wait Stats Store仅在SQL Server 2017+中可用。我怀疑如果没有计划,很难回答这个问题。试过了?我想你是对的。谢谢你给我指了一个可以分享计划的地方。。。明天一有机会上班我就去做@米奇麦我显然在这方面撒了谎,哈哈,直到现在我才注意到这个答案。接受它是因为你提供了一些很棒的信息,我怀疑其他人是否会提供更有用的信息:)