Que es mas eficiente? condicion en INNER o en WHERE

09/08/2007 - 01:26 por Juan Carlos Mendoza | Informe spam
Buenas,

Revisando un pase a produccion, encontre que el desarrollador habia
colocado en el inner join condiciones de seleccion a manera de un
where, le pedi que me explicara porque no lo habia colocado en el
bloque del WHERE y me explico que el JOIN se realiza primero con la
condicion del mismo, y que será mas eficiente pues traera menos filas
que si se incluye en el WHERE donde hara una seleccion sobre las filas
traidas con el INNER. No pude ni afirmar ni refutar su idea, asi es
que me permito elevarles la consulta, pero hice un script para simular
y al analizarlo me salio lo mismo (Display Estimated Execution Plan)

create table ut_prueba1 (
codigo char(02),
nombre varchar(10))
GO
create table ut_prueba2 (
codigo char(02),
nombre varchar(10),
sexo char(1))
Go
set nocount on
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba2 values ( '01','alfonso','m')
insert into ut_prueba2 values ( '02','alberto','m')
insert into ut_prueba2 values ( '03','Ana Maria','f')
insert into ut_prueba2 values ( '04','Bertha','f')
GO


Que es mejor o mas optimo:

(Opcion 1)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
and t2.sexo = 'm'
GO

(Opcion 2)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
where t2.sexo = 'm'
GO


Aunque el ejemplo es pobre en cantidad de filas, que pasaria en la
practica donde manejamos miles de filas?

Saludos,

Juan Carlos Mendoza

Preguntas similare

Leer las respuestas

#6 Luis Mata
09/08/2007 - 16:09 | Informe spam
bueno el inner join
te va a relacionar de esta manera
de la cabecera el codigo '02'
con todos los detalles en la tabla detalle con cdigo '02'

si solo quieres eso entoces queda en el inner join y el on

pero si tuvieras mas datos puedes agregar un where para minimizar la
consulta.

digammos de ese codigo '02' todos los de una determinada fecha.


"Juan Carlos Mendoza" escribió en el mensaje de
noticias news:
Hola Luis

La consulta estaba orientada a que hace internamente el SQL si el
"codigo='02'" lo coloco dentro del Join me traera a memoria solo los
registros que cumplen la regla de relacion, incluso codigo='02'. Pero
si lo coloco en el WHERE me trae todo a memoria, y luego se queda con
los que cumplen la condicion del WHERE, el tema en realidad es
performance, y no cargar innecesariamente la TEMPDB

Saludos,

Juan Carlos Mendoza


On 8 ago, 21:10, "Luis Mata" wrote:
Bueno
si bien quieres relacionar cabecera y detalle todos solo usas el INNER
JOIN
Pero si de todos tus registros quieres algunos en especifico ahi incluyes
el
WHERE

Algo asi lo hago
SELECT a.codigo,a.total,b.producto FROM cabecera as a INNER JOIN detalle
as
b ON a.codigo=b.codigo
aqui te consolida todos tus datos sin condiciones

Y algo mas resumido seria asi
SELECT a.codigo,a.total,b.producto FROM cabecera as a INNER JOIN detalle
as
b ON a.codigo=b.codigo WHERE a.codigo='02'
aqui solo te muestra datos del cliente con codigo '02' pero consolidado.

no es que cual es mas rapido, si no que es lo que necesitas.
- quizas quieres todo el consolidado de tus ventas USAS EL PRIMERO
- y si quieres solo de determinados rangos usas el segundo.

espero haberte ayudado

Luis Mata

"Juan Carlos Mendoza" escribió en el
mensajenews:
Buenas,

Revisando un pase a produccion, encontre que el desarrollador habia
colocado en el inner join condiciones de seleccion a manera de un
where, le pedi que me explicara porque no lo habia colocado en el
bloque del WHERE y me explico que el JOIN se realiza primero con la
condicion del mismo, y que será mas eficiente pues traera menos filas
que si se incluye en el WHERE donde hara una seleccion sobre las filas
traidas con el INNER. No pude ni afirmar ni refutar su idea, asi es
que me permito elevarles la consulta, pero hice un script para simular
y al analizarlo me salio lo mismo (Display Estimated Execution Plan)

create table ut_prueba1 (
codigo char(02),
nombre varchar(10))
GO
create table ut_prueba2 (
codigo char(02),
nombre varchar(10),
sexo char(1))
Go
set nocount on
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba2 values ( '01','alfonso','m')
insert into ut_prueba2 values ( '02','alberto','m')
insert into ut_prueba2 values ( '03','Ana Maria','f')
insert into ut_prueba2 values ( '04','Bertha','f')
GO

Que es mejor o mas optimo:

(Opcion 1)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
and t2.sexo = 'm'
GO

(Opcion 2)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
where t2.sexo = 'm'
GO

Aunque el ejemplo es pobre en cantidad de filas, que pasaria en la
practica donde manejamos miles de filas?

