我创建了一个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
)
这就是关系:
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列)上没有索引。经过创建和重组,结果马上就出来了。