Tengo una tabla con auto unión. Puede pensar en la estructura como una tabla estándar para representar la jerarquía organizacional. Ej tabla: -Optimización de CTE para consultas recursivas
MemberId
MemberName
RelatedMemberId
Esta tabla consiste en 50000 registros de muestras. Escribí una consulta recursiva CTE y funciona absolutamente bien. Sin embargo, el tiempo que lleva procesar solo 50000 registros es de alrededor de 3 minutos en mi máquina (4GB Ram, 2.4 Ghz Core2Duo, 7200 RPM HDD).
¿Cómo puedo posiblemente mejorar el rendimiento porque 50000 no es un número tan grande? Con el tiempo, seguirá aumentando. Esta es la consulta que es exactamente lo que tengo en mi Procedimiento almacenado. El propósito de la consulta es seleccionar todos los miembros que pertenecen a un miembro específico. P.ej. Debajo de Propietario de la compañía viene cada persona. Para el administrador, excepto el propietario, se devuelven todos los registros. Espero que entiendas el propósito de la consulta.
ANSI_NULLS SET en GO QUOTED SET EN 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
Como se puede ver a mejorar el rendimiento, incluso he hecho las uniones en el último paso durante la selección de registros para que todos los registros innecesarios hacen no se inserta en la tabla de temp. Si hice uniones en mi paso base y en el paso recursivo de CTE (en lugar de Seleccionar en el último paso) ¡la consulta tarda 20 minutos en ejecutarse!
MemberId es la clave principal de la tabla.
Gracias de antemano :)