Saludos,

Juan Carlos Mendoza
Respuesta Responder a este mensaje
#7 Salvador Ramos
09/08/2007 - 19:13 | Informe spam
Efectivamente,

En esos casos hay que revisar los planes de ejecución, es más, en ese
ejemplo es el mismo plan de ejecución plan de ejecución (no los he probado,
pero si que deben ser iguales) :-)

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Maxi" escribió en el mensaje
news:
Hola, eso no siempre es cierto, paras poder hacer un buen analisis
siemnpre debes ver los planes de ejecucion


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Juan Carlos Mendoza" escribió en el mensaje
news:
Buenas,

Revisando un pase a produccion, encontre que el desarrollador habia
colocado en el inner join condiciones de seleccion a manera de un
where, le pedi que me explicara porque no lo habia colocado en el
bloque del WHERE y me explico que el JOIN se realiza primero con la
condicion del mismo, y que será mas eficiente pues traera menos filas
que si se incluye en el WHERE donde hara una seleccion sobre las filas
traidas con el INNER. No pude ni afirmar ni refutar su idea, asi es
que me permito elevarles la consulta, pero hice un script para simular
y al analizarlo me salio lo mismo (Display Estimated Execution Plan)

create table ut_prueba1 (
codigo char(02),
nombre varchar(10))
GO
create table ut_prueba2 (
codigo char(02),
nombre varchar(10),
sexo char(1))
Go
set nocount on
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba2 values ( '01','alfonso','m')
insert into ut_prueba2 values ( '02','alberto','m')
insert into ut_prueba2 values ( '03','Ana Maria','f')
insert into ut_prueba2 values ( '04','Bertha','f')
GO


Que es mejor o mas optimo:

(Opcion 1)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
and t2.sexo = 'm'
GO

(Opcion 2)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
where t2.sexo = 'm'
GO


Aunque el ejemplo es pobre en cantidad de filas, que pasaria en la
practica donde manejamos miles de filas?

Saludos,

Juan Carlos Mendoza


Respuesta Responder a este mensaje
#8 Luis Tarzia
09/08/2007 - 21:04 | Informe spam
La teoria en la practica no sirve de mucho,siempre si escapas a la teoria
veras que se logran mejores resultados que siguiendo los libros
"principiante" escribió en el mensaje
news:
De mayor eficiencia que es lo que preguntas no te sabría decir con


exactitud
pues lo ideal es analizar el plan de ejecución en casos especificos. Pero
al margen de eso a mi me enseñaron por algo del estándar de sql, la
portabilidad y no recuerdo qué mas, que los Joins se deben usan para
combinar tablas y los where para aplicar condiciones de filtrado (aunque


en
la practica puedan invertirse o combinarse ambas posibilidades).

Jose TH

"Juan Carlos Mendoza" escribió en el mensaje
news:
Buenas,

Revisando un pase a produccion, encontre que el desarrollador habia
colocado en el inner join condiciones de seleccion a manera de un
where, le pedi que me explicara porque no lo habia colocado en el
bloque del WHERE y me explico que el JOIN se realiza primero con la
condicion del mismo, y que será mas eficiente pues traera menos filas
que si se incluye en el WHERE donde hara una seleccion sobre las filas
traidas con el INNER. No pude ni afirmar ni refutar su idea, asi es
que me permito elevarles la consulta, pero hice un script para simular
y al analizarlo me salio lo mismo (Display Estimated Execution Plan)

create table ut_prueba1 (
codigo char(02),
nombre varchar(10))
GO
create table ut_prueba2 (
codigo char(02),
nombre varchar(10),
sexo char(1))
Go
set nocount on
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba2 values ( '01','alfonso','m')
insert into ut_prueba2 values ( '02','alberto','m')
insert into ut_prueba2 values ( '03','Ana Maria','f')
insert into ut_prueba2 values ( '04','Bertha','f')
GO


Que es mejor o mas optimo:

(Opcion 1)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
and t2.sexo = 'm'
GO

(Opcion 2)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
where t2.sexo = 'm'
GO


Aunque el ejemplo es pobre en cantidad de filas, que pasaria en la
practica donde manejamos miles de filas?

Saludos,

Juan Carlos Mendoza


Respuesta Responder a este mensaje
#9 Luis Tarzia
09/08/2007 - 21:05 | Informe spam
Que sea el mismo plan de ejecucion no quiere decir que resuelva los
resultados mas rapidos con la condicion en el join,acuerdense que los planes
de ejecucion son en base a la menor lectura posible de disco.
"Salvador Ramos" escribió en el
mensaje news:
Efectivamente,

