Compilación de un trigger

11/05/2006 - 19:36 por Jesús | Informe spam
Hola a todos:



Tengo un par de tablas en sql Server: tabla1 y tabla2. En ambas tablas tengo
aproximadamente 10 millones de registros.

En la tabla1 existe un trigger que actualiza la tabla2 al insertar un
registro en la tabla1.

Cuando inserto el registro por primera vez en la tabla1 el tiempo medido de
inserción en la tabla1 es de 16 segundos. Las sucesivas inserciones tardan
milisegundos.

He analizado todo el proceso en el analizador de consultas del SQL Server.
Para ello he usado SET STATISTICS TIME ON/OFF:

SET STATISTICS TIME ON

Insert en tabla1

SET STATISTICS TIME OFF



En la primera ejecución obtengo el siguiente tiempo:

Tiempo de análisis y compilación de SQL Server:

Tiempo de CPU = 12278 ms., tiempo transcurrido = 16576 ms.



En las sucesivas ejecuciones obtengo el siguiente tiempo:



Tiempo de análisis y compilación de SQL Server:

Tiempo de CPU = 0 ms., tiempo transcurrido = 94 ms.



Parece ser que el SQL Server, en la primera ejecución, está compilando y
analizando el código y de ahí ese elevado tiempo que se obtiene en la primera
ejecución. Es decir, la ejecución de la instrucción insert y del triger tarda
milisegundos. El problema es dicha compilación inicial.



Para poder confirmar esto he realizado las siguientes pruebas:

PRUEBA 1. Eliminación del trigger. RESULTADO: La ejecución de la instrucción
insert tarda milisegundos.

PRUEBA 2. He modificado el trigger para evitar que ejecute código. Es decir,
le he añadido una instrucción “if” al principio que nunca se cumple. De esta
forma el trigger está creado en la b.d., pero no ejecuta ningún código ya que
la condición nunca se cumple. RESULTADO: La primera ejecución tarda 16
segundos y las sucesivas milisegundos. Es decir el resultado es el mismo que
para el trigger original.



¿Como puedo evitar que el SQL Server compile el código del trigger?

No sé si es un tema de configuración del SQL Server o tengo que programar el
trigger de una forma determinada.


Disculpad por el rollo pero necesitaba dar esta explicación del problema
Agradecería cualquier tipo de ayuda al respecto. Muchas gracias.

Jesús Corbí
 

Leer las respuestas

#1 Alejandro Mesa
11/05/2006 - 19:54 | Informe spam
Jesús,

Correcto, SQL Server compila el codigo del trigger para ponerlo en el cache
de procedimientos y asi poder usar el plan de ejecucion en futuras
inserciones sin necesidad de volverlo a compilar.

No conozco de algun setting para evitar esto. Es como tratar de setear SQL
Server para que no compile un procedimiento almacenado.


AMB

"Jesús" wrote:

Hola a todos:



Tengo un par de tablas en sql Server: tabla1 y tabla2. En ambas tablas tengo
aproximadamente 10 millones de registros.

En la tabla1 existe un trigger que actualiza la tabla2 al insertar un
registro en la tabla1.

Cuando inserto el registro por primera vez en la tabla1 el tiempo medido de
inserción en la tabla1 es de 16 segundos. Las sucesivas inserciones tardan
milisegundos.

He analizado todo el proceso en el analizador de consultas del SQL Server.
Para ello he usado SET STATISTICS TIME ON/OFF:

SET STATISTICS TIME ON

Insert en tabla1

SET STATISTICS TIME OFF



En la primera ejecución obtengo el siguiente tiempo:

Tiempo de análisis y compilación de SQL Server:

Tiempo de CPU = 12278 ms., tiempo transcurrido = 16576 ms.



En las sucesivas ejecuciones obtengo el siguiente tiempo:



Tiempo de análisis y compilación de SQL Server:

Tiempo de CPU = 0 ms., tiempo transcurrido = 94 ms.



Parece ser que el SQL Server, en la primera ejecución, está compilando y
analizando el código y de ahí ese elevado tiempo que se obtiene en la primera
ejecución. Es decir, la ejecución de la instrucción insert y del triger tarda
milisegundos. El problema es dicha compilación inicial.



Para poder confirmar esto he realizado las siguientes pruebas:

PRUEBA 1. Eliminación del trigger. RESULTADO: La ejecución de la instrucción
insert tarda milisegundos.

PRUEBA 2. He modificado el trigger para evitar que ejecute código. Es decir,
le he añadido una instrucción “if” al principio que nunca se cumple. De esta
forma el trigger está creado en la b.d., pero no ejecuta ningún código ya que
la condición nunca se cumple. RESULTADO: La primera ejecución tarda 16
segundos y las sucesivas milisegundos. Es decir el resultado es el mismo que
para el trigger original.



¿Como puedo evitar que el SQL Server compile el código del trigger?

No sé si es un tema de configuración del SQL Server o tengo que programar el
trigger de una forma determinada.


Disculpad por el rollo pero necesitaba dar esta explicación del problema
Agradecería cualquier tipo de ayuda al respecto. Muchas gracias.

Jesús Corbí

Preguntas similares