У меня есть таблица с самосоединением. Вы можете думать о структуре как о стандартной таблице для представления организационной иерархии. Например, таблица: -
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 - это первичный ключ в таблице.
Заранее спасибо :)