Consulta de rendimiento

17/06/2005 - 16:48 por Oscar D | Informe spam
Buen Dia.

Tengo una duda, cual es la mejor practica al hacer una consulta de este
tipo:

1.-
DELETE tabla1
FROM Tabla_1 a Inner Join tabla_2 b
ON a.clave = b.Clave INNER JOIN tabla_3 c
ON a.clave = c.Clave
WHERE
b.condicion = 1
AND a.condicion = 0

Ó

2.-
DELETE tabla1
FROM Tabla_1 a Inner Join tabla_2 b
ON a.clave = b.Clave AND b.condicion = 1 AND a.condicion = 0
INNER JOIN tabla_3 c ON a.clave = c.Clave

O es lo miemo hacerlas en cualquier forma.

Saludos.

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
20/06/2005 - 17:58 | Informe spam
Maxi,

Mal interprete a lo que te referias (los libros se refieren a estas
consultas como tablas derivadas), y por supuesto te doy la razon. Pero esto
es un caso diferente, fijate que aqui no se intercambian las expresiones
entre las clausulas FROM y WHERE entre los mismos conjuntos y logicamente que
cuando el numero de filas que participan en una operacion join es menor, pues
el rendimiento sera mejor. Yo por claridad prefiero, como dije antes, poner
las expresiones de union en el join y los demas filtros en la clausula where.
Como dice el dicho, en la mayoria de nuestros paises, zapatero a su zapato.

Te voy a pedir un favor, y este es que si puedes ejecutar este script en tu
server (que no sea el de produccion pues estoy usando dbcc dropclenabuffers),
usando QA y con la opcion "show execution plan ctrl-k" prendida. Cual es el
costo relativo al batch, de cada sentencia select?

En mi maquina, la opcion que pone todos los filtros en el join, tiene menor
costo (sql server escoje diferente plan de ejecucion para ambas sentencias).

use northwind
go

declare @country nvarchar(15)

set @country = N'usa'

dbcc freeproccache
dbcc dropcleanbuffers

select
c.customerid,
c.companyname,
oh.orderid,
oh.orderdate
from
dbo.customers as c
left join
dbo.orders as oh
on c.customerid = oh.customerid
and c.country = @country

dbcc freeproccache
dbcc dropcleanbuffers

select
c.customerid,
c.companyname,
oh.orderid,
oh.orderdate
from
dbo.customers as c
left join
dbo.orders as oh
on c.customerid = oh.customerid
where
c.country = @country
go


Saludos,


AMB


"Maxi" wrote:

Hola Ale, en muchos casos hacer esto puede significar una diferencia enorme:

Select t1.campo, t2.campo from (select campos from t1 where loqueseea) t1
left join
(select campo2 from t2 where loquesea) t2 on
t1.id = t2.id

Esto acelera mucho la cosa cuando las tablas son grandes, por ej, en algunas
consultas que he realizado al ERP que tenemos esto de esta manera puede
hacer que la consulta dure 2 segundos y si la hacemos fuera y luego el where
puede durar 4 o 6 segundos


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Alejandro Mesa" escribió en el
mensaje news:
> Hola Maxi,
>
> Te agredecieria mucho si nos pudieras mostrar un ejemplo.
>
> Gracias por adelantado,
>
> Alejandro Mesa
>
> "Maxi" wrote:
>
>> Hola, puede existir una diferencia si se hacen consultas derivadas, en lo
>> cual dentro del join poner realmente lo que necesito y no todo para luego
>> hacer el filtro, la union en estos casos es mucho mas liviana y por mi
>> experiencia en muchos querys a mejorado la performance mucho
>>
>>
>> Maxi - Buenos Aires - Argentina
>> Desarrollador 3 Estrellas
>>
>> Msn_messager:
>> mail: Maxi.da[arroba]gmail.com
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>> > Oscar,
>> >
>> > Cuando usas "inner join", entonces no hay diferencia entre poner el
>> > filtro
>> > en el join o en la clausula "where". Pero coincido con Salvador, la
>> > legibilidad de la sentencia es mas clara cuando en el join solo usamos
>> > las
>> > condiciones de relacion. En casos de "outer joins" la cosa cambia, pues
>> > el
>> > resultado puede ser completamente diferente.
>> >
>> >
>> > AMB
>> >
>> > "Oscar D" wrote:
>> >
>> >> Buen Dia.
>> >>
>> >> Tengo una duda, cual es la mejor practica al hacer una consulta de
>> >> este
>> >> tipo:
>> >>
>> >> 1.-
>> >> DELETE tabla1
>> >> FROM Tabla_1 a Inner Join tabla_2 b
>> >> ON a.clave = b.Clave INNER JOIN tabla_3 c
>> >> ON a.clave = c.Clave
>> >> WHERE
>> >> b.condicion = 1
>> >> AND a.condicion = 0
>> >>
>> >> Ó
>> >>
>> >> 2.-
>> >> DELETE tabla1
>> >> FROM Tabla_1 a Inner Join tabla_2 b
>> >> ON a.clave = b.Clave AND b.condicion = 1 AND a.condicion = 0
>> >> INNER JOIN tabla_3 c ON a.clave = c.Clave
>> >>
>> >> O es lo miemo hacerlas en cualquier forma.
>> >>
>> >> Saludos.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida