Очень медленная табличная функция с рекурсивным CTE внутри - PullRequest
2 голосов
/ 15 октября 2010

Я создал 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
)

Это соотношение:

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 (столбец внешнего ключа в первичном ключе таблицы).После создания и реорганизации, результат пришел сразу.

Спасибо.

1 Ответ

0 голосов
/ 28 марта 2011

Как указано, индекс для столбцов fiData решил проблему производительности

...