Sigo con los triggers y los joins (delete)

11/09/2005 - 03:17 por Raul | Informe spam
Hola amigos. De nuevo yo con mis triggers y joins:

Mis preguntas son en procura de optimizar al maximo mis triggers pues ya he
leido que ralentizan las operaciones de escritura, lo cual no quisiera para
nada me ocurriera.

En este caso me interesa un trigger que borre un registro en otra tabla:
Ej. dentro del trigger en TABLA2:

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK and D.Flag<>''

Mi cuestion es si es mejor hacerlo asi, mas seguro o eficiente , con where ?
o son formas equivalentes ?

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK where D.Flag<>''

o en su defecto hacerlo asi:

DELETE TABLA1
FROM TABLA2 INNER JOIN (select PK from DELETED WHERE DELETED.Flag<>'') D ON
TABLA2.PK=D.PK

Cual de los metodos se espera que sean mas rapidos ?

Preguntas similare

Leer las respuestas

#1 Maxi
11/09/2005 - 15:56 | Informe spam
Raul, cuando quieres ver diferencias entre metodos lo mejor es ver el plan
de ejecucion de cada uno y sacar las conclusiones.

En este caso no creo que entres estos 3 metodos exista mucha diferencia
(quizas hasta ninguna).

Ahora es cierto q los trigger hacen las cosas mas lentas y aumentan los
bloqueos, hay q tratar de evitarlos si se puede y poner la logica esta
dentro de tus Sp's correspondientes


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

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

"Raul" escribió en el mensaje
news:
Hola amigos. De nuevo yo con mis triggers y joins:

Mis preguntas son en procura de optimizar al maximo mis triggers pues ya
he leido que ralentizan las operaciones de escritura, lo cual no quisiera
para nada me ocurriera.

En este caso me interesa un trigger que borre un registro en otra tabla:
Ej. dentro del trigger en TABLA2:

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK and D.Flag<>''

Mi cuestion es si es mejor hacerlo asi, mas seguro o eficiente , con where
? o son formas equivalentes ?

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK where D.Flag<>''

o en su defecto hacerlo asi:

DELETE TABLA1
FROM TABLA2 INNER JOIN (select PK from DELETED WHERE DELETED.Flag<>'') D
ON TABLA2.PK=D.PK

Cual de los metodos se espera que sean mas rapidos ?






Respuesta Responder a este mensaje
#2 Alejandro Mesa
11/09/2005 - 18:59 | Informe spam
Raul,

Para mas claridad de lectura de la sentencia, muchos preferimos usar en el
"join" las columnas por las que se relacionan las tablas y los filtros
ponerlos en la clausula "where". Eso no quiere decir que sql server puede
escojer un plan de ejecucion diferente para ambas sentencias.


use northwind
go

dbcc freeproccache
dbcc dropcleanbuffers
go

select
oh.orderid,
oh.customerid,
oh.orderdate,
od.productid,
od.quantity,
od.unitprice
from
dbo.orders as oh
inner join
dbo.[order details] as od
on oh.orderid = od.orderid
and oh.orderdate = '19970701'
go

dbcc freeproccache
dbcc dropcleanbuffers
go

select
oh.orderid,
oh.customerid,
oh.orderdate,
od.productid,
od.quantity,
od.unitprice
from
dbo.orders as oh
inner join
dbo.[order details] as od
on oh.orderid = od.orderid
where
oh.orderdate = '19970701'
go


dbcc freeproccache
dbcc dropcleanbuffers
go

declare @country nvarchar(15)

set @country = N'usa'

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

Como ves, no existe una regla unica. Mi recomendacion es que pruebes ambas
sentencias en tu entorno y escajas la que mejor rendimiento brinde.

Ahora, algo me llama la atencion en el ejemplo que pusistes, porque no estas
usando ninguna relacion entre la tabla donde eliminas filas y las tablas que
aparecen en la clausula "from"

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK and D.Flag<>''



De seguro este es un ejemplo que usastes para exponer tu duda, pero cuidado,
porque al no relacionar la tabla donde quieres eliminar con las tablas que
aparecen en la clausula "from", equivale a la siguiente sentencia:

delete tabla1

si existe al menos una fila en las tablas de la clausula "from" que cumplan
la condicion del "join". En caso de que ninguna fila en ambas tablas cumplan
la condicion del "join" entonces no se eliminara ninguna fila en "tabla1".
Este tipo de sentencia es mejor escribirla como:

if exists (
select
*
from
tabla2 as t2inner join deleted as d
on t2.pk = d.pk
where
d.flag != ''
)
delete tabla1
go


Ejemplo:


