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

#16 principiante
11/08/2007 - 14:08 | Informe spam
"Luis Tarzia" escribió en el mensaje
news:
La teoria te dice como hacer un inner join o un where y nada mas,




Hay que ver cuáles son los libros que lees. No todos te dicen sólo eso,
sino que van mucho más allá.


despues
como lo aplicas o como lo haces es cosa de la experiencia y de romperte la
cabeza contra la pared hasta que salga,




Bueno no sé en tu caso pero para mi después de leer un buen libro y
practicar ejemplos normalmente no me ha sido tan traumática la experiencia.


o te pensas que todos los problemas
de programacion se resuelven con un libro ????




Claro que no todos, como lo dije antes. Pero primero leo libros, cuyos
conocimientos luego voy validando, ampliando y profundizando con la
experiencia diaria. Créeme que se ahorra mucho tiempo leyendo primero que
lanzarte al ensayo y error sin una base teórica más o menos sólida.


Jose TH


"principiante" escribió en el mensaje
news:#
> Por experiencia (mas de 25 años) y tu segun lo dices eres todavia
> "principiante" la teoria no siempre te va a salvar en la practica,

Ahora lo dijiste mejor: "no siempre te va a salvar" pero debes primero
basarte en ella porque muchos libros se basan precisamente en la


experiencia
de otros, no en enunciados teoricos sin aplicación práctica. Y por lo
demás yo conozco gente que tiene 20 y 25 años haciendo las cosas mal,
precisamente por no instruirse primero, por tanto a veces no importa
tanto
la cantidad como la calidad de la experiencia.

>cuando las
> papas queman los libros no te ayudan sino la experiencia y la
> innovacion,muchas cosas que dicen los libros te llevan a no resolver


nunca
> un problema.

Puede ser, pero "no siempre" :)


Jose TH






Respuesta Responder a este mensaje
#17 Juan Carlos Mendoza
11/08/2007 - 20:35 | Informe spam
Tranquilidad señores,

Que la consulta simple no merecia respuestas poco alturadas, sobre
todo brindadas por tan buenos consultores como son todos ustedes.


Saludos,

Juan Carlos Mendoza
Respuesta Responder a este mensaje
#18 Salvador Ramos
11/08/2007 - 20:39 | Informe spam
Claro que no, que tenga el mismo plan de ejecución quiere decir simplemente
que en ese caso concreto vas a obtener resultados idénticos en ambos casos.
En ese caso en concreto da igual optar por una o por otra en cuanto a
rendimiento, simplemente será cuestión de elegir la sintaxis que prefiramos.

Un saludo
Salvador Ramos

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


"Luis Tarzia" escribió en el mensaje
news:Os3%
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
#19 Luis Tarzia
13/08/2007 - 03:42 | Informe spam
Los mismos dibujitos en el plan no significa mucho si no se lee todo lo
accesorio como filas estimadas,uso de disco y todo eso.
"Salvador Ramos" escribió en el
mensaje news:eZKO#
Claro que no, que tenga el mismo plan de ejecución quiere decir


simplemente
que en ese caso concreto vas a obtener resultados idénticos en ambos


casos.
En ese caso en concreto da igual optar por una o por otra en cuanto a
rendimiento, simplemente será cuestión de elegir la sintaxis que


prefiramos.

Un saludo
Salvador Ramos

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


"Luis Tarzia" escribió en el mensaje
news:Os3%
> 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
#20 Salvador Ramos
13/08/2007 - 08:17 | Informe spam
Nadie ha hablado de dibujitos ni similar en ningún momento. Es más, ante tus
puntualizaciones, he revisado los planes de ejecución para confirmarlo, y si
digo que los planes de ejecución son iguales, es que son iguales, nadie ha
dicho que sean iguales los dibujitos ni nada por el estilo. Si te queda
alguna duda pruebalos y verifica toda la información que ofrecen, y verás
que "son iguales".

Un saludo
Salvador Ramos

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


"Luis Tarzia" escribió en el mensaje
news:
Los mismos dibujitos en el plan no significa mucho si no se lee todo lo
accesorio como filas estimadas,uso de disco y todo eso.
"Salvador Ramos" escribió en el
mensaje news:eZKO#
Claro que no, que tenga el mismo plan de ejecución quiere decir


simplemente
que en ese caso concreto vas a obtener resultados idénticos en ambos


casos.
En ese caso en concreto da igual optar por una o por otra en cuanto a
rendimiento, simplemente será cuestión de elegir la sintaxis que


prefiramos.

Un saludo
Salvador Ramos

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


"Luis Tarzia" escribió en el mensaje
news:Os3%
> 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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida