Sql server CTE SQL Server查询的性能问题

Sql server CTE SQL Server查询的性能问题,sql-server,tsql,Sql Server,Tsql,我们有一个具有父子关系的表,它表示一个深树结构 我们使用带有CTE的视图来查询数据,但性能很差(请参见下面的代码和执行计划) 我们有什么办法可以提高性能吗 WITH cte (ParentJobTypeId, Id) AS ( SELECT Id, Id FROM dbo.JobTypes UNION ALL SELECT e.Id, cte.Id FROM ct

我们有一个具有父子关系的表,它表示一个深树结构

我们使用带有CTE的视图来查询数据,但性能很差(请参见下面的代码和执行计划)

我们有什么办法可以提高性能吗

WITH cte (ParentJobTypeId, Id) AS 
( 
   SELECT   
       Id, Id 
   FROM     
       dbo.JobTypes 

   UNION ALL 

   SELECT   
       e.Id, cte.Id 
   FROM     
       cte 
   INNER JOIN 
       dbo.JobTypes AS e ON e.ParentJobTypeId = cte.ParentJobTypeId 
) 
SELECT  
    ISNULL(Id, 0) AS ParentJobTypeId,
    ISNULL(ParentJobTypeId, 0) AS Id
FROM    
    cte

使用范围键的快速示例。正如我前面提到的,层次结构是127K点,有些部分有15层

cte构建,让我们假设hier结果将存储在一个表中(也编制索引)

返回当前临时表中的hier。注意R1和R2,我称之为范围键。可以通过这些键选择和聚合数据(无递归)

R1  R2  Lvl ID  ParentID
1   4   1   101 NULL
2   2   2   1   101
3   3   2   2   101
4   4   2   3   101
5   6   1   102 NULL
6   6   2   4   102
非常简单的示例:演示了如何将数据向上滚动

R1  R2  Lvl ID  ParentID    Total   Complete    Pending PctCmpl
1   4   1   101 NULL        4       2           1      50.00%
2   2   2   1   101         1       0           1      0.00%
3   3   2   2   101         1       1           0      100.00%
4   4   2   3   101         1       1           0      100.00%
5   6   1   102 NULL        2       1           0      50.00%
6   6   2   4   102         1       1           0      100.00%

范围键的真正优点在于,若您知道一个ID,您就知道它存在的位置(所有后代和祖先)。

一个使用范围键的快速示例。正如我前面提到的,层次结构是127K点,有些部分有15层

cte构建,让我们假设hier结果将存储在一个表中(也编制索引)

返回当前临时表中的hier。注意R1和R2,我称之为范围键。可以通过这些键选择和聚合数据(无递归)

R1  R2  Lvl ID  ParentID
1   4   1   101 NULL
2   2   2   1   101
3   3   2   2   101
4   4   2   3   101
5   6   1   102 NULL
6   6   2   4   102
非常简单的示例:演示了如何将数据向上滚动

R1  R2  Lvl ID  ParentID    Total   Complete    Pending PctCmpl
1   4   1   101 NULL        4       2           1      50.00%
2   2   2   1   101         1       0           1      0.00%
3   3   2   2   101         1       1           0      100.00%
4   4   2   3   101         1       1           0      100.00%
5   6   1   102 NULL        2       1           0      50.00%
6   6   2   4   102         1       1           0      100.00%


范围键的真正美妙之处在于,若你们知道一个ID,你们就知道它存在的地方(所有的后代和祖先)。

我的意思是,有多少层深?一个700k的点层次结构?它多久改变一次?完整的层次结构是否需要是动态的,或者可以根据需要进行存储和/或重建。我认为127K的层次结构很大。你赢了。如果你能储存。考虑增加范围键来加速导航和聚合一秒钟,我会发布一个快速SAMPPLI的意思,有多少个深度?7000点的层次结构?它多久改变一次?完整的层次结构是否需要是动态的,或者可以根据需要进行存储和/或重建。我认为127K的层次结构很大。你赢了。如果你能储存。考虑添加范围键来加速导航和聚合。第二,我将发布一个快速的样本712K点HIER需要花费12秒来建立。如果770KI有帮助的话,我不能说,这里有一个更强大的例子,谢谢。总完成未决PctCmpl和R1及R2代表什么?(很抱歉问这个愚蠢的问题)只是说明如何在一个查询中聚合数据。一个更好的视图是我在提供的链接上所做的屏幕截图。因此,简而言之,每当树发生变化时,我都应该创建一个层次结构表?一个127K的点层次结构需要12秒来构建。如果770KI有帮助的话,我不能说,这里有一个更强大的例子,谢谢。总完成未决PctCmpl和R1及R2代表什么?(很抱歉问这个愚蠢的问题)只是说明如何在一个查询中聚合数据。一个更好的视图是我在提供的链接上所做的屏幕截图。所以简而言之,我应该在树发生变化时创建一个层次结构表?