.net - uso - Procedimiento almacenado que causa tiempo de espera solo cuando se ejecuta desde la aplicación



procedimientos almacenados sql ventajas y desventajas (4)

¿Puedes estar seguro de que no hay una situación de estancamiento? La ejecución del estudio de gestión estaría aislada, ya que a partir de la aplicación, esto podría ser parte de una transacción mayor.

https://src-bin.com

Nos encontramos con un problema con una sp.

Tenemos una sp bastante simple que contiene una tabla declarada y un par de combinaciones externas que al final devuelve entre 20 y 100 filas.

Debido a que la consulta de esta sp nos ha estado brindando un rendimiento deficiente tanto en producción como en ambiente de pruebas, recientemente la hemos reescrito para que sea más eficiente y haya probado a fondo con un gran rendimiento en nuestro entorno de prueba.

Lo lanzamos a producción solo para descubrir que todavía es muy lento y está causando que nuestra aplicación .NET 2.0 agote el tiempo de espera cuando se la llama.

No entendimos nada y entramos a Management Studio en la base de datos de producción y ejecutamos el sp allí, se ejecuta menos de 1 segundo.

Es decir, cuando se ejecuta desde nuestra aplicación, es extremadamente lento y causa tiempos de espera, cuando se ejecuta desde Management Studio es muy rápido y nunca demora más de un segundo.

¿Alguien con un buen conocimiento de SQL Server 2005 nos puede dar una pista al respecto?


Answer #1

Asegúrese de que su base de datos de producción tenga estadísticas actualizadas y los índices estén en buenas condiciones (si es posible, considere reconstruir los índices involucrados).


Answer #2

Creo que su problema podría ser "Parameter sniffing". Es un proceso en el que el entorno de ejecución de SQL Server "olfatea" los valores de los parámetros sp durante la compilación o recompila para generar planes de ejecución más rápidos. Pero a veces se obtiene una combinación de parámetros que junto con los datos actuales que devolverá la sp, hace una sp realmente lenta.

Hay un par de buenas explicaciones por ahí. Busque en . Este es uno es bueno: http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html

Una posible solución es crear variables locales en sp y establecer los valores de parámetros entrantes para ellas. Luego use solo las variables locales en la sp.

CREATE PROCEDURE [dbo].spTest
  @FromDate as DATETIME
AS
BEGIN
  DECLARE @FromDate_local as DATETIME
  SET @FromDate_local = '2009-01-01'

  SET @FromDate_local = @FromDate
  ...
  SELECT * FROM TestTbl WHERE FromDate >= @FromDate_local
END





.net-2.0