¿Cuáles son los consejos y trucos más útiles de SQL?

Aquí hay un par (principalmente de MySQL, pero probablemente funciona de manera similar en otros):

Usando LIMIT como filtro …

Suponga que tiene una tabla Really Big con un montón de combinaciones de búsqueda y desea las (primeras, medias o) últimas filas M en una de sus columnas. Las combinaciones de búsqueda no son para filtrar la tabla en sí, sino para buscar valores en otras tablas, probablemente para mostrar. Entonces, tienes algo como

seleccione
de bigtable b, join_tab_1 j1, join_tab_2 j2, join_tab_3 j3, …, join_tab_N jN
donde b.val1 = j1.val1 y b.val2 = j2.val2 … y b.valN = jN.valN
ORDENAR POR b.order_col
LÍMITE M;

Esta será una consulta realmente retorcida y lenta, porque las uniones se ejecutan en toda la tabla y se proyectan antes de que ORDER BY y LIMIT puedan suceder. Además, la mayoría de los optimizadores de consultas no son lo suficientemente inteligentes como para usar un índice (si existe) en ORDER BY en order_col si hay uniones “delante de él”, por lo que no se utilizará una clasificación pasiva en un índice.

Una forma de dar lo que equivale a una sugerencia de optimizador de facto y hacer que esta consulta sea mucho más rápida es hacer algo como

seleccione
from (seleccione , b.order_col
de bigtable ORDER BY order_col LIMIT M) b,
join_tab_1 j1, join_tab_2 j2,…, join_tab_N jN
donde b.val1 = j1.val1 y b.val2 = j2.val2 … y b.valN = jN.valN
ORDER BY b.order_col;

Lo que esto hace es que obliga a las uniones a ejecutarse solo en las M filas que le interesan en comparación con toda la tabla. Además, si hay un índice en order_col, el límite de subconsulta puede usarlo, lo que significa que la ordenación “activa” solo ocurre en las filas M que le interesan (nota: todavía necesita el ORDER BY “externo” para garantizar el orden correcto). Incluso si no se puede usar una clasificación pasiva, la segunda consulta pateará el extremo de la primera consulta debido a la reducción de las búsquedas de unión, pero si se puede usar una clasificación pasiva, podría tener una consulta que se ejecute en milisegundos en lugar de horas.

Y en cuanto a MySQL específico (aunque varias otras bases de datos tienen operaciones similares):

GROUP_CONCAT para “aplanar” se une en columnas:

El poder de GROUP_CONCAT de MySQL

Estos dos me parecen muy útiles, en PostgreSQL:

  • Las expresiones de tabla comunes (CTE), también conocidas como “consultas WITH” (CON consultas (expresiones de tabla comunes)) permiten estructurar un flujo de datos complejo de arriba hacia abajo, comenzando con la recopilación de parámetros inicial como el primer CTE, seguido de tantos SELECT como sea necesario para comprender la transformación de datos deseada, sin tener que definir tablas temporales intermedias, ni subconsultas complejas y profundamente anidadas.
  • Las funciones de ventana (Documentación: 9.3: Funciones de ventana) permiten ejecutar totales, referencias a valores anteriores y posteriores en filas contiguas, generación de un número de índice de fila, todo sin GROUP BY

Ediciones: Ortografía

Además de las dos respuestas anteriores con las que estoy totalmente de acuerdo, también debe aprender a leer el plan de consulta y / o el plan de ejecución. No son tan difíciles de entender ya que los planes se redactan esencialmente como un orden de secuencias lógicas.

Otra cosa a saber sería el tipo disponible de estructuras de tabla, índices, etc. Si está disponible, también los diferentes tipos de motores de almacenamiento como en MySQL.

Algo más básico serían los diferentes tipos de uniones, externo, interno, semi, anti, etc.

Ah, por último, tanto como sea posible, use ansi sql, ya que sería similar cuando recorra diferentes bases de datos SQL.

Oye,

Estoy trabajando como consultor técnico en tecnologías Oracle. Puedes encontrar a continuación los consejos y trucos de SQL

25 consejos y trucos útiles de SQL que debes saber – Parte 1

25 consejos y trucos útiles de SQL que debes saber – Parte 2

Esta es la parte 1 de la serie de 4 partes. Puede leerlo y comentarlo si lo desea.

También puedes suscribirte al blog si te gusta leer otras publicaciones.

Gracias