Published on

May 13, 2019

12 Técnicas para Mejorar el Rendimiento de Consultas en SQL Server

Como desarrollador de SQL Server o administrador de bases de datos, es posible que a menudo te encuentres en situaciones en las que modificar índices o cambiar la configuración del servidor no es una opción para mejorar el rendimiento de las consultas. En tales casos, reescribir las consultas mismas puede ser una solución viable. En esta publicación del blog, exploraremos 12 técnicas que puedes utilizar para refactorizar tus consultas y mejorar su rendimiento.

1. Funciones de ventana vs GROUP BY

Las funciones de ventana son una característica poderosa en SQL Server, pero a veces pueden consumir muchos recursos. Si encuentras que las funciones de ventana están causando problemas de rendimiento, considera reescribirlas utilizando la sintaxis tradicional de GROUP BY. Esto a menudo puede llevar a un mejor rendimiento.

2. Subconsultas correlacionadas vs tablas derivadas

Las subconsultas correlacionadas son fáciles de entender, pero no siempre son la opción más eficiente. Considera reescribir las subconsultas correlacionadas como consultas de tablas derivadas, que suelen ser más basadas en conjuntos y pueden resultar en un mejor rendimiento.

3. IN vs UNION ALL

Cuando filtras filas de datos en múltiples valores, utilizar el operador IN no siempre es el enfoque más eficiente. En su lugar, considera escribir tu lógica como múltiples declaraciones unidas con UNION ALL. Esto a veces puede generar planes de ejecución más eficientes, especialmente para tablas con distribuciones sesgadas e índices no cubiertos.

4. Tablas temporales de almacenamiento

En consultas complejas, el optimizador de consultas puede tener dificultades para generar un plan de ejecución eficiente. Dividir una consulta compleja en múltiples pasos que utilizan tablas temporales de almacenamiento puede proporcionar a SQL Server más información sobre tus datos, lo que lleva a mejores planes de ejecución. Además, escribir consultas más simples también puede ayudar al optimizador a generar planes más eficientes y reutilizar conjuntos de resultados más fácilmente.

5. Forzar el orden de unión de tablas

Estadísticas desactualizadas e información insuficiente a veces pueden hacer que el optimizador de consultas de SQL Server una las tablas en una secuencia subóptima. Considera utilizar técnicas, como las descritas por Adam Machanic, para forzar el orden de unión de tablas deseado sin recurrir a sugerencias de unión.

6. DISTINCT con pocos valores únicos

Utilizar el operador DISTINCT no siempre es la forma más rápida de devolver valores únicos en un conjunto de datos. En ciertos casos, las expresiones de tabla comunes recursivas (CTEs) se pueden utilizar para devolver valores distintos en conjuntos de datos grandes con relativamente pocos valores únicos. Esta solución creativa, como se demuestra por Paul White, puede mejorar el rendimiento en tales escenarios.

7. Eliminar UDFs

Las funciones definidas por el usuario (UDFs) a veces pueden causar un mal rendimiento de la consulta debido a la generación de planes en serie y estimaciones inexactas. Considera incluir la lógica de la UDF directamente en la consulta principal para mejorar potencialmente el rendimiento. Con SQL Server 2019, esta inclusión puede ocurrir automáticamente en muchos casos, pero la inclusión manual aún puede ser necesaria para un rendimiento óptimo, como destaca Brent Ozar.

8. Crear UDFs

En casos en los que un servidor mal configurado paraleliza las consultas con demasiada frecuencia, el rendimiento puede verse afectado. En tales situaciones, colocar la lógica problemática de la consulta en una función escalar o de tabla con múltiples declaraciones puede forzar que esa parte del plan se ejecute en serie. Si bien no es una mejor práctica, esta técnica se puede utilizar para forzar planes en serie cuando no es posible cambiar el umbral de costo para la paralelización.

9. Compresión de datos

La compresión de datos no solo ahorra espacio, sino que también puede mejorar el rendimiento en ciertas cargas de trabajo. Los datos comprimidos requieren menos páginas de disco, lo que resulta en una velocidad de lectura mejorada. Además, los datos comprimidos permiten a SQL Server almacenar más datos en su búfer de memoria, aumentando el potencial para reutilizar datos que ya están en memoria.

10. Vistas indexadas

Cuando no es posible agregar nuevos índices a tablas existentes, considera crear vistas en esas tablas e indexar las vistas en su lugar. Este enfoque puede ser particularmente útil para bases de datos de proveedores donde no se permite modificar objetos existentes.

11. Cambiar estimadores de cardinalidad

El nuevo estimador de cardinalidad introducido en SQL Server 2014 generalmente mejora el rendimiento de las consultas. Sin embargo, en algunos casos específicos, puede llevar a un rendimiento más lento. En tales situaciones, se puede utilizar una sugerencia de consulta simple para cambiar de nuevo al estimador de cardinalidad heredado, lo que resulta en un mejor rendimiento.

12. Copiar los datos

Si todo lo demás falla y reescribir la consulta no produce la mejora de rendimiento deseada, considera copiar los datos que necesitas en una nueva tabla. En esta nueva tabla, puedes crear índices y realizar las transformaciones necesarias de antemano, lo que potencialmente mejora el rendimiento de la consulta.

Estas 12 técnicas son solo un punto de partida, y hay muchas más formas de reescribir consultas para la optimización del rendimiento. La clave es comprender el comportamiento del optimizador de consultas y las opciones disponibles para mejorar el rendimiento. Al pensar de manera creativa y aplicar las técnicas adecuadas, puedes mejorar significativamente el rendimiento de tus consultas de SQL Server.

Click to rate this post!
[Total: 1 Average: 5]

Let's work together

Send us a message or book free introductory meeting with us using button below.