serian eficiente estos triggers

04/01/2004 - 16:59 por Yovanny Rojas | Informe spam
Hola amigos de foro:
Quiero hacer una consulta sobre triggers con relacion a que tan lento
pondrian estos mi aplicación

Me refiero si la tabla detalles seria de miles de registros y lo acumulara
en en la tabla de acumulaciones que presento a continuación, seria eficiente
esto y se podria usar en muchas tablas mi aplicacion esta hecha en visual
basic 6

Gracias.




Creación de triggers con Sql-Server
15 de Agosto de 2001


Todo lo que viene a continuación es código fuente con un ejemplo de como
usar las tablas inserted y deleted en triggers para que en insercciones
masivas
de datos no solamente tengamos acceso al primer elemento insertado o borrado
sino a todos, además evita el uso de cursores que enlentecen siempre el
proceso.

Observad que no borro las tablas temporales #insertados y #eliminados
ya que por definición su alcance es local al procedimiento (trigger en este
caso).


Bien, al código
Si quereis probarlo es suficiente con copiar y pegar a partir del create
table.
A disfrutar.

Create table detalles (id int identity(1,1) not null primary key,
Descripcion varchar(80) not null,
Codigo int ,
Cantidad int,
Precio money)
go -- y otra para guardar los acumulados .
create table acumulados (Codigo int not null, Cantidad int, Totalprecio
money)
go


create trigger trg_Detalles on detalles
for insert,update,delete -- Actuaré se haga lo que se haga desde este
trigger
as
insertando
registro.

select

Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #insertados
From inserted
group by codigo


update acumulados
set Acumulados.cantidad= Acumulados.cantidad +insertados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio + insertados.precio
from #insertados insertados inner join acumulados on acumulados.codigo
=insertados.codigo
acumulados
insert into acumulados
select
inserted.Codigo,Sum(inserted.Cantidad),sum(inserted.precio*inserted.cantidad
)
from inserted left outer join Acumulados on inserted.codigo acumulados.codigo
where acumulados.codigo is null
group by inserted.codigo


go


insert into detalles values ('Primer elemento',1,1,1500)
go
select * from acumulados


go
insert into detalles values ('10 Unidades del primer elemento',1,10,1500)
go
select * from acumulados

existente,
es correcta


insert into detalles values ('10 Unidades del segundo elemento',2,10,1500)
go

insert into detalles select descripcion,codigo,cantidad,precio from detalles
go
select * from acumulados
go




alter trigger trg_Detalles on detalles
for insert,update,delete -- Actuaré se haga lo que se haga desde este
trigger
as

insertando
registro.

select

Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #insertados
From inserted
group by codigo


update acumulados
set Acumulados.cantidad= Acumulados.cantidad +insertados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio + insertados.precio
from #insertados insertados inner join acumulados on acumulados.codigo
=insertados.codigo

acumulados

insert into acumulados
select
inserted.Codigo,Sum(inserted.Cantidad),sum(inserted.precio*inserted.cantidad
)
from inserted left outer join Acumulados on inserted.codigo acumulados.codigo
where acumulados.codigo is null
group by inserted.codigo



Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #Eliminados
From Deleted
group by codigo


update acumulados
set Acumulados.cantidad= Acumulados.cantidad - eliminados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio - eliminados.precio
from #Eliminados eliminados inner join acumulados on acumulados.codigo eliminados.codigo

existiesen
¿Nó?
go

delete from detalles where id=1
go
select * from acumulados
go

delete from detalles
go
select * from acumulados


insert into detalles values ('10 Unidades del primer elemento',1,10,1500)
insert into detalles values ('Otras 10 Unidades del primer
elemento',1,10,1500)
insert into detalles values ('10 Unidades del segundo elemento',2,10,1500)
go
select * from acumulados
go
update detalles set cantidad=cantidad*2 where codigo=1
go
select * from acumulados
go

update detalles set cantidad=0
go
select * from acumulados
go
delete from detalles
go
select * from acumulados
go
 

Leer las respuestas

#1 Adrian Garcia
05/01/2004 - 00:52 | Informe spam
En mi opinion personal lo que lograrias es lo siguiente:

a) Buena performance en las lecturas que necesiten el valor acumulado
b) Pesima perfomance en tus actualizaciones. Por cada fila que insertes
(seguramente la operacion mas abitual) en la tabla de detalle debera ademas
actualizar la fila correspondiente a la tabla de cabecera.

