Sql server CTE SQL Server查询的性能问题
我们有一个具有父子关系的表,它表示一个深树结构 我们使用带有CTE的视图来查询数据,但性能很差(请参见下面的代码和执行计划) 我们有什么办法可以提高性能吗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
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代表什么?(很抱歉问这个愚蠢的问题)只是说明如何在一个查询中聚合数据。一个更好的视图是我在提供的链接上所做的屏幕截图。所以简而言之,我应该在树发生变化时创建一个层次结构表?