Можете ли вы улучшить производительность с представлениями sqlserver?
У меня есть функция sql, которая ищет родителя определенного узла в левом правом дереве. Это занимает много времени. Если я создам представление, которое хранит для каждого узла его родителя, это ускорит вещи? (Затем я бы попросил представление получить родительский узел).
2 ответа
Представление (и основная функция) будут переоцениваться при каждом обращении к нему, поэтому создание представления ничего не улучшит.
Фактически, вы, скорее всего, будете ускорять процесс, удаляя UDF
и просто используя это, чтобы найти ваш родительский узел:
SELECT mpp.id
FROM mytable mc
CROSS APPLY
(
SELECT TOP 1 id
FROM mytable mp
WHERE mp.lft BETWEEN m.lft AND m.rgt
ORDER BY
mp.lft DESC
) mpp
особенно если у вас есть индекс на lft
который также охватывает rgt
:
CREATE INDEX ON mytable (lft) INCLUDE (rgt)
Модель вложенных множеств не очень эффективна для SQL Server
, Он был разработан для унаследованных систем, которые не допускали рекурсивных запросов, но для большинства современных систем баз данных список смежности гораздо эффективнее.
Смотрите эту статью в моем блоге для деталей:
Да, это должно ускорить процесс. Пусть представление вернет идентификатор ребенка и детали родителя.
Таким образом, вы можете присоединиться со своей таблицы к представлению, используя дочерний идентификатор.