El orden de ejecución de las queries en SQL

Una de las mayores preocupaciones a la hora de desarrollar un proyecto es la optimización del código. Queremos que nuestro desarrollo se ejecute rápidamente y sin ningún tipo de trabas y para ello, la optimización de lo que estamos programando debe ser clave. Cuando hablamos de la implementación de un proyecto tenemos dos partes bien diferenciadas. Por un lado está el código fuente en cualquier lenguaje de programación que es la base del proyecto y lo que influye en su comportamiento final y el otro es el código que se destina a la base de datos, donde se almacena el contenido del proyecto en sí. Es muy importante saber cómo mejorar el rendimiento de ambas partes para que nuestro proyecto sea fluido. La mayoría de los programadores enfocan la optimización de cara al código fuente, cuando es casi más importante hacerlo hacia las sentencias dirigidas a base de datos puesto que son estas las que nos devolverán el contenido que más tarde mostraremos y gestionaremos en nuestro proyecto.

En este artículo vamos a hablar sobre la optimización de consultas SQL y sobre todo, del orden en el que se ejecutan los comandos que la forman. Aunque parezca extraño no vamos a hablar sobre cómo ahorrar en código para que el proyecto sea más liviano, ni tampoco sobre cómo optimizar las sentencias en un lenguaje u otro. Hoy vamos a hablar sobre cómo mejorar las consultas a base de datos y para ello es muy importante comprender el orden de ejecución de cada uno de los comandos que la integran.

En la mayoría de los lenguajes de programación las sentencias se ejecutan from Top to Bottom, es decir, de arriba a abajo. Primero se ejecutarán las sentencias del código que se sitúen más arriba, después la siguiente, después la siguiente... así sucesivamente hasta que se determine el final del archivo o nosotros le dictaminemos el final a mano. Esta es uno de los aspectos básicos de la programación y que, creo que todos los programadores deberíamos tener asumido. Pero SQL Server ejecuta el conjunto de declaraciones en un orden lógico, lo que lo separa de la mayoría de los lenguajes de programación convencionales.

SQL Server es único en esto ya que ejecuta las declaraciones en un orden predefinido conocido como Logical Query Processing Phase y que os vamos a explicar a continuación.

Logical Query Processing Phase

Cuando escribes una serie de comandos dentro de una query sql, estos comandos se dividen mediante una fase de procesamiento lógico. Cada fase genera una serie de tablas virtuales que alimentan a la siguiente fase. Por supuesto, dichas tablas virtuales no son visibles por los administradores. Las fases y su orden de ejecución son las siguientes:

1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10 ORDER BY
11. TOP

Como puedes ver arriba, el comando FROM se ejecuta antes que ningún otro, incluso antes que el ON.

Vamos a explicar esto con un sencillo ejemplo que todos podáis entender. Vamos a coger como ejemplo una query que tenga un join y en el que veamos qué se ejecuta antes. Antes que nada, vamos a definir nuestras tablas: personas y provincias.

CREATE TABLE personas
(
id_persona int,
nombre varchar(255),
apellidos varchar(255),
poblacion varchar(255),
id_provincia int
);

CREATE TABLE provincias
(
id_provincia int,
nombre varchar(255)
);

Pues bien, una vez creadas las tablas, vamos con la query en cuestión...

SELECT per.dni, pro.id_provincia
FROM personas as per, provincias as pro
WHERE per.id_provincia = pro.provincia;

Esta consulta te arrojará un error, eso es más que seguro, pero ahí es donde esta el kit de la cuestión. Si ejecutas esta consulta después de crear las tablas en un gestor de base de datos, te mostrará un error indicándote que en el WHERE no existe ningún campo que se llame provincia en la tabla provincia. Si siguiéramos el orden lógico de los demás lenguajes de programación, lo normal es que el error te lo mostrase en el comando SELECT puesto que estamos llamando a un campo que tampoco existe y se ejecuta antes que el WHERE.

Esto, que es desconocido por muchos programadores, es muy útil para construir consultas sql óptimas que no provoquen carga en la máquina o servidor. Así que si alguna vez tienes dudas sobre qué comando se ejecuta primero o que orden tiene cada uno de los comandos, recuerda seguir el orden que propone el Logical Query Processing Phase. Esperamos que este artículo haya sido de tu agrado y sepas ponerlo en práctica en tus futuros proyectos.

Me viene a la mente una cosita, ya que hemos hablado sobre los gestores de base de datos. Sabemos que los programadores somos muy especialitos con los editores y que cada uno tenemos nuestro favorito así que, ¿cual es el gestor de base de datos que más sueles utilizar? Dínoslo en los comentarios...

 

 

 

 

 

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP