2009-10-29 11 views
9

Estamos experimentando problemas de rendimiento al usar una variable de tabla en un Procedimiento almacenado.Rendimiento deficiente de la tabla en la inserción en SQL Server Procedimiento almacenado

Esto es lo que realmente sucede:

DECLARE @tblTemp TABLE(iId_company INT) 

INSERT INTO @tblTemp(iId_company) 
    SELECT id FROM ..... 

El SELECT devuelve 138 resultados, pero la inserción en la variable TABLA toma 1min15 pero cuando se utiliza una tabla temporal con el mismo SELECT, woops, toma 0sec:

CREATE TABLE #temp (iId_company INT) 

INSERT INTO #temp(iId_company) 
    SELECT id FROM ... 

¿Qué podría causar el comportamiento?

Respuesta

10

Usa una tabla temporal. Verás un rendimiento mucho mejor.

Una explicación detallada para el razonamiento detrás de esto es más allá del alcance de la pregunta inicial sin embargo para resumir:

  • una variable de tabla está optimizado para una fila, por SQL Server es decir, que asume 1 fila Será devuelto.
  • Una variable de tabla no crea estadísticas .

Google tabla temporal Vs. tabla variable por una gran cantidad de recursos y discusiones. Si luego necesita ayuda específica, envíeme un correo electrónico o contácteme en Twitter.

0

Generalmente, para conjuntos de datos más pequeños, una variable de tabla debe ser más rápida que una tabla temporal. Para conjuntos de datos más grandes, el rendimiento disminuirá porque las variables de la tabla no admiten el paralelismo (consulte this post).

Dicho esto, no he experimentado, o he encontrado experiencia con un conjunto de datos tan pequeño que es más lento para una tabla variable vs una tabla temporal.

0

No es que importe, pero ¿cómo se ve su selección? Tuve un problema en SQL Server 2005 donde mi selección por sí sola se ejecutó relativamente rápido para lo que mi consulta estaba haciendo, digamos 5 minutos para devolver todos los datos a través del cable alrededor de 150,000 filas. Pero cuando traté de insertar esa misma selección en una tabla temporal o variable de tabla, la instrucción se ejecutó durante más de 1 hora antes de que la matara. Todavía tengo que descubrir qué estaba pasando realmente. Terminé agregando el orden de la fuerza de sugerencia de consulta y comenzó a insertar más rápido.

0

El punto clave acerca de las tablas temporales también es que puede poner índices, etc. en ellas, mientras que no puede hacerlo con las variables de la tabla.

Cuestiones relacionadas