Buscar este blog

miércoles, 3 de marzo de 2021

Orden Lógico de Procesamiento de Queries

Estimados colegas y amigos, estoy una vez más en contacto con ustedes...

Esta vez para tratar de echar luz sobre un tema que, habida cuenta de la cantidad de consultas a mi correo que ha generado,  entiendo que bien merece que le dediquemos un posteo. 

Se trata del orden lógico en el que el SQL Server procesa nuestras queries independientemente de la forma en la que las mismas deben ser escritas por sintaxis.

En efecto, en el siguiente ejemplo veremos una query con el orden normal en el que debe ser escrita y, en entre paréntesis, el orden en que realmente es procesada lógicamente por el SQL Server:

SELECT (5) / DISTINCT (5.2) /  TOP (7)

FIELDS (5.1)

FROM     (1)

WHERE    (2)

GROUP BY (3)

HAVING   (4)

ORDER BY (6)

 Y la pregunta cae de madura. Por qué lógicamente al procesar la query  el motor no sigue el mismo orden que exige la sintaxis? .

 La respuesta es sencilla…; Porque el SQL imita la forma en la que serían dadas las instrucciones para obtener algo para definir el orden de las sintaxis.

Ejemplo...

Supongamos que queremos solicitarle a un familiar que nos alcance unos libros del cuarto.

Estas serían las instrucciones que le daríamos  y su orden.. 

“Traéme (Select), estos  libros (Fields) desde mi cuarto (From) cuyo autor sea Borges (Where) y haslo Ordenados por Título (Order By)” - orden de solicitud-

Pero en verdad nuestro interlocutor tendría que, (en el sgte orden):

“Ir al cuarto (From), separar sólo los libros de Borges (Where), tomar dichos libros  (Select) y traer los libros ordenados por Título (Order By)” -orden lógico real de las acciones -

Así pues debemos tener en claro que el sql server tiene el siguiente orden lógico para ejecutar una query. 

El tenerlo en cuenta es vital para poder escribir una query performante.

Veamos:

1) FROM (joins)
2) WHERE 
3) GROUP BY 
4) HAVING 
5) SELECT
    5.1 SELECT fields
    5.2 DISTINCT
6) ORDER BY 

7) TOP 

Para terminar de desarrollar el tema veamos un ejemplo de cómo  un desconocimiento del orden lógico de ejeución de queries puede llevarnos a tomar decisiones incorrectas.
Supongamos que tenemos una tabla "Clientes" con 10 millones de registros, y, nos solicitan el armar una consulta para listar aquellos 10 clientes que posean el mayor saldo en su haber.
Si no supieramos lo aprendido en relación al orden lógico de ejeución de las queries tal vez nuestro razonamiento podría ser.

“Ok..la query es fácil entonces… ni me hago problema por los filtros del where ni por ser preciso con los campos a seleccionar... Yo hago un Select top 10 * from la tabla ordenado descendente y listo, si total sólo voy a trabajar con 10 registros

Les parece correcto el  razonamiento? A muchos tal vez si verdad?

La query que harían sería esta?


Select top 10 *

From Clientes

order by saldo desc

La respuesta no es correcta dado que , como hemos aprendido, por orden lógico de ejecución de queries, no estaremos seleccionando sólo 10 registros sino que se estarán seleccionando 10 millones de registros, (no hay where en la query), y luego, recién luego, se estarán listando los 10 registros originalmente solicitados...
Ya saben entonces.. a tener muy en cuenta el orden lógico de procesamiento de las queries =)
Amigos es todo por ahora les dejo mis saludos desde Argentina y quedo a vuestra disposición como siempre.