En esos casos hay que revisar los planes de ejecución, es más, en ese
ejemplo es el mismo plan de ejecución plan de ejecución (no los he


probado,
pero si que deben ser iguales) :-)

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Maxi" escribió en el mensaje
news:
> Hola, eso no siempre es cierto, paras poder hacer un buen analisis
> siemnpre debes ver los planes de ejecucion
>
>
> Salu2
>
> Microsoft MVP SQL Server
> Culminis Speaker
>
> "Juan Carlos Mendoza" escribió en el mensaje
> news:
> Buenas,
>
> Revisando un pase a produccion, encontre que el desarrollador habia
> colocado en el inner join condiciones de seleccion a manera de un
> where, le pedi que me explicara porque no lo habia colocado en el
> bloque del WHERE y me explico que el JOIN se realiza primero con la
> condicion del mismo, y que será mas eficiente pues traera menos filas
> que si se incluye en el WHERE donde hara una seleccion sobre las filas
> traidas con el INNER. No pude ni afirmar ni refutar su idea, asi es
> que me permito elevarles la consulta, pero hice un script para simular
> y al analizarlo me salio lo mismo (Display Estimated Execution Plan)
>
> create table ut_prueba1 (
> codigo char(02),
> nombre varchar(10))
> GO
> create table ut_prueba2 (
> codigo char(02),
> nombre varchar(10),
> sexo char(1))
> Go
> set nocount on
> insert into ut_prueba1 values ( '01','obrero')
> insert into ut_prueba1 values ( '01','obrero')
> insert into ut_prueba2 values ( '01','alfonso','m')
> insert into ut_prueba2 values ( '02','alberto','m')
> insert into ut_prueba2 values ( '03','Ana Maria','f')
> insert into ut_prueba2 values ( '04','Bertha','f')
> GO
>
>
> Que es mejor o mas optimo:
>
> (Opcion 1)
> Select t1.codigo, t1.nombre, t2.nombre
> From ut_prueba1 t1
> inner join ut_prueba2 t2 on t1.codigo = t2.codigo
> and t2.sexo = 'm'
> GO
>
> (Opcion 2)
> Select t1.codigo, t1.nombre, t2.nombre
> From ut_prueba1 t1
> inner join ut_prueba2 t2 on t1.codigo = t2.codigo
> where t2.sexo = 'm'
> GO
>
>
> Aunque el ejemplo es pobre en cantidad de filas, que pasaria en la
> practica donde manejamos miles de filas?
>
> Saludos,
>
> Juan Carlos Mendoza
>
>


Respuesta Responder a este mensaje
#10 principiante
09/08/2007 - 21:39 | Informe spam

La teoria en la practica no sirve de mucho,




No creo que sea tan así. La teoría debe validarse en la práctica.


siempre si escapas a la teoria
veras que se logran mejores resultados que siguiendo los libros




A veces sí pero no siempre. Y en el caso de que estamos hablando no creo
que sea así en lo absoluto.


Jose TH



"principiante" escribió en el mensaje
news:
De mayor eficiencia que es lo que preguntas no te sabría decir con


exactitud
pues lo ideal es analizar el plan de ejecución en casos especificos. Pero
al margen de eso a mi me enseñaron por algo del estándar de sql, la
portabilidad y no recuerdo qué mas, que los Joins se deben usan para
combinar tablas y los where para aplicar condiciones de filtrado (aunque


en
la practica puedan invertirse o combinarse ambas posibilidades).

Jose TH

"Juan Carlos Mendoza" escribió en el mensaje
news:
Buenas,

Revisando un pase a produccion, encontre que el desarrollador habia
colocado en el inner join condiciones de seleccion a manera de un
where, le pedi que me explicara porque no lo habia colocado en el
bloque del WHERE y me explico que el JOIN se realiza primero con la
condicion del mismo, y que será mas eficiente pues traera menos filas
que si se incluye en el WHERE donde hara una seleccion sobre las filas
traidas con el INNER. No pude ni afirmar ni refutar su idea, asi es
que me permito elevarles la consulta, pero hice un script para simular
y al analizarlo me salio lo mismo (Display Estimated Execution Plan)

create table ut_prueba1 (
codigo char(02),
nombre varchar(10))
GO
create table ut_prueba2 (
codigo char(02),
nombre varchar(10),
sexo char(1))
Go
set nocount on
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba1 values ( '01','obrero')
insert into ut_prueba2 values ( '01','alfonso','m')
insert into ut_prueba2 values ( '02','alberto','m')
insert into ut_prueba2 values ( '03','Ana Maria','f')
insert into ut_prueba2 values ( '04','Bertha','f')
GO


Que es mejor o mas optimo:

(Opcion 1)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
and t2.sexo = 'm'
GO

(Opcion 2)
Select t1.codigo, t1.nombre, t2.nombre
From ut_prueba1 t1
inner join ut_prueba2 t2 on t1.codigo = t2.codigo
where t2.sexo = 'm'
GO


Aunque el ejemplo es pobre en cantidad de filas, que pasaria en la
practica donde manejamos miles de filas?

Saludos,

Juan Carlos Mendoza






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida