Как видит читатель, код без
SELECT @CurrentID = ID
FROM @StackTable
WHERE Level = @Level
INSERT INTO @OutputTable
SELECT BrandID, [Name], ParentID, @Level
AS Level
FROM Brands
WHERE BrandID = @CurrentID
DELETE FROM @StackTable
WHERE Level = @Level
AND ID = @CurrentID
INSERT @StackTable
SELECT BrandID, @Level + 1
FROM Brands
WHERE ParentID = @CurrentID
IF @@
ROWCOUNT > 0
SET @Level = @Level + 1
END
ELSE
SET @Level = @Level - 1
END
SELECT *
FROM @OutputTable
ORDER BY ID
Как видит читатель, код без использования виртуальных представлений более громоздкий и сложный для понимания. Несмотря на то, что подобный код несложно написать, весьма просто допустить досадную ошибку, на поиски которой может уйти много времени.
Кроме того, рекурсия с использованием виртуального представления значительно превосходит в производительности подход с использованием временных таблиц. Так, для тестового набора из ста тысяч записей в таблице
Brands, время выполнения кода с использованием виртуального представления оказалось в четыре раза меньше, чем время выполнения кода без использования оного. Примерно то же отношение получено и для меньших наборов данных.
Содержание Назад Вперед