Estoy tratando de implementar hierarchyID en una tabla (dbo. [Message]) que contiene aproximadamente 50,000 filas (crecerá sustancialmente en el futuro). Sin embargo, se necesitan entre 30 y 40 segundos para recuperar unos 25 resultados.Pregunta sobre el rendimiento en profundidad de HierarchyID de SQL Server
El nodo raíz es un relleno para proporcionar unicidad, por lo tanto, cada fila posterior es un elemento secundario de esa fila ficticia.
Necesito poder recorrer la profundidad de la tabla primero y he hecho que la columna hierarchyID (dbo. [Message] .MessageID) la clave principal del clúster, también haya agregado una smallint calculada (dbo. [Message] .Hierarchy) que almacena el nivel del nodo.
Uso: Una aplicación .Net pasa a través de un valor de hierarchyID en la base de datos y quiero poder recuperar todos (si los hay) hijos Y padres de ese nodo (además de la raíz, ya que es rellenador).
Una versión simplificada de la consulta que estoy utilizando:
@MessageID hierarchyID /* passed in from application */
SELECT
m.MessageID, m.MessageComment
FROM
dbo.[Message] as m
WHERE
m.Messageid.IsDescendantOf(@MessageID.GetAncestor((@MessageID.GetLevel()-1))) = 1
ORDER BY
m.MessageID
Por lo que entiendo, el índice debe ser detectada automáticamente sin una pizca.
Desde la búsqueda de foros, he visto personas que utilizan consejos de índice cuando se trata de índices amplios, pero no han observado esta aplicación en situaciones de profundidad. ¿Sería ese un enfoque relevante para mi escenario?
He pasado los últimos días tratando de encontrar una solución para este problema, pero fue en vano. Agradecería cualquier ayuda, y como esta es mi primera publicación, me disculpo por adelantado si esto se considera una pregunta 'noobish', he leído la documentación de MS y buscado en innumerables foros, pero no he encontrado una descripción sucinta del problema específico.
Por cierto, la consulta que tiene? Tal como está escrito, siempre va a seleccionar TODOS los nodos en toda la tabla. El '@ MessageID.GetAncestor (@ MessageID.GetLevel() - 1)' lleva todo el camino hasta la raíz, y luego selecciona todo lo que es un descendiente, que es ... todo. Por eso es tan lento. – Aaronaught
Solo para aclarar: mi situación requiere el uso de la indexación de profundidad en primer lugar, perdón por la confusión (me refiero a la amplitud primero al final simplemente para proporcionar un ejemplo de donde las personas han sugerido usar consejos de índice) – ObjectiveCat