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:
Mostrar la cita
#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"

Mostrar la cita
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:

Mostrar la cita
#3 Raul
12/09/2005 - 02:06 | Informe spam
Mostrar la cita
Realmente fue un error. Fue un ejemplo rapido mal redactado. Debi ponerlo
asi :

Mostrar la cita
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
#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:

Mostrar la cita
Ads by Google
Search Busqueda sugerida