Las tablas temporales son consideradas tablas regulares, y estas se almacenan automáticamente en la base de datos  tempdb, por lo que al crearlas producen varios bloqueos como por ejemplo en las tablas sysobjects y sysindexes. Los bloqueos sobre la tempdb afectan a todo el servidor.

De igual manera, en cada una de las acciones CREATE, INSERT y SELECT de una tabla temporal se hacen accesos de escritura al disco, y esto suele ser el “cuello de botella” del sistema.

Al usar tablas temporales dentro de un procedimiento almacenado perdemos la ventaja de tener compilado el plan de ejecución de dicho procedimiento y se producirán recompilaciones más a menudo.

En cambio, las variables tipo tabla producen menos compilaciones de los procedimientos almacenados, no necesitan de bloqueos ni de tantos recursos como las tablas temporales. Lo más notorio es que las variables del tipo tabla apuntan a estructuras en memoria con lo cual producen menos overhead que las tablas temporales.

Ejemplo:

Con tabla temporal:

DECLARE @st datetime

SET @st =getdate()

CREATE TABLE #Actualizar
(Id int, TypeID int, Amount money)

INSERT INTO #Actualizar
SELECT ID, TypeID, TotalAmmount
FROM Invoices with (nolock)
WHERE [ISNULL] = 0
AND CompanyID = 5
AND TypeID = 40

UPDATE Invoices
SET TypeID=3,
TotalAmmount=10
WHERE ID IN   (SELECT ID FROM #Actualizar)

DROP TABLE #Actualizar

PRINT ‘Operacion completada en: ‘  + RTRIM(cast(datediff(ms,@st,getdate()) as char(10)))  + ‘ milisegundos’

 

Resultados:

(2435 row(s) affected)

(2435 row(s) affected)
Operacion completada en: 376 milisegundos

 

Con variable tipo tabla:

DECLARE @st datetime

SET @st =getdate()

DECLARE @Actualizar TABLE
(Id int, TypeID int, Amount money)

INSERT INTO @Actualizar
SELECT ID, TypeID, TotalAmmount
FROM Invoices with (nolock)
WHERE [ISNULL] = 0
AND CompanyID = 5
AND TypeID = 40

UPDATE Invoices
SET TypeID=3,
TotalAmmount=10
WHERE ID IN   (SELECT ID FROM @Actualizar)

PRINT ‘Operacion completada en: ‘  + RTRIM(cast(datediff(ms,@st,getdate()) as char(10)))  + ‘ milisegundos’

Resultado:

(2435 row(s) affected)

(2435 row(s) affected)
Operacion completada en: 166 milisegundos

 

Si ponemos en una balanza las ventajas y los inconvenientes vemos que en general es mejor utilizar las variables de tipo tabla que las tablas temporales. Sólo en el caso de tener gran cantidad de datos y si la vamos a usar varias veces es preferible la tabla temporal, porque en ellas sí podemos definir índices.