duda de performance con inner join

Koji Nanjo

Sushiman
Se incorporó
21 Marzo 2006
Mensajes
1.725
Estimados

¿Que estiman a nivel de performance sea mejor? inner join o subqueries?
tengo una query super básica y la puedo resolver de ambas formas pero quiero hacerlo de la "manera correcta" y en lo personal me considero un pelele en todo ámbito de base de datos.
Estuve leyendo por la interneC y decían que es mà' rápido inner join
 

Cosme

Gold Member
Se incorporó
27 Febrero 2005
Mensajes
8.281
Depende del volumen de datos de la tabla "madre". Si la tabla madre hace consultas especificas de 1 campo a tablas hijas, y la tabla madre tiene pocas filas, supongo que una subquery será mas eficiente, en especial si no hay una relación directa declarada.

Bajo Sqlsrv hay una opcion de analisis de costo de la consulta, que puede ayudarte a comparar.

Ahora, si vas a traer muchos datos de ambas tablas, será mejor un join, en especial si ambas tablas tienen el campo filtro indexado y una relacion declarada.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
En general es más rápida por Inner Join. Hay todo un análisis de cantidad de registros, cardinalidades y otras patadas voladoras varias, pero conceptualmente es más eficiente un join que una subquery,.
 
Upvote 0

mmirandap

Gold Member
Se incorporó
1 Septiembre 2006
Mensajes
2.474
Depende del volumen de datos de la tabla "madre". Si la tabla madre hace consultas especificas de 1 campo a tablas hijas, y la tabla madre tiene pocas filas, supongo que una subquery será mas eficiente, en especial si no hay una relación directa declarada.

Bajo Sqlsrv hay una opcion de analisis de costo de la consulta, que puede ayudarte a comparar.

Ahora, si vas a traer muchos datos de ambas tablas, será mejor un join, en especial si ambas tablas tienen el campo filtro indexado y una relacion declarada.

Eso mismo, analiza el costo de la consulta, aunque tambien adhiero a que inner join es la mano
 
Upvote 0

Gen1us

VCP
Se incorporó
16 Octubre 2012
Mensajes
1.358
FEA.jpg
 
Upvote 0

Koji Nanjo

Sushiman
Se incorporó
21 Marzo 2006
Mensajes
1.725
Gracias por las respuestas, revisaré

Pondré los 2 ejemplos, uno es la query con inner join que realicé y otro donde lo hizo una persona que trabaja acá (como la weas entonces no me fío)
es bien sencilla (la modifiqué porque son paranoicos con entregar cualquier tipo info donde trabajo)

Inner join

SELECT PERSONA.CODI_PERSO, PERSONA.APELLIDO_PATERNO, PERSONA.APELLIDO_MATERNO, PERSONA.NOM, PERSONA.RUT
FROM PERSONA
INNER JOIN CONTRATO ON PERSONA.RUT = CONTRATO.RUT
WHERE PERSONA.CODI_PERSO,='323232' AND CONTRATO.VIGENCIA = 'A'

La consulta es para saber si la persona es académica y si está vigente, esa información la tiene la tabla de CONTRATO y la clave para ambas es el rut, es solo para consultar por un registro en específico.

subquery

select P.RUT,
P.CODI_PERSO,
P.NOM,
P.APELLIDO_PATERNO,
P.APELLIDO_MATERNO,
F_UNIDAD_ACADEM(P.RUT)
from PERSONA P where
P.rut in
(
select C.rut
from CONTRATO C
where C.vigencia = 'A'
)

donde estoy trabajando es una replica ordinaria en estructura y muy pocos registros estuve mirando y no tiene índices, pero no creo que la real no tenga :sconf
me importa el performance porque esto lo ejecutará un microservicio y preguntaremos por hartas personas. Se me fue contar también que la base es oracle.
 
Upvote 0

Harima

Pegao al tarro
Se incorporó
15 Mayo 2008
Mensajes
3.958
Gracias por las respuestas, revisaré

