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

#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
Respuesta Responder a este mensaje
#2 Luis Mata
09/08/2007 - 04:10 | Informe spam
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 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
#3 principiante
09/08/2007 - 04:11 | Informe spam
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
#4 Juan Carlos Mendoza
09/08/2007 - 04:42 | Informe spam
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
#5 Maxi
09/08/2007 - 14:31 | Informe spam
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 Respuesta Tengo una respuesta
Search Busqueda sugerida