SubQueries vs INNER JOINs - Percy Reyes's Technical Blog

SubQueries vs INNER JOINs

Es muy conocido que en el proceso de trabajo con subconsultas, necesariamente manejaremos dos tipos de consultas: consultas internas y consultas externas. Las consultas internas no es más que las subconsultas propiamente dichas y la consultas externa es aquella que hace uso de los resultados devueltos por la consulta interna o subconsulta. En todo este rollo, también se harán uso del predicado IN.

Ejemplo: la consulta externa usa el predicado IN para operar con los valores devueltos por la subconsulta.

Por otra parte, cuando se presenta una subconsulta con la palabra clave EXISTS, funciona como una prueba de existencia. La cláusula WHERE de la consulta externa comprueba la existencia de las filas devueltas por la subconsulta. La subconsulta en realidad no produce ningún dato, devuelve el valor TRUE o FALSE.

En muchos casos puede usarse una operación de combinación en lugar de una consulta, no obstante algunas instancias pueden procesarse solo con una subconsulta. En algunos casos una operación de combinación puede producir un mejor rendimiento que una subconsulta, pero por lo general se observa muy poca diferencia en el rendimiento. Sin embargo, el uso de grandes anidamientos de subconsultas puede afectar seriamente el rendimiento. De manera general la utilización de combinaciones producirá los mejores resultados. Veámos un ejemplo:

 

Haciendo uso de una subconsulta podríamos realizar la siguiente consulta:

Formulando la anterior subconsulta como una combinación.

Haciendo uso de una subconsulta podríamos realizar la siguiente consulta:

Formulando la anterior subconsulta como una combinación.

Haciendo uso de una subconsulta podríamos realizar la siguiente consulta:

Formulando la anterior subconsulta como una combinación.

La subconsulta siempre está encerrada entre paréntesis y a menos que se vaya a ejecutar una subconsulta correlacionada termina antes de que se procese la consulta externa. Una subconsulta puede contener otra subconsulta, y esta subconsulta puede, a su vez, contener otra subconsulta, ... y así sucesivamente. Los recursos del sistema(como la memoria disponible) limitan el número de subconsultas que pueden procesarce. Se puede anidar subconsultas hasta 32 niveles, pero esto como le mencioné, depende de los recursos disponibles del sistema. Ejemplo:

Formulando la anterior subconsulta como una combinación:

Una subconsulta no está limitado para sentencias SELECT, tambíen se puede usar con instrucciones DELETE, UPDATE, INSERT.

INSERT

UPDATE

DELETE

Un subquery puede usarse de muchas maneras más, es bastante flexible, debes tener a la mano muchos criterios para saber cuando usarlo. Este artículo te ayudará a entender todo esto: ¿Cómo y cuándo usar subconsultas?

Otras formas de usar un subquery se explican en los siguientes artículos que os recomiendo leerlos:

Todo esto fue por esta vez, espero haber contribuido a aclarar este tema.

SaludosCool.

Published 3/10/2006 6:38 por Percy Reyes
Comparte este post:

Comentarios

Wednesday, October 4, 2006 10:43 AM por PabloNetrix

# re: SubQueries vs INNER JOINs

Buf... Ya tengo yo experiencia en estos temas... Para crear un maldito informe en Excel, he tenido que escribir una Query que ocupa (atención:) 28 KB!! de texto y en la cual hay CASEs y más CASEs, y además tres (o cuatro) niveles de anidamiento de subconsultas. Todo esto aparte de joins y tal. Un monstruo, vamos.

Todo el proceso tarda unos 45 minutos para el informe "sencillo" y 2 horas para el "detallado". Y no os creais que lo ejecuto en mi PC, no... esto corre en un servidor HP con 4GB de RAM y cuádruple núcleo. He de ejecutar el proceso los domingos porque de lo contrario hundiría la empresa :P

Por más que he intentado optimizarlo, he conseguido como mucho un 3 o 4% de ganancia. He mirado esos enlaces que has puesto pero no me cuentan nada nuevo. En fin... :)

Friday, February 16, 2007 11:43 PM por Sergio Tarrillo's Blog -> enhancements

