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

#11 Luis Tarzia
10/08/2007 - 07:29 | Informe spam
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,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.

Por experiencia tambien te digo que si.
"principiante" escribió en el mensaje
news:
>
> 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
#12 principiante
10/08/2007 - 14:19 | Informe spam
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
#13 Maxi
10/08/2007 - 14:25 | Informe spam
Hola Luis, como estas? coincido en parte con lo que dices, la teoria siempre
es necesaria pero muchas veces no hay que hacer lo que dice la teoria ;)


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Luis Tarzia" 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,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.

Por experiencia tambien te digo que si.
"principiante" escribió en el mensaje
news:
>
> 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
#14 Leonardo
10/08/2007 - 14:51 | Informe spam
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)



Yo creo que el optimizador de SQL es mas "habil" de lo que pensamos y no
dudo que en algunos casos donde sea posible pueda decidir que es mejor y
quizas lo que pongas al Where lo meta al join por ti o viceversa segun sea
factible hacerlo.


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
#15 Luis Tarzia
11/08/2007 - 05:25 | Informe spam
La teoria te dice como hacer un inner join o un where y nada mas,despues
como lo aplicas o como lo haces es cosa de la experiencia y de romperte la
cabeza contra la pared hasta que salga,o te pensas que todos los problemas
de programacion se resuelven con un libro ????
"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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida