Optimización de Consultas SQL parte II
Continuando con el post iniciado por mi compañero Lucas Forchino enunciaré algunos tips a tener en cuenta a la hora de generar la sentencia SQL de manera que el motor de BD la ejecute más eficientemente.
Comenzaremos con tres puntos en particular a tener en cuenta y entender porqué mejoran tanto nuestras sentencias SQL.
- EMPAREJAMIENTOS EN WHERE VS. EMPAREJAMIENTOS EN EL FROM
- ORDEN DE PROCESAMIENTO DE UNA CONSULTA MULTITABLA
- COMPOSICIONES EXTERNAS (EN EL WHERE Y EN EL FROM)
- QUERY PERFORMANCE
COMPOSICIONES EN EL WHERE VS. COMPOSICIONES EN EL FROM
Debido al orden de procesamiento de una consulta multitabla el motor de BD se ve beneficiado si las composiciones son realizadas en el FROM a través de INNER JOIN o alguna de sus variantes (LEFT OUTER JOIN, RIGHT OUTER JOIN). Esto se debe a que el motor al procesar una consulta SQL lo hace en este orden:
- Realiza el producto cartesiano de las tablas en el FROM
- Si existe cláusula WHERE aplica la condición de búsqueda
- Para las filas restantes calcula el valor de cada elemento en la lista del SELECT
- Si existe un SELECT DISTINCT elimina las filas duplicadas
- Si existe un ORDER BY ordena el resultado
Al ser el primer paso el producto cartesiano de las tablas que se encuentran listadas en el FROM, dependiendo del número de columnas de cada tabla y la cantidad de registros en cada una de ellas, se genera un resultado que puede llevarle demasiado tiempo al motor de BD, y luego tiene que aplicar la condición existente en la cláusula WHERE para reducir el número de registros resultante del producto cartesiano. Si nosotros realizamos la composición directamente en el FROM evitamos utilizar la cláusula WHERE para dicho propósito haciendo mucho más eficiente la consulta, ya que al momento de realizar el producto cartesiano estamos diciéndole al motor qué registros queremos de ese producto. La sintaxis sería la siguiente:
SELECT F.numFactura,C. CliNom, F.Monto
FROM Factura F INNER JOIN Cliente C ON F.codcli=C.codcli
Como vemos no necesitamos la cláusula WHERE para realizar el emparejamiento de las tablas, si sería necesaria la cláusula WHERE si quisiéramos filtrar los resultados de dicha consulta por fecha o monto por ejemplo. Si nuestra composición entre tablas requiere más de un campo y más de dos tablas la sintaxis sería la siguiente:
SELECT F.numFactura, C.cliNom, F.Monto, V.venNom
FROM Factura F INNER JOIN Cliente C ON F.tipoDoc=C.tipoDoc AND F.numDoc=C.numDoc INNER JOIN Vendedor ON F.codVen=V.codVen
COMPOSICIONES EXTERNAS
Al realizar composiciones internas o INNER JOIN entre dos tablas, los registros que no se correspondan en ambas tablas son eliminados de la lista de resultados, si yo no deseo que se eliminen los registros de una o ambas tablas aunque queden desemparejados debo realizar composiciones externas. Por ejemplo:
Existen registros en la tabla TMARCAS que no se encuentran en la tabla TCOCHES, si yo realizo una composición interna esas marcas no formarían parte de mi conjunto de resultados. Al realizar una composición externa podría recuperar todo el conjunto de resultados, las composiciones externas dependen del orden en el que se listen las tablas:
SELECT TC.Coche, TM.marca
FROM TCOCHES TC RIGHT OUTER JOIN TMARCAS TM ON TC.marca=TM.codigo
QUERY PERFORMANCE
Buenas prácticas para mejorar nuestras consultas SQL
- Realizar las composiciones en el FROM
- Tener en cuenta el orden en el que enunciamos las tablas en el FROM
- Uso de funciones de T-SQL
- Evitar el uso de SELECT *
- Evitar el SELECT DISTINCT y el ORDER BY
Estas fueron unas breves recomendaciones a tener en cuenta a la hora de generar nuestras sentencias SQL, más adelante seguiremos con este tema, por ejemplo el uso de subconsultas, consultas en el FROM, uso de IF y CASE para condiciones, etc. las cuales son fundamentales a la hora de realizar nuestros procesos ETL.

Junio 27, 2007 at 8:06 pm
Muy bueno el articulo.
Como hiciera para conseguir la parte I y el resto de articulos que han escrito.
Gracias.
Roberto
Costa Rica
Junio 28, 2007 at 12:34 am
http://mundobi.wordpress.com/2007/06/03/optimizacion-de-consultas-sql/
Saludos