Creo que podrias tener una decente perfomance en las lecturas y una buena
perfomance en las inserciones si defines correctamente las claves primarias,
si por ejemplo, defines tu clave primaria de la tabla detalle incluyendo en
su primera columna al id de la columna de la cabecera, SQL Server definira
un indice agrupado (cluster) sobre la clave primaria, con lo cual, todas las
filas pertenecientes a un fila de cabecera estaran fisicamente contiguas
reduciendo al maximo la cantidad de lecturas de paginas necesarias para
obtener el total.

Saludos
Adrian D. Garcia
NDSoft


"Yovanny Rojas" wrote in message
news:
Hola amigos de foro:
Quiero hacer una consulta sobre triggers con relacion a que tan lento
pondrian estos mi aplicación

Me refiero si la tabla detalles seria de miles de registros y lo acumulara
en en la tabla de acumulaciones que presento a continuación, seria


eficiente
esto y se podria usar en muchas tablas mi aplicacion esta hecha en visual
basic 6

Gracias.




Creación de triggers con Sql-Server
15 de Agosto de 2001


Todo lo que viene a continuación es código fuente con un ejemplo de como
usar las tablas inserted y deleted en triggers para que en insercciones
masivas
de datos no solamente tengamos acceso al primer elemento insertado o


borrado
sino a todos, además evita el uso de cursores que enlentecen siempre el
proceso.

Observad que no borro las tablas temporales #insertados y #eliminados
ya que por definición su alcance es local al procedimiento (trigger en


este
caso).


Bien, al código
Si quereis probarlo es suficiente con copiar y pegar a partir del create
table.
A disfrutar.

Create table detalles (id int identity(1,1) not null primary key,
Descripcion varchar(80) not null,
Codigo int ,
Cantidad int,
Precio money)
go -- y otra para guardar los acumulados .
create table acumulados (Codigo int not null, Cantidad int, Totalprecio
money)
go


create trigger trg_Detalles on detalles
for insert,update,delete -- Actuaré se haga lo que se haga desde este
trigger
as
insertando
registro.

select

Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #insertados
From inserted
group by codigo


update acumulados
set Acumulados.cantidad= Acumulados.cantidad +insertados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio + insertados.precio
from #insertados insertados inner join acumulados on acumulados.codigo
=insertados.codigo
acumulados
insert into acumulados
select



inserted.Codigo,Sum(inserted.Cantidad),sum(inserted.precio*inserted.cantidad
)
from inserted left outer join Acumulados on inserted.codigo > acumulados.codigo
where acumulados.codigo is null
group by inserted.codigo


go


insert into detalles values ('Primer elemento',1,1,1500)
go
select * from acumulados


go
insert into detalles values ('10 Unidades del primer elemento',1,10,1500)
go
select * from acumulados

existente,
es correcta


insert into detalles values ('10 Unidades del segundo elemento',2,10,1500)
go

insert into detalles select descripcion,codigo,cantidad,precio from


detalles
go
select * from acumulados
go




alter trigger trg_Detalles on detalles
for insert,update,delete -- Actuaré se haga lo que se haga desde este
trigger
as

insertando
registro.

select

Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #insertados
From inserted
group by codigo


update acumulados
set Acumulados.cantidad= Acumulados.cantidad +insertados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio + insertados.precio
from #insertados insertados inner join acumulados on acumulados.codigo
=insertados.codigo

acumulados

insert into acumulados
select



inserted.Codigo,Sum(inserted.Cantidad),sum(inserted.precio*inserted.cantidad
)
from inserted left outer join Acumulados on inserted.codigo > acumulados.codigo
where acumulados.codigo is null
group by inserted.codigo



Select Codigo,Sum(Cantidad) Cantidad,Sum(cantidad*Precio) precio
into #Eliminados
From Deleted
group by codigo


update acumulados
set Acumulados.cantidad= Acumulados.cantidad - eliminados.cantidad ,
Acumulados.TotalPrecio = Acumulados.TotalPrecio - eliminados.precio
from #Eliminados eliminados inner join acumulados on acumulados.codigo > eliminados.codigo

existiesen
¿Nó?
go

delete from detalles where id=1
go
select * from acumulados
go

delete from detalles
go
select * from acumulados


insert into detalles values ('10 Unidades del primer elemento',1,10,1500)
insert into detalles values ('Otras 10 Unidades del primer
elemento',1,10,1500)
insert into detalles values ('10 Unidades del segundo elemento',2,10,1500)
go
select * from acumulados
go
update detalles set cantidad=cantidad*2 where codigo=1
go
select * from acumulados
go

update detalles set cantidad=0
go
select * from acumulados
go
delete from detalles
go
select * from acumulados
go




Preguntas similares