rendimiento inner join y subconsultas

12/02/2009 - 05:19 por Marcos Molero | Informe spam
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?

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
12/02/2009 - 08:28 | Informe spam
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


"Marcos Molero" wrote:

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?
Respuesta Responder a este mensaje
#2 Maxi
12/02/2009 - 12:21 | Informe spam
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" escribió en el
mensaje de noticias:
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?
Respuesta Responder a este mensaje
#3 Jesús
12/02/2009 - 18:05 | Informe spam
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" escribió en el
mensaje de noticias
news:
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?
Respuesta Responder a este mensaje
#4 Jesús
12/02/2009 - 18:07 | Informe spam
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" escribió en el
mensaje de noticias
news:
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?
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida