Найти ВСЕХ потомков узлов, избегая повторяющихся отношений - PullRequest
0 голосов
/ 30 октября 2019

У меня есть таблица с отношениями между узлами.

Таблица отношений

PARENT_ID: numeric
CHILD_ID: numeric

Один узел может быть связан несколько раз под другими узлами. Я ищу способ найти ВСЕХ потомков для набора родительских узлов.

Я нашел несколько решений, которые развертывают рекурсивные CTE для поиска всех потомков, и действительно, эти решения работают довольно хорошо.

WITH cte (ParentID, ChildID) AS (


    SELECT e.ParentID, e.ChildID
    FROM relations AS e   
    WHERE ParentID in (1,2,3,4,...,500)

    UNION ALL

    SELECT e.ParentID, e.ChildID
    FROM relations AS e
    INNER JOIN cte AS d ON e.ParentID = d.ChildID)
)

    SELECT *
    FROM cte  
    GROUP BY ParentID, ChildID

Тем не менее при поиске всех потомков для 400+ идентификаторов,Я получаю промежуточную таблицу с приблизительно 200 КБ, где мне нужно развернуть операцию «группировать по», чтобы получить все затронутые дочерние узлы, что приводит к плохому времени выполнения sql-запроса около 4 секунд, чтобы восстановить 3000 отношений, на самом деле меня интересует.

Мне нужно улучшить производительность и наткнулся на [1], где для каждого узла проверяется, разрешена ли связь, кроме того, если все зависимости уже разрешены с помощьюпредыдущий запрос зависимости. К сожалению, я не могу установить эту технику на мою проблему и, следовательно, просить помощи.

Рекурсивный CTE T-SQL с несколькими родительскими элементами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...