非常慢的表值函数,里面有递归CTE

时间:2010-10-15 14:58:56

标签: sql-server sql-server-2005 performance common-table-expression user-defined-functions

我创建了一个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我正在寻找(自我引用)外键?如果是,我如何优化我的表模式以加速查询?

<小时/> UPDATE :我发现这个性能问题的原因是fiData上没有索引(表的主键上的foreignkey-column)。在创建和重组后,结果立即显现。

谢谢。

1 个答案:

答案 0 :(得分:0)

如上所述,fiData列上的索引解决了性能问题