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í

Preguntas similare

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í

Respuesta Responder a este mensaje
#2 Jesús
12/05/2006 - 19:50 | Informe spam
¿Pero no se puede hacer que se compile una sóla vez y no se compile más a
menos que se cambie el código fuente del trigger?

Hay alguna forma de mejorar o reducir este tiempo. Resulta intratable que lo
compile tan a menudo .

Gracias

Jesús

"Alejandro Mesa" escribió:

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í
>
Respuesta Responder a este mensaje
#3 Miguel Egea
12/05/2006 - 23:04 | Informe spam
Si se te compila muy a menudo puede ser que te falte memoria en el sistema y
por eso SQL decida sacarlo. Usa el perfmon para capturar el cache hit ratio
a ver que valores tienes.

También puedes intentar usar hints como index, o el tipo de join para
simplificar la compilación..


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar para
obtener soluciones y educación avanzada para la plataforma completa de
sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com



"Jesús" escribió en el mensaje
news:
¿Pero no se puede hacer que se compile una sóla vez y no se compile más a
menos que se cambie el código fuente del trigger?

Hay alguna forma de mejorar o reducir este tiempo. Resulta intratable que
lo
compile tan a menudo .

Gracias

Jesús

"Alejandro Mesa" escribió:

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í
>
Respuesta Responder a este mensaje
#4 Jesús Corbí
15/05/2006 - 09:24 | Informe spam
Gracias Miguel y Alejandro.

Miguel, No comprendo muy bien a que te refireres en el segundo párrafo. ¿Me
podrías explicar algo más sobre cómo reducir los tiempos de compilación
independientemente del hardware?

Gracis por anticipado.

Jesús Corbí

"Miguel Egea" escribió:

Si se te compila muy a menudo puede ser que te falte memoria en el sistema y
por eso SQL decida sacarlo. Usa el perfmon para capturar el cache hit ratio
a ver que valores tienes.

También puedes intentar usar hints como index, o el tipo de join para
simplificar la compilación..


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar para
obtener soluciones y educación avanzada para la plataforma completa de
sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com



"Jesús" escribió en el mensaje
news:
> ¿Pero no se puede hacer que se compile una sóla vez y no se compile más a
> menos que se cambie el código fuente del trigger?
>
> Hay alguna forma de mejorar o reducir este tiempo. Resulta intratable que
> lo
> compile tan a menudo .
>
> Gracias
>
> Jesús
>
> "Alejandro Mesa" escribió:
>
>> 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í
>> >



Respuesta Responder a este mensaje
#5 Miguel Egea
15/05/2006 - 10:15 | Informe spam
Usando Hints, lo normal es que tarde menos en compilarse porque tiene menos
decisiones que tomar.

Para los índices puedes usar with index(indexid) y para los joins puedes
especificar el tipo de join a usar
<join_hint> :: { LOOP | HASH | MERGE | REMOTE }de esta forma esas decisiones no tiene
por qué tomarlas el optimizadorde consultasEn SQL Server 2005 hay más
opciones con los plan guides:Este código genera un plan de ejecución que
será rehusado directamente cuando se ejecute este tipo de comando.Saludos
SELECT * FROM SYS.PLAN_GUIDESGODECLARE @stmt nvarchar(max)DECLARE @params
nvarchar(max)EXEC sp_get_query_template N'SELECT * FROM EjemploDeTabla Where
Valor=1 ',@stmt OUTPUT, @params OUTPUTselect @stmtEXEC sp_create_plan_guide
N'TemplateGuide1', @stmt, N'TEMPLATE', NULL, @params,
N'OPTION(PARAMETERIZATION SIMPLE)'GO


"Jesús Corbí" escribió en el mensaje
news:
Gracias Miguel y Alejandro.

Miguel, No comprendo muy bien a que te refireres en el segundo párrafo.
¿Me
podrías explicar algo más sobre cómo reducir los tiempos de compilación
independientemente del hardware?

Gracis por anticipado.

Jesús Corbí

"Miguel Egea" escribió:

Si se te compila muy a menudo puede ser que te falte memoria en el
sistema y
por eso SQL decida sacarlo. Usa el perfmon para capturar el cache hit
ratio
a ver que valores tienes.

También puedes intentar usar hints como index, o el tipo de join para
simplificar la compilación..


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para
obtener soluciones y educación avanzada para la plataforma completa de
sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com



"Jesús" escribió en el mensaje
news:
> ¿Pero no se puede hacer que se compile una sóla vez y no se compile más
> a
> menos que se cambie el código fuente del trigger?
>
> Hay alguna forma de mejorar o reducir este tiempo. Resulta intratable
> que
> lo
> compile tan a menudo .
>
> Gracias
>
> Jesús
>
> "Alejandro Mesa" escribió:
>
>> 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í
>> >



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