Оптимизация CTE для рекурсивных запросов

У меня есть таблица с самосоединением. Вы можете думать о структуре как о стандартной таблице для представления организационной иерархии. Например, таблица: -

MemberId
MemberName
RelatedMemberId

Эта таблица состоит из 50000 записей выборки. Я написал рекурсивный запрос CTE, и он работает абсолютно нормально. Однако время, необходимое для обработки всего 50000 записей, составляет около 3 минут на моей машине (4 ГБ ОЗУ, 2,4 ГГц Core2Duo, 7200 об / мин HDD).

Как я могу улучшить производительность, потому что 50000 - не такое уж большое число. Со временем он будет расти. Это тот запрос, который есть у меня в моей хранимой процедуре. Цель запроса - выбрать всех членов, относящихся к определенному члену. Например. Под собственником компании приходит каждый человек. Для Менеджера, кроме Владельца, возвращаются все записи. ИДТИ ВКЛЮЧИТЬ QUOTED_IDENTIFIER GO

Alter PROCEDURE spGetNonVirtualizedData
(
    @MemberId    int
)
AS
BEGIN

    With MembersCTE As
    (
        Select parent.MemberId As MemberId, 0 as Level
            From Members as parent Where IsNull(MemberId,0) = IsNull(@MemberId,0)

                    Union ALL
        Select    child.MemberId As MemberId , Level + 1 as Level
            From Members  as child
                Inner Join MembersCTE on MembersCTE.MemberId = child.RelatedMemberId
    )   
    Select Members.*
        From MembersCTE
        Inner Join Members On MembersCTE.MemberId = Members.MemberId
        option(maxrecursion 0)

END
GO

Как видите, для повышения производительности я даже сделал объединения на последнем шаге при выборе записей, чтобы все ненужные записи не попадали во временную таблицу. Если я сделал соединения на моем базовом шаге и рекурсивном шаге CTE (вместо Select на последнем шаге), запрос займет 20 минут!

MemberId - это первичный ключ в таблице.

Заранее спасибо :)

6
задан TCM 22 April 2011 в 14:43
поделиться