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
 

Leer las respuestas

#1 Luis Tarzia
09/08/2007 - 01:50 | Informe spam
Por experiencia es mas eficiente en el join ya que unis menos lineas porque
realiza antes el filtro
"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

Preguntas similares