Hemos visto cómo la forma en que se solicitan los datos XML en documentos grandes influye considerablemente, desde no acabar nunca, a tardar segundos. Sin embargo, nos puede parecer que nos dejaríamos una optimación en el tintero: los índices XML.

Índice XML primario

Microsoft es bastante concreto en cuándo utilizar índices sobre campos XML y una de las situaciones donde no lo recomienda es cuando no se hacen muchas consultas sobre el campo XML. Vamos a ver esto.

Creamos una tabla temporal y añadimos sólo uno de los planes en caché grandes:

El tamaño de los datos son 18,4 MB y hemos tardado unos 9 s en cargar la tabla. Veamos qué pasa con el índice primario:

El tamaño del índice son 96,7 MB –es decir, cinco veces el tamaño de los datos– y se ha tardado en crear unos 20 s. Podemos apreciar el primer y principal problema de este tipo de índices: su tamaño.

Pero, ¿merece la pena? Para averiguarlo vamos a ejecutar la consulta optimada del artículo anterior con y sin los índices:

Pasamos de tardar 3 s –con índice– a 10 s –sin índice–, por lo que no compensa, porque se tarda la mitad en ejecutar la consulta que en crear el índice. Por esto nos dice Microsoft que creemos los índices cuando se consulten los campos XML repetidas veces. En nuestro caso en que queremos analizar documentos grandes, el crear el índice no ha supuesto una mejora. Sin embargo, si se consultase este documento en repetidas ocasiones, sí nos merecería la pena al tener un rendimiento 3x.

Índices secundarios

¿Nos ayudará alguno de los índices secundarios? La verdad es que no porque la consulta que estamos haciendo se resuelve perfectamente con el índice primario como podemos observar si examinamos el plan (muestro una parte nada más) donde todos los nodos iniciales se resuelven consultando el índice primario:

Es más, si creamos los índices secundarios para ver si los emplea y qué pasa:

Veremos en el plan que usa los índices primario y propiedad:

Cada índice secundario no es tan grande como el primario, en este caso son de 76,9 MB cada uno de los tres, pero en vez de acelerar la consulta, la hacen más lenta. Por lo tanto, como también nos dice Microsoft, tienen unos usos muy específicos.

Índices filtrados

Para solucionar el tamaño de los índices, Microsoft creó los índices filtrados. Por ejemplo, podríamos crear el siguiente para resolver nuestra consulta:

Podríamos pensar que este índice no está completo, pero la realidad es que hay de sobra. Porque en los consejos que nos da la documentación de SQL Server no he visto que refiera este caso donde tenemos una lista en nodes() y en este caso sólo utiliza el índice filtrado para los dos CROSS JOIN nodes(), pero no para buscar los valores:

Si en vez de una lista empleáramos una única ruta, sí serviría el índice filtrado que además ocupa en este caso un setentavo y que tarda en crearse menos de la tercera parte. Por lo tanto, los índices filtrados son un gran salto en cuanto a espacio, pero no resuelven todos los casos. Además fijémonos que mientras en nuestra consulta Tipo Instrucción es un varchar(20), en la definición del índice hubo que subirlo a varchar(40) para que no diese error por truncado de datos.

CONCLUSIÓN

Hemos podido ver que en el caso que estamos viendo de análisis o carga de documentos XML grandes, el usar índices no nos aporta una ventaja por ser costosa su creación. Los índices XML filtrados ocupan mucho menos espacio y tardan menos en crearse, pero en el contexto específico que nos hemos propuesto analizar, ayudan poco.

Más Información

Desde Danysoft y si rellenas este formulario, te ayudaremos a facilitarte la información que necesitas.

This contact form is deactivated because you refused to accept Google reCaptcha service which is necessary to validate any messages sent by the form.
0 comentarios

Dejar un comentario

¿Quieres unirte a la conversación?
¡Siéntete libre de contribuir!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *