Я создал TVF, который возвращает таблицу с родительскими записями из рекурсивного CTE здесь .Это отлично работает, и результат доступен напрямую.Теперь я хотел получить дочерние записи (они имеют тот же FK, что и PK текущей записи).Проблема в том, что для получения 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 (столбец внешнего ключа в первичном ключе таблицы).После создания и реорганизации, результат пришел сразу.
Спасибо.