La adopción de buenas prácticas de escritura de consultas y sintaxis SQL mejorará la eficacia de la supervisión de la base de datos y, como resultado, mejorará el rendimiento general de la base de datos. Hay varias formas comprobadas de mejorar el rendimiento de la base de datos a través de ajustes de consulta y sintaxis. Elegimos 5 para enfocarnos.
1. Expresiones CASE
Estas son algunas de las mejores prácticas para obtener el mejor rendimiento de las expresiones CASE:
- Las expresiones CASE mejoran el rendimiento al mover código de procedimiento antiguo a código declarativo que luego se puede optimizar. Para expresiones CASE básicas, utilice
, que es el más fácil de optimizar. Para expresiones CASE extendidas, el hashing y otras técnicas serán las más útiles. - Debido a que CUANDO las cláusulas se prueban de izquierda a derecha, es mejor organizar las cláusulas de modo que las más probables se enumeren primero. Esto reducirá el tiempo dedicado a escaneos innecesarios.
- La mayoría de los optimizadores también eliminan las pruebas redundantes considerando el orden de ejecución. Tan pronto como se ejecuta una cláusula WHEN, no hay necesidad de probar esa cláusula nuevamente. Sin embargo, muchos optimizadores no son buenos para leer expresiones CASE anidadas, por lo que es mejor reducirlas a un solo nivel.
2. Doble inmersión y la cláusula de ventana
En SQL, "doble inmersión" significa visitar la misma tabla más de una vez, lo que ralentiza mucho la consulta. Idealmente, intente hacer todos sus trabajos en una sola visita a la mesa. Pero si eso no es posible, existen algunas formas de mitigar el impacto en el rendimiento.
El uso de tablas temporales creadas a partir de la misma tabla base unidas realmente no es la mejor manera de evitar la doble inmersión. Una mejor solución es usar el optimizador de su motor SQL para mostrar VISTAS y compartir los resultados como una tabla de trabajo.
Si está limitado a un optimizador menos que estelar, use tablas temporales y haga el trabajo manualmente.
Aunque los métodos anteriores son perfectamente aceptables, la mejor manera de evitar la doble inmersión es usar la cláusula de ventana porque las subcláusulas funcionan de manera similar a las funciones de subconsulta. Por ejemplo:
- La cláusula PARTITION BY es como un GROUP BY local que divide la tabla en grupos.
- La cláusula ORDER BY impone un orden ordenado.
- El marco de la ventana (ROW o RANGE) es como una cláusula WHERE local.
Puede optimizar las funciones de la ventana siguiendo estas reglas:
- En el índice, ordene primero las columnas de la cláusula PARTITION BY, luego las columnas utilizadas en la cláusula ORDER BY.
- Incluya cualquier otra columna a la que se haga referencia en la consulta como columnas incluidas del índice.
3. Usar procedimientos almacenados
Los mapeadores relacionales de objetos (ORM) causan numerosos problemas de rendimiento cuando generan su propio código. Si tiene que usar ORM, escriba sus propios procedimientos almacenados para que el rendimiento no se vea afectado.
Hay muchas formas en que el uso de procedimientos almacenados mejora el rendimiento, que incluyen:
- Transmiten menos datos a través de la red, por lo que las transacciones son más rápidas
- Habilitan llamadas más cortas
- Los procedimientos almacenados son más fáciles de rastrear en las herramientas de perfil
- Debido a que un procedimiento almacenado es un objeto real en su base de datos, es más fácil obtener estadísticas de rendimiento, lo que facilita la búsqueda de problemas de rendimiento
- Aumenta la reutilización del plan de ejecución
- Facilitan el manejo de casos extremos y agregan auditoría o comportamiento de bloqueo de cambios.
- Los procedimientos almacenados no son vulnerables a los ataques de inyecciones SQL
4. ELIMINAR y ACTUALIZAR en lotes
Eliminar o actualizar una gran cantidad de datos de un escaneo de tabla grande utiliza muchos recursos porque ambas declaraciones se ejecutan como una sola transacción. Esto es un factor decisivo en el rendimiento porque si se produce un error mientras se ejecuta la transacción y necesita detenerla, el sistema tiene que revertir toda la transacción. Revertir grandes cantidades de datos consume mucho tiempo y bloquea otras transacciones.
Puede evitar este problema de rendimiento realizando actualizaciones y eliminaciones en lotes pequeños. Cuando ejecuta estas transacciones en lotes, si la transacción se cancela, la reversión es mucho menor. Revertir una pequeña cantidad de datos no lleva mucho tiempo y otras transacciones pueden funcionar mientras el lote se confirma en el disco.
5. No recupere más columnas de las que necesita
Una de las principales causas del bajo rendimiento de las consultas es la recuperación de columnas extrañas. Evite las prácticas que comúnmente dan como resultado la devolución de un número excesivo de columnas. Tenga en cuenta lo siguiente:
- El uso innecesario de "SELECCIONAR *" en una consulta probablemente generará más columnas de las que necesita. Esto es una pérdida de recursos y bloquea los recursos de otros usuarios. Es especialmente importante no utilizar indiscriminadamente "SELECT *" en bases de datos SQL en columnas.
- Cortar y pegar para reutilizar el código puede generar columnas superfluas.
- Cuando invoca una VISTA, puede terminar con columnas anidadas. Quite el anidamiento de las consultas con un rendimiento deficiente para verificar qué columnas hay y deshágase de las columnas de gran tamaño que no necesita. Una buena indicación de que tiene un problema es que tiene una cláusula WHERE con condiciones adicionales y una cláusula FROM con uniones externas adicionales.
Estas son solo algunas de las formas en que adoptar un enfoque concienzudo de la sintaxis SQL y la escritura de consultas puede mejorar la supervisión de la base de datos. No tengas miedo de probar algunos otros. Una base de datos de alto rendimiento es clave para cumplir los objetivos comerciales de todas las organizaciones.