# Usando subconsultas en SQL, para reducir la complejidad de nuestros queries

Siempre que tengamos consultas complejas, donde intervienen varias tablas y además hay varios filtros,...

Friday, February 16, 2007 11:43 PM por SergioTarrillo's RichWeblog

# Usando subconsultas en SQL, para reducir la complejidad de nuestros queries

Siempre que tengamos consultas complejas, donde intervienen varias tablas y además hay varios filtros,

Sunday, February 18, 2007 9:25 PM por Percy Reyes

# re: SubQueries vs INNER JOINs

Hola PabloNetrix !!!

A carambas !!!, vaya que sorpresa, un gusto de tenerte por aquí.

Claro, de hecho que el rendimiento depende de la complejidad de la consulta, pero vamos... para mejorar el rendimiento de ese tipo de querys se aconseja:

-Uso de indices, y evitar en la medida posible lo campos text (estos hacen lentas las consultas), gestionandolo lo mejor posible.

-Tener en cuenta todos los campos que forman un indice al momento de referenciarlo.

-usar la sintaxis: Nombre_DB.dbo.Nombre_Campo

-Evitar las consultas del tipo: SELECT * FROM ... esto es un pase a la muerte para cada consulta!!...

en fin, hay muchas cosas que se tienen que tener en cuenta para optimizar una consulta, teneis en cuenta el escenario, y especificar sólo aquellos campos que os deseais consultar, y no olvidar de analizar las consultas, ayudnadose de planes de ejecución, y desde luego... no olvidar de tunearlos!...

Esto puede ayudar: http://msdn2.microsoft.com/es-es/library/ms176005.aspx

un saludo!.

Percy Reyes.

Saturday, July 7, 2007 7:06 AM por Lugo Carranza

# re: SubQueries vs INNER JOINs

Es posible esto?? quisiera usar la variable Edad en el where, lo que no quiero es repetir "datediff(year,FecNac,getdate())" en el where, se puede??

SELECT  

Edad = datediff(year,FecNac,getdate())

FROM    DatosPersonales

WHERE   Edad between 18 and 32

Saturday, July 7, 2007 8:02 AM por Percy Reyes

# re: SubQueries vs INNER JOINs

Hola Hugo!

No exactamente!, puedes hacer lo siguiente(ya lo probé, funciona por si acaso):

SELECT  * FROM (

SELECT datediff(year,FecNac,getdate()) as [Edad]FROM DatosPersonales) [TABLETEMP]

WHERE [Edad] between 18 and 32

Saludos, espero te sirva.

Percy Reyes,

Saturday, July 7, 2007 6:08 PM por Lugo Carranza

# re: SubQueries vs INNER JOINs

Gracias por responder tan rapido, otra duda, la tabla temporal se libera despues de ejecutada la consulta? o tengo que elminarla de alguna forma?

Gracias

Saturday, July 7, 2007 6:52 PM por Percy Reyes

# re: SubQueries vs INNER JOINs

Hola!,

Las tablas temporales existirán hasta que no hayas reiniciado el motor de sql server. Si lo que deseas es que la tabla se elimine lo más rápido posible, te recomendaría que use variables del tipo table (estos se eliminan después de unos cuantos milisegundos de haberlos usado).

Nota: tanto tablas temporales, como variables del tipo table, se almacenan en la base de datos tempdb).

Saludos, espero te sirva.

Percy Reyes.

Saludos,

Sunday, March 15, 2009 6:34 PM por Fantasmita

# re: SubQueries vs INNER JOINs

Para  PabloNetrix:

Creo que lo que NECESITAS no es optimizar tus CONSULTAS, sino que lo que tú NECESITAS es una REINGENIERIA de tu base de datos para NORMALIZAR tus tablas (catálogos, tablas padres y tablas hijas) y así poder realizar RELACIONES integras entre ambas y así se puedan consultar, más facilmente, tus datos entre sí.

Saludos

Fantasmita

DBA

Tuesday, October 20, 2009 3:30 PM por Fernando

# re: SubQueries vs INNER JOINs

Gracias, buen aporte