代码之家  ›  专栏  ›  技术社区  ›  Tim Schmelter

具有递归CTE的极慢表值函数

  •  2
  • Tim Schmelter  · 技术社区  · 14 年前

    我创建了一个TVF,它返回一个表,其中包含来自递归CTE的父记录 here . 效果很好,结果可以直接得到。现在我想得到子记录(它们与当前记录的PK具有相同的FK)。 问题是,对于给定的id,获取22个子记录需要1:10分钟。 为什么这是如此缓慢相比,相反的TVF寻找家长记录?

    这是ITVF:

    CREATE FUNCTION [dbo].[_nextClaimsByIdData] (
        @idData INT
    )
    
    RETURNS TABLE AS
    RETURN(
        WITH NextClaims 
        AS(
            SELECT 1 AS relationLevel, child.*
            FROM tabData child
            WHERE child.fiData = @idData
    
            UNION ALL
    
            SELECT relationLevel+1, parent.*
            FROM NextClaims nextOne
            INNER JOIN  tabData parent ON parent.fiData = nextOne.idData
        )
    
        SELECT TOP 100 PERCENT * FROM NextClaims order by relationLevel
    )
    

    这就是关系:

    Datamodel

    select relationLevel,idData,fiData from dbo._nextClaimsByIdData(30755592);
    
    rl    idData      fiData
    1   30073279    30755592
    2   30765260    30073279
    3   31942491    30765260
    4   30895945    31942491
    5   48045119    30895945
    6   48342321    48045119
    7   48342320    48342321
    8   48308966    48342320
    9   48308965    48308966
    10  47044261    48308965
    11  47044260    47044261
    12  47253273    47044260
    13  47253272    47253273
    14  47279292    47253272
    15  47279293    47279292
    15  47494589    47279292
    16  47494588    47494589
    17  46051999    47494588
    18  46373053    46051999
    19  46083426    46373053
    20  46099567    46083426
    21  46600314    46099567
    22  46595167    46600314
    

    性能丢失的原因可能是在我的第一个TVF(链接在上面)中我正在寻找主键,而在这个TVF中我正在寻找(自引用)外键?如果是,如何优化表架构以加速查询?


    :我发现此性能问题的原因是fiData(表主键上的foreignkey列)上没有索引。经过创建和重组,结果马上就出来了。

    1 回复  |  直到 7 年前
        1
  •  0
  •   heedfull rboarman    13 年前

    fiData列上的As-stated索引解决了性能问题