Sql server 2012 为什么我必须对这些层次结构查询强制排序/

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 '%~

下面是一个我可能运行的查询示例,其中对于每个类别,我希望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
当我按原样运行时,可能需要将近两分钟的时间,但是如果我添加提示
选项(强制命令)
,那么运行只需要几秒钟。所以我的问题是,我是否做了一些错误的事情导致SQL创建了一个糟糕的计划,或者SQL引擎实际上只是不擅长像这样优化层次连接

我试着包括sql计划,但它太长了,所以不会让我有那么多字符。如果有人能告诉我怎么做,我很乐意与大家分享


编辑:我想可能不是每个人都知道这种层次结构是如何工作的。它们的层次结构键类似于~1234~5678~9123~其中1234是5678的父项,5678是9123的父项。通过对CategoryID进行类似的比较,我可以在结果中包含所有子类别。

从SQL Server 2016+开始,引入了查询存储功能以监控性能。它提供了对查询计划选择和性能的深入了解

它还提供了强制执行计划的选项

它并不是跟踪或扩展事件的完全替代品,但随着它从一个版本发展到另一个版本,我们可能会在SQL Server的未来版本中获得一个功能齐全的查询存储。 查询存储的主要流程

  • SQL Server现有组件通过使用查询存储管理器与查询存储交互
  • 查询存储管理器确定应该使用哪个存储,然后将执行传递给该存储(计划或运行时统计或查询等待统计)
    • 计划存储-持久化执行计划信息
    • 运行时统计存储-持久化执行统计信息
    • 查询等待统计信息存储-持久化等待统计信息
  • 计划、运行时统计和等待存储使用查询存储作为SQL Server的扩展
  • 启用查询存储:查询存储在服务器上的数据库级别工作

    • 默认情况下,查询存储对于新数据库不处于活动状态
    • 无法为主数据库或
      tempdb
      数据库启用查询存储
    • 可用DMV (Transact-SQL)

  • 在查询存储中收集信息:我们使用查询存储DMV(数据管理视图)从三个存储中收集所有可用信息

    • 查询计划存储: 持久化执行计划信息,它负责捕获与查询编译相关的所有信息

      (Transact-SQL) (Transact-SQL) (Transact-SQL)

    • 运行时统计数据存储: 持久化执行统计信息,它可能是最频繁更新的存储。这些统计数据表示查询执行数据

      (Transact-SQL)

    • 查询等待统计数据存储: 保存和捕获等待统计信息

      (Transact-SQL)


  • 注意:Query Wait Stats Store仅在SQL Server 2017+中可用。

    我怀疑如果没有计划,很难回答这个问题。试过了?我想你是对的。谢谢你给我指了一个可以分享计划的地方。。。明天一有机会上班我就去做@米奇麦我显然在这方面撒了谎,哈哈,直到现在我才注意到这个答案。接受它是因为你提供了一些很棒的信息,我怀疑其他人是否会提供更有用的信息:)