2010-04-15 29 views
6

Tengo un procedimiento almacenado dentro del cual creo una tabla temporal que generalmente contiene entre 1 y 10 filas. Esta tabla se trunca y se llena muchas veces durante el procedimiento almacenado. Se trunca porque es más rápido que eliminar. Obtengo un aumento en el rendimiento reemplazando esta tabla temporal con una variable de tabla cuando sufro una penalización por usar delete (truncar no funciona en variables de tabla)SQL Server, tablas temporales con truncar contra variable de tabla con eliminar

Mientras que las variables de tabla están principalmente en la memoria y generalmente son más rápidas que la temperatura ¿Pierdo algún beneficio al tener que eliminar en lugar de truncar?

+5

¿Por qué no probarlo? – spender

Respuesta

11

Ejecución del followign a los scripts, parecería que el tabla de variables es la mejor opción

CREATE TABLE #Temp(
     ID INT 
) 

DECLARE @Int INT, 
     @InnerInt INT 
SELECT @Int = 1, 
     @InnerInt = 1 

WHILE @Int < 50000 
BEGIN 
    WHILE @InnerInt < 10 
    BEGIN 
     INSERT INTO #Temp SELECT @InnerInt 
     SET @InnerInt = @InnerInt + 1 
    END 
    SELECT @Int = @Int + 1, 
      @InnerInt = 1 
    TRUNCATE TABLE #Temp 
END 

DROP TABLE #TEMP 

GO 

DECLARE @Temp TABLE(
     ID INT 
) 

DECLARE @Int INT, 
     @InnerInt INT 
SELECT @Int = 1, 
     @InnerInt = 1 

WHILE @Int < 50000 
BEGIN 
    WHILE @InnerInt < 10 
    BEGIN 
     INSERT INTO @Temp SELECT @InnerInt 
     SET @InnerInt = @InnerInt + 1 
    END 
    SELECT @Int = @Int + 1, 
      @InnerInt = 1 
    DELETE FROM @Temp 
END 

Analizador de SQL

CPU  Reads Writes Duration 
36375  2799937 0  39319 

vs 

CPU  Reads Writes Duration 
14750 1700031 2  17376 
+8

Sería más exacto decir que 'DELETE' es la mejor opción. Nada que ver con las variables de la tabla, obtienes lo mismo con una tabla '# temp' y BORRAR. Este es un buen caso en el sentido de que las 10 filas caben en una página. 'TRUNCATE' desasigna la última página de la tabla y' DELETE' no. Las tablas son muy pequeñas, por lo que la sobrecarga del registro de las filas eliminadas es menor que la sobrecarga de la desasignación constante y la reasignación de una sola página en la tabla. [Para tablas más grandes, la historia es diferente] (http://dba.stackexchange.com/q/27309) –

+0

Entonces ... ¿truncar sería mejor para una tabla más grande con, digamos, 1000 filas? Truncar es típicamente más rápido para borrar datos que un borrado, ya que lo purga indiscriminadamente y no escribe tanto en el registro como eliminando filas individuales. – Triynko

7

Francamente, con sólo el 10 o el 20 (o incluso 100) entradas, cualquier diferencia en la velocidad estaría en un reino de sub-nanosegundos. Olvídalo, no desperdicies ni un segundo de tu cerebro en esto, ¡no hay problema!

En generales

  • variables de tabla se guardará en la memoria hasta un cierto tamaño - si van más allá de eso, están cambiados al disco en la base de datos tempdb, también - al igual que las tablas temporales. Además: si una tabla temporal tiene solo un puñado de entradas, lo más probable es que se almacenen en una única página de 8k, y tan pronto como acceda a una de las entradas, esa página completa (y por lo tanto toda la tabla temporal) se estar en la memoria de SQL Server, así que incluso aquí, no hay muchos beneficios para las variables de tabla ...

  • las variables de tabla no admiten índices ni estadísticas, lo que significa que si tiene más de un puñado de entradas , y sobre todo si es necesario buscar y consultar esta "entidad", que está mejor con una tabla temporal

Así que en general: yo personalmente uso tablas temporales con más frecuencia que las variables de tabla, sobre todo si tener más de 1 0 entradas o algo así. Ser capaz de indexar la tabla temporal, y tener estadísticas sobre ella, por lo general paga a lo grande en comparación con cualquier ganancia potencial que una variable de tabla pueda tener, en cuanto al rendimiento.

+2

Gracias, acepto que la diferencia entre eliminar y truncar es probablemente insignificante. En realidad, se trataba de una cuestión académica, ya que el intercambio de las tablas temporales de las variables de la tabla en mi procedimiento suponía un 10% de diferencia. Como dijo "Spender", acabo de probarlo. – Richard

+0

Me estaba preguntando con mi situación similar a OP. La tabla de temperatura puede ser de 10, 25 o 250 filas, según cómo se configuren los datos.En mi escenario de prueba 15 filas, comparé los Planes de ejecución real en un proceso que tiene una tabla temporal que se itera, luego se reutiliza nuevamente en el bucle externo. No queremos tener datos obsoletos, por lo que borramos la tabla temporal con DELETE. Esto aparece en los planes de ejecución en el 4% del lote (sus lotes complejos están en marcha). ¡Si lo reemplazo con TRUNCATE no está en el plan en absoluto! ¿Es ese comportamiento normal de truncado (no aparece en los planes del ejecutivo) o es tan trivial que es irrelevante para los planes? –

Cuestiones relacionadas