Pondré los 2 ejemplos, uno es la query con inner join que realicé y otro donde lo hizo una persona que trabaja acá (como la weas entonces no me fío)
es bien sencilla (la modifiqué porque son paranoicos con entregar cualquier tipo info donde trabajo)

Inner join

SELECT PERSONA.CODI_PERSO, PERSONA.APELLIDO_PATERNO, PERSONA.APELLIDO_MATERNO, PERSONA.NOM, PERSONA.RUT
FROM PERSONA
INNER JOIN CONTRATO ON PERSONA.RUT = CONTRATO.RUT
WHERE PERSONA.CODI_PERSO,='323232' AND CONTRATO.VIGENCIA = 'A'

La consulta es para saber si la persona es académica y si está vigente, esa información la tiene la tabla de CONTRATO y la clave para ambas es el rut, es solo para consultar por un registro en específico.

subquery

select P.RUT,
P.CODI_PERSO,
P.NOM,
P.APELLIDO_PATERNO,
P.APELLIDO_MATERNO,
F_UNIDAD_ACADEM(P.RUT)
from PERSONA P where
P.rut in
(
select C.rut
from CONTRATO C
where C.vigencia = 'A'
)

donde estoy trabajando es una replica ordinaria en estructura y muy pocos registros estuve mirando y no tiene índices, pero no creo que la real no tenga :sconf
me importa el performance porque esto lo ejecutará un microservicio y preguntaremos por hartas personas. Se me fue contar también que la base es oracle.

Es que sin indices, la consulta que le tires va a valer champiñón, consulta que motor de BD y versión están usando?
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Como dice @Harima , ojalá te dejen poner índices.

Una consulta.

¿El campo CODI_PERSO de la tabla PERSO es numérico (INTERNER, NUMBER) o alfanumérico (VARCHAR)?

Si el campo es numérico, entonces el valor con el que tienes que hacer la comparación debe ir sin comillas. ¿Y por qué esto? Porque si el campo es numérico, y tiene índice, entonces si tu pones el valor con comillas la búsqueda no utilizará el índice.

SELECT PERSONA.CODI_PERSO, PERSONA.APELLIDO_PATERNO, PERSONA.APELLIDO_MATERNO, PERSONA.NOM, PERSONA.RUT
FROM PERSONA
INNER JOIN CONTRATO ON PERSONA.RUT = CONTRATO.RUT
WHERE PERSONA.CODI_PERSO,='323232' AND CONTRATO.VIGENCIA = 'A'
 
Upvote 0

Koji Nanjo

Sushiman
Se incorporó
21 Marzo 2006
Mensajes
1.725
Ya mandé a preguntar la versión y si es que tiene índices.
Es number, ptm que eres seco :inlove

¿Tendrán por ahí algún sitio o manualcillo de esos tipos de tips? cuando busco siempre me sale un viejo gordo feo, el amigo del chango :zippy
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Ya mandé a preguntar la versión y si es que tiene índices.
Es number, ptm que eres seco :inlove

¿Tendrán por ahí algún sitio o manualcillo de esos tipos de tips? cuando busco siempre me sale un viejo gordo feo, el amigo del chango :zippy

Puta, no se, no conozco ningún sitio así que tenga papitas. Si yo cachureo varios sitios y aprendo un poquito de cada uno de ellos, pero así como un sitio preciso de tips.... puta...oracle-home.com podría ser.
 
Upvote 0

Koji Nanjo

Sushiman
Se incorporó
21 Marzo 2006
Mensajes
1.725
y el zuljin-ora-home.com cuando?

al final me confirmaron que la versión es la 11 y las tablas tienen índice.
 
Upvote 0

mmirandap

Gold Member
Se incorporó
1 Septiembre 2006
Mensajes
2.474
Asktom.oracle.com , ahí hay varias papitas y resuelve hartas dudas


Enviado desde mi iPhone utilizando Tapatalk
 
Upvote 0
Subir