jueves, 16 de febrero de 2012

WITH RECOMPILE y FREEPROCCACHE



Continuaremos viendo las opciones que tenemos para forzar la compilación de un procedimiento almacenado, y tomando la lista de la entrada anterior (RECOMPILE o no RECOMPILE) comenzaremos con la opción WITH RECOMPILE durante la ejecución de un procedimiento.

2. Ejecutar el procedimiento almacenado con la opción RECOMPILE.

Una vez que ya tenemos el plan de ejecución de nuestro procedimiento almacenado, éste no se calculará de nuevo de forma automática.

¿Por qué nos interesaría forzar la compilación de nuestro procedimiento?

Supongamos que después de un proceso de análisis en el uso de la información, se deberminó crear una vista indexada que tomara las columnas Name y City de nuestra tabla Customers (clic aquí para ver el código para la creación de los elementos) pero como nuestro plan de ejecución ya está calculado, éste jamás tomará en cuenta nuestra nueva estructura de datos.

Para generar la vista indexada que cubra la propuesta del párrafo anterior podemos hacer lo siguiente:

CREATE VIEW vCustomers
WITH SCHEMABINDING
AS
      SELECT Id, Name, City
      FROM dbo.Customers
GO
CREATE UNIQUE CLUSTERED INDEX vCustomers_Id
ON vCustomers (Id)
GO
CREATE INDEX ixVCustomers_City
ON vCustomers (City)
Ejecutemos el código que modifica nuestro procedimiento almacenado para que no tenga el modificador RECOMPILE:
ALTER PROC pFindCustomers(
      @Column VARCHAR(30),
      @Condition VARCHAR(10)
)
AS
BEGIN
      IF @Column = 'City'
      BEGIN
            SELECT Id, Name, City, RegistrationDate
            FROM Customers
            WHERE City = @Condition
      END
      ELSE IF @Column = 'RegistrationDate'
      BEGIN
            SELECT Id, Name, City, RegistrationDate
            FROM Customers
            WHERE RegistrationDate = @Condition
      END
END

Si ejecutamos una búsqueda por fecha de registro y posteriormente vemos el plan de ejecución de la búsqueda por ciudad, vamos a ver que es el mismo.

Bien, en una nueva ventana del Management Studio vamos a escribir la siguiente sentencia, damos clic derecho sobre el editor y después elegimos “Display estimated execution plan”:

pFindCustomers 'City', '0014' WITH RECOMPILE

Veremos que con ahora ya se estará haciendo uso de nuestra vista indexada

3. Ejecutar DBCC FREEPROCCACHE

La ejecución de esta sentencia eliminará todos los planes de ejecución que hayan sido almacenados obligando a que se vuelva a calcular cada uno de ellos conforme se vayan necesitando.

Dado que cada query será “recalculado”, veremos una degradación importante en el rendimiento de nuestro gestor de bases de datos por lo que recomiendo que se use muy poco.

¿Cuándo lo utilizaría yo?, después de aplicar un “service pack” a la base de datos con mejoras de rendimiento y modificación de estructuras de almacenamiento.

En la siguiente entrada abordaremos los puntos 4 y 5 de la lista.

No hay comentarios.:

Publicar un comentario