Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

rendimiento inner join y subconsultas

2,281 views
Skip to first unread message

Marcos Molero

unread,
Feb 11, 2009, 11:19:02 PM2/11/09
to
He escuchado el comentario de que es más eficiente realizar subconsultas
antes que realizar inner join. ejemplo:

SELECT * FROM alumnos INNER JOIN examen ON alumnos.id_alumno =
examen.id_alumno WHERE examen.nota > 5

ó:

SELECT * FROM alumnos WHERE id IN (
SELECT id_alumno FROM examen WHERE nota > 5
)

¿Cuál es más eficiente?

Carlos Sacristan

unread,
Feb 12, 2009, 2:28:01 AM2/12/09
to

Mira el plan de ejecución y los resultados que te arroja las estadísticas de
entrada/salida (o, mejor, los valores que te indica SQL Profiler sobre
lecturas, escrituras y cpu) y podrás ver tú mismo cuál es la opción más
eficiente


--
--
Un saludo
-------------------------------
www.navento.com
Servicios de Localización GPS

Maxi

unread,
Feb 12, 2009, 6:21:20 AM2/12/09
to
Hola, no hay una respuesta a eso porque depende de varios factores, siempre
pero siempre para saber si es mas o no eficiente deberia mirar el plan de
ejecucion arrojado por cada consulta.

Un truco, si usted corre ambas consultas al mismo tiempo pintando todo el
codigo en su management Studio, le mostrara por cada una cuanto es el total
del plan, si cada una son el 50% entonces quiere decir que son iguales :) si
hay una que es mayor a la otra quiere decir que es mas lenta

--

---------------------------------------------------------------------
Maxi Accotto
Microsoft MVP en SQL Server
Consultor en SQL Total Consulting
---------------------------------------------------------------------


"Marcos Molero" <Marcos...@discussions.microsoft.com> escribió en el
mensaje de noticias:025C96DC-F954-4239...@microsoft.com...

Jesús

unread,
Feb 12, 2009, 12:05:37 PM2/12/09
to
Esas dos consultas no son equivalentes. La primera consulta devuelve todas
las columnas de alumnos y todas las columnas de examen, mientras que la
segunda consulta sólo tiene las columnas de alumnos.

Si las consultas fueran las siguientes:


SELECT
alumnos.*


FROM
alumnos
INNER JOIN examen
ON alumnos.id_alumno = examen.id_alumno
WHERE
examen.nota > 5


SELECT alumnos.*


FROM
alumnos
WHERE
id IN (
SELECT id_alumno FROM examen WHERE nota > 5
)

Entonces sería equivalentes. En este caso en particular las consultas tienen
exáctamente el mismo plan de ejecución y son por tanto exáctamente igual de
eficientes.

Saludos:

Jesús López

"Marcos Molero" <Marcos...@discussions.microsoft.com> escribió en el
mensaje de noticias

news:025C96DC-F954-4239...@microsoft.com...

Jesús

unread,
Feb 12, 2009, 12:07:25 PM2/12/09
to
Esas dos consultas no son equivalentes. La primera consulta devuelve todas
las columnas de alumnos y todas las columnas de examen, mientras que la
segunda consulta sólo tiene las columnas de alumnos.

Si las consultas fueran las siguientes:


SELECT
alumnos.*


FROM
alumnos
INNER JOIN examen
ON alumnos.id_alumno = examen.id_alumno
WHERE
examen.nota > 5


SELECT alumnos.*


FROM
alumnos
WHERE
id IN (
SELECT id_alumno FROM examen WHERE nota > 5
)

Entonces sería equivalentes. En este caso en particular las consultas tienen


exáctamente el mismo plan de ejecución y son por tanto exáctamente igual de
eficientes.

Saludos:

Jesús López

"Marcos Molero" <Marcos...@discussions.microsoft.com> escribió en el
mensaje de noticias
news:025C96DC-F954-4239...@microsoft.com...

0 new messages