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.
muchas gracias por la información suministrada ha sido de gran ayuda
Muy buenas tardes, muy buena la informacion, tengo una pregunta, cuando es lo maximo de informacion que soporta na variable tipo tabla?? y cuanto es aconsejable almacenar segun el numero de informacion maximo.
Gracias