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:

join_00011.jpg

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.

Explore posts in the same categories: Técnico

2 Comments on “Optimización de Consultas SQL parte II”

  1. Roberto Says:

    Muy bueno el articulo.
    Como hiciera para conseguir la parte I y el resto de articulos que han escrito.

    Gracias.
    Roberto
    Costa Rica


Comment: