У меня есть таблица с отношениями между узлами.
Таблица отношений
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 с несколькими родительскими элементами