Estoy ejecutando una consulta que procesa algunos nodos de un documento XML. Mi costo estimado de subárbol es de millones y parece que todo proviene de una operación de clasificación que el servidor sql está realizando en algunos datos que extraigo de columnas xml a través de XPath. La operación Ordenar tiene un número estimado de filas de alrededor de 19 millones, mientras que el recuento de filas real es de aproximadamente 800. La consulta en sí se ejecuta razonablemente bien (1 a 2 segundos), pero la discrepancia me hace preguntarme sobre el rendimiento de la consulta y por qué esto la diferencia es tan grande?
sql-server
query-performance
xml
Peter Smith
fuente
fuente
Respuestas:
No hay estadísticas generadas en columnas XML. Las estimaciones se adivinan en función de las expresiones utilizadas al consultar el XML.
Usando esta tabla:
Y esta consulta XML bastante simple:
Le dará una fila devuelta pero las filas estimadas devueltas son 200. Será 200 independientemente de qué XML o cuánto XML ingrese en la columna XML para esa fila.
Este es el plan de consulta con el recuento de filas estimado que se muestra.
Una forma de mejorar, o al menos cambiar, las estimaciones es proporcionar al optimizador de consultas más información sobre el XML. En este caso, porque sé que
root
realmente es un nodo raíz en el XML, puedo reescribir la consulta de esta manera.Eso me dará una estimación de 5 filas devueltas.
La reescritura de la consulta probablemente no acelerará la destrucción del XML, pero si las estimaciones son mejores, es probable que el optimizador de consultas pueda tomar decisiones más inteligentes para el resto de la consulta.
No he encontrado ninguna documentación sobre cuáles son las reglas para las estimaciones que no sea una presentación de Michael Rys donde dice:
fuente