create table t1 (
c1 int
)
go

create table t2 (
c1 int,
c2 int
)
go

create trigger tr_t2 on t2
for update
as
delete t1
from t2 inner join deleted as d on t2.c1 = d.c1
go

insert into t1 values(1)
insert into t1 values(2)
insert into t1 values(3)

insert into t2 values(2, 1)
go

update t2
set c2 = 5
where c1 = 2
go

select * from t1
select * from t2
go

drop table t1, t2
go


AMB

"Raul" wrote:

Hola amigos. De nuevo yo con mis triggers y joins:

Mis preguntas son en procura de optimizar al maximo mis triggers pues ya he
leido que ralentizan las operaciones de escritura, lo cual no quisiera para
nada me ocurriera.

En este caso me interesa un trigger que borre un registro en otra tabla:
Ej. dentro del trigger en TABLA2:

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK and D.Flag<>''

Mi cuestion es si es mejor hacerlo asi, mas seguro o eficiente , con where ?
o son formas equivalentes ?

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK where D.Flag<>''

o en su defecto hacerlo asi:

DELETE TABLA1
FROM TABLA2 INNER JOIN (select PK from DELETED WHERE DELETED.Flag<>'') D ON
TABLA2.PK=D.PK

Cual de los metodos se espera que sean mas rapidos ?







Respuesta Responder a este mensaje
#3 Raul
12/09/2005 - 02:06 | Informe spam

Ahora, algo me llama la atencion en el ejemplo que pusistes, porque no
estas
usando ninguna relacion entre la tabla donde eliminas filas y las tablas
que
aparecen en la clausula "from"

DELETE TABLA1
FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK and D.Flag<>''



De seguro este es un ejemplo que usastes para exponer tu duda, pero
cuidado,
porque al no relacionar la tabla donde quieres eliminar con las tablas que
aparecen en la clausula "from", equivale a la siguiente sentencia:




Realmente fue un error. Fue un ejemplo rapido mal redactado. Debi ponerlo
asi :

DELETE TABLA1
FROM TABLA1 INNER JOIN DELETED D ON TABLA1.PK=D.FK and D.Flag<>''





Pero quiero aprovechar para agradecerte la excelente y detallada
explicacion. Me he quedado gratamente sorprendido. Realmente no entro mucho
al foro y no los conozco bien a los integrantes pero me imagino que eres lo
que llamamos un "gurú". Si tienes alguna página con tus artículos porque me
imagino que los tienes te agradeceria me dieras la dirección para leerlos.
Gracias nuevamente.

Saludos y muchos exitos.

Raul
Respuesta Responder a este mensaje
#4 Alejandro Mesa
12/09/2005 - 14:55 | Informe spam
Raul,

Quiero darte las gracias por tus palabras. Soy un fan de sql server, y llevo
trabajando con el desde la version 6.5. No creo ser un "guru" ni mucho menos,
creo que mi conocimiento es una mezcla de esperiencia y estudio continuo de
esta teoria y especialmente de este rdbms. Desgraciadamente no tengo una
pagina web, mas bien estoy relacionandome con una pagina muy conocida por el
grupo donde se exponen las preguntas mas frecuentes, y tratare de aportar lo
que pueda con la ayuda, por supuesto, de otros miembros del grupo.

Gracias nuevamente,

Alejandro Mesa

"Raul" wrote:

>
> Ahora, algo me llama la atencion en el ejemplo que pusistes, porque no
> estas
> usando ninguna relacion entre la tabla donde eliminas filas y las tablas
> que
> aparecen en la clausula "from"
>
>> DELETE TABLA1
>> FROM TABLA2 INNER JOIN DELETED D ON TABLA2.PK=D.PK and D.Flag<>''
>
> De seguro este es un ejemplo que usastes para exponer tu duda, pero
> cuidado,
> porque al no relacionar la tabla donde quieres eliminar con las tablas que
> aparecen en la clausula "from", equivale a la siguiente sentencia:
>

Realmente fue un error. Fue un ejemplo rapido mal redactado. Debi ponerlo
asi :

>> DELETE TABLA1
>> FROM TABLA1 INNER JOIN DELETED D ON TABLA1.PK=D.FK and D.Flag<>''

Pero quiero aprovechar para agradecerte la excelente y detallada
explicacion. Me he quedado gratamente sorprendido. Realmente no entro mucho
al foro y no los conozco bien a los integrantes pero me imagino que eres lo
que llamamos un "gurú". Si tienes alguna página con tus artículos porque me
imagino que los tienes te agradeceria me dieras la dirección para leerlos.
Gracias nuevamente.

Saludos y muchos exitos.

Raul



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