Tiempo de analisis y compilación de triggers

13/06/2006 - 11:46 por edbufe1 | Informe spam
Querria saber si alguien sabe por qué se produce el tiempo de analisis y
compilación ya que son triggers con código estatico y por qué debe
compilarlos cada vez que se hace una modificación sobre la tabla que los
desencadena.
En caso de ser obligatorio. De que depende ese tiempo y como se puede mejorar.

Ya que el problema que tengo es que el tiempo de analisis y compilación es
más elevado que el tiempo de ejecución

Muchas gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
13/06/2006 - 14:14 | Informe spam
edbufe1,

Cuando SQL Server va a ejecutar un procedimiento almacenado, trigger, query,
etc, este busca si ya existe un plan de ejecucion en el cache de
procedimientos que el pueda usar. De no existir, SQL Server debe compilar y
crear el plan de ejecucion. Si el plan de ejecucion no es reusable debido a
la forma en que este esta programado (por ejemplo los objetos no son
referenciados usando el dueño) el proceso se repetira cada vez que el trigger
es invocado.

Puedes postear el codigo del trigger?


AMB


"edbufe1" wrote:

Querria saber si alguien sabe por qué se produce el tiempo de analisis y
compilación ya que son triggers con código estatico y por qué debe
compilarlos cada vez que se hace una modificación sobre la tabla que los
desencadena.
En caso de ser obligatorio. De que depende ese tiempo y como se puede mejorar.

Ya que el problema que tengo es que el tiempo de analisis y compilación es
más elevado que el tiempo de ejecución

Muchas gracias
Respuesta Responder a este mensaje
#2 edbufe1
13/06/2006 - 16:24 | Informe spam
CREATE TRIGGER actualizaCantidadPendDetFaccli_insert
ON [DETALLES_FAC_CLI]
FOR INSERT
AS
if update(cantidad)
begin
declare @codempresa varchar(5)
declare @codempresa2 varchar(5)
declare @empresa varchar(5)
declare @borrado int
declare @insertado int
declare @empresa2 varchar(5)
declare @total real
declare @fecha_hoy nvarchar(10)
declare @custom tinyint
declare @tipo varchar(10)
declare @referencia varchar(30)
declare @strselect nvarchar(4000)

declare @cantidad smallmoney
declare @almacen varchar(10)
declare @descontarAlmVenta bit



select @borrado=count(*) from inserted where npedido is not null




if @borrado<>0
begin

select top 1 @codempresa=left(nfactura,5) from inserted
select @descontarAlmVenta=descontarAlmVenta from configuracion c,inserted i
where c.nempresa=@codempresa
update detalles_ped_cli WITH (ROWLOCK) set
cantidadPend=cantidadPend-i.cantidad
from inserted as i
where i.npedido=detalles_ped_cli.npedido and
i.itempedido=detalles_ped_cli.item and i.mainitem is null and
detalles_ped_cli.npedido like @codempresa+'%'

/*Gestionamos la cantidad pendiente de servir que se inserta en la linea*/

update almacenar WITH (ROWLOCK) set p_servir=p_servir-INS.CANT
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS
where INS.referencia=almacenar.articulo and INS.almacen=almacenar.almacen
and almacenar.articulo like @codempresa+'%'
option (KEEPFIXED PLAN)
/*Gestionamos la cantidad pendiente de servir para los articulos hijos de
un articulo con escandallo fijo*/
if @descontarAlmVenta=1
begin


update almacenar WITH (ROWLOCK) set p_servir=p_servir-tmp.cantidad
from
(select art_hijo as referencia, INS.CANT*e.cantidad as
cantidad,e.almacen as alm_esc,INS.almacen as alm_pedido
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS,articulos as a,
escandallo as e
where INS.referencia=e.art_padre and e.art_padre=a.referencia and
a.escvariable=0 and a.ncircuito is null and a.referencia like @codempresa+'%'
and e.art_padre like @codempresa+'%'
) as tmp
where tmp.referencia=almacenar.articulo and
tmp.alm_pedido=almacenar.almacen and almacenar.articulo like @codempresa+'%'
option (KEEPFIXED PLAN)


end
else
begin

update almacenar WITH (ROWLOCK) set p_servir=p_servir-tmp.cantidad
from
(select art_hijo as referencia, INS.CANT*e.cantidad as
cantidad,e.almacen as alm_esc,INS.almacen as alm_pedido
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS,articulos as a,
escandallo as e
where INS.referencia=e.art_padre and e.art_padre=a.referencia and
a.escvariable=0 and a.ncircuito is null and a.referencia like @codempresa+'%'
and e.art_padre like @codempresa+'%'
) as tmp
where tmp.referencia=almacenar.articulo and
tmp.alm_esc=almacenar.almacen and almacenar.articulo like @codempresa+'%'
option (KEEPFIXED PLAN)

end

/*Gestionamos la cantidad pendiente de servir para el articulo padre*/
update almacenar WITH (ROWLOCK) set p_servir=p_servir-INS.CANT
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS,articulos a
where INS.referencia=a.referencia and almacenar.articulo=a.ref_padre and
INS.almacen=almacenar.almacen and almacenar.articulo like @codempresa+'%' and
a.referencia like @codempresa+'%'
option (KEEPFIXED PLAN)

update pedidos_cli WITH (ROWLOCK) set
nfactura=I.nfactura,estado_ped=@codempresa+'00000'
from inserted i,(select D.npedido,sum(D.cantidadPend) as suma from
detalles_ped_cli D,inserted INS where D.npedido=INS.npedido group by
D.npedido having sum(D.cantidadPend)=0) as DET
where i.npedidoÞT.npedido and pedidos_cli.npedido=i.npedido
option (KEEPFIXED PLAN)
end






end
Respuesta Responder a este mensaje
#3 Alejandro Mesa
13/06/2006 - 21:25 | Informe spam
edbufe1,

Fijate que en el codigo estas haciendo referencia a tablas sin usar el dueño.

select @descontarAlmVenta=descontarAlmVenta from configuracion

update detalles_ped_cli WITH (ROWLOCK) set

update almacenar WITH (ROWLOCK)

from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS,articulos as a,



Eso hace que el plan de ejecucion no sea reusado para diferentes usuarios
y/o cuentas.

Te recomiendo que tambien quites la opcion "KEEPFIXED PLAN", pues como
habras notado no te es de ninguna ayuda en este caso. Mas bien te puede
disminuir el desempeño si las estadisticas de los indices involucrados
cambian.

Otra sugerencia es que no hace falta contar filas para averiguar si cierta
condicion existe.

select @borrado=count(*) from inserted where npedido is not null

if @borrado<>0



if exists (select * from inserted where npedido is not null)
begin
...


AMB

"edbufe1" wrote:

CREATE TRIGGER actualizaCantidadPendDetFaccli_insert
ON [DETALLES_FAC_CLI]
FOR INSERT
AS
if update(cantidad)
begin
declare @codempresa varchar(5)
declare @codempresa2 varchar(5)
declare @empresa varchar(5)
declare @borrado int
declare @insertado int
declare @empresa2 varchar(5)
declare @total real
declare @fecha_hoy nvarchar(10)
declare @custom tinyint
declare @tipo varchar(10)
declare @referencia varchar(30)
declare @strselect nvarchar(4000)

declare @cantidad smallmoney
declare @almacen varchar(10)
declare @descontarAlmVenta bit



select @borrado=count(*) from inserted where npedido is not null




if @borrado<>0
begin

select top 1 @codempresa=left(nfactura,5) from inserted
select @descontarAlmVenta=descontarAlmVenta from configuracion c,inserted i
where c.nempresa=@codempresa
update detalles_ped_cli WITH (ROWLOCK) set
cantidadPend=cantidadPend-i.cantidad
from inserted as i
where i.npedido=detalles_ped_cli.npedido and
i.itempedido=detalles_ped_cli.item and i.mainitem is null and
detalles_ped_cli.npedido like @codempresa+'%'

/*Gestionamos la cantidad pendiente de servir que se inserta en la linea*/

update almacenar WITH (ROWLOCK) set p_servir=p_servir-INS.CANT
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS
where INS.referencia=almacenar.articulo and INS.almacen=almacenar.almacen
and almacenar.articulo like @codempresa+'%'
option (KEEPFIXED PLAN)
/*Gestionamos la cantidad pendiente de servir para los articulos hijos de
un articulo con escandallo fijo*/
if @descontarAlmVenta=1
begin


update almacenar WITH (ROWLOCK) set p_servir=p_servir-tmp.cantidad
from
(select art_hijo as referencia, INS.CANT*e.cantidad as
cantidad,e.almacen as alm_esc,INS.almacen as alm_pedido
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS,articulos as a,
escandallo as e
where INS.referencia=e.art_padre and e.art_padre=a.referencia and
a.escvariable=0 and a.ncircuito is null and a.referencia like @codempresa+'%'
and e.art_padre like @codempresa+'%'
) as tmp
where tmp.referencia=almacenar.articulo and
tmp.alm_pedido=almacenar.almacen and almacenar.articulo like @codempresa+'%'
option (KEEPFIXED PLAN)


end
else
begin

update almacenar WITH (ROWLOCK) set p_servir=p_servir-tmp.cantidad
from
(select art_hijo as referencia, INS.CANT*e.cantidad as
cantidad,e.almacen as alm_esc,INS.almacen as alm_pedido
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS,articulos as a,
escandallo as e
where INS.referencia=e.art_padre and e.art_padre=a.referencia and
a.escvariable=0 and a.ncircuito is null and a.referencia like @codempresa+'%'
and e.art_padre like @codempresa+'%'
) as tmp
where tmp.referencia=almacenar.articulo and
tmp.alm_esc=almacenar.almacen and almacenar.articulo like @codempresa+'%'
option (KEEPFIXED PLAN)

end

/*Gestionamos la cantidad pendiente de servir para el articulo padre*/
update almacenar WITH (ROWLOCK) set p_servir=p_servir-INS.CANT
from (select referencia,almacen,sum (cantidad) as CANT from inserted
where npedido is not null group by referencia,almacen) AS INS,articulos a
where INS.referencia=a.referencia and almacenar.articulo=a.ref_padre and
INS.almacen=almacenar.almacen and almacenar.articulo like @codempresa+'%' and
a.referencia like @codempresa+'%'
option (KEEPFIXED PLAN)

update pedidos_cli WITH (ROWLOCK) set
nfactura=I.nfactura,estado_ped=@codempresa+'00000'
from inserted i,(select D.npedido,sum(D.cantidadPend) as suma from
detalles_ped_cli D,inserted INS where D.npedido=INS.npedido group by
D.npedido having sum(D.cantidadPend)=0) as DET
where i.npedidoÞT.npedido and pedidos_cli.npedido=i.npedido
option (KEEPFIXED PLAN)
end






end


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