Consejos para optimizar el uso de tablas temporales en SQL Server

Publicada en Publicada en SQL Server

Compartelo con tus amigos!

En ocasiones no es viable obtener un resultado de una tabla o un conjunto de tablas a través de una sentencia select porque los datos tienen que ser procesados a fin de mostrar la información de acuerdo a nuestra necesidad, por lo cual es inevitable el uso de tablas temporales dentro de los procedimientos almacenados.

Pero la solución en base a tablas temporales resulta perjudicial para el desempeño del servidor de base de datos por eso se recomienda no usarlas. ¿Y porque no usar tablas temporales? Las razones las menciono a continuación:

  1. Las tablas temporales se crean en el tempdb y al crearlas se producen bloqueos sobre esta base de datos como por ejemplo en las tablas sysobjects y sysindexes. Los bloqueos sobre el la tempdb afectan a todo el servidor.
  2. Al insertar y consultar se produce operaciones de I/O sobre el disco (Los accesos al disco suelen ser los cuellos de botella del sistema).
  3. Al borrar la tabla de nuevo hay que adquirir bloqueos sobre la base de datos tempdb y realizar operaciones en disco.
  4. Si la consulta dentro de un procedimiento almacenado tiene una tabla temporal difícilmente se reutilizará el plan de ejecución.

Siempre la mejor solución es obtener los datos a través de una sola consulta, por esta razón, debemos saber en que momento usar tablas temporales siendo conscientes de su funcionamiento y limitaciones. También es bueno conocer las posibles alternativas y revisar el plan de ejecución a fin de obtener la consulta mas óptima.

Desde SQL Server 2000 Microsoft introdujo el concepto de variable de tablas, la cual tienen una serie de ventajas frente a tablas temporales. Estas son:

  1. Solo existe en el ámbito en que fue definido.
  2. Producen menos recompilación de procedimientos almacenados.
  3. No necesitan de bloqueos ni de tantos recursos.
  4. Se crean en memoria lo cual produce menos overhead que la tabla temporal
  5. Pero también tiene una serie de inconvenientes:

Una vez declarado una variable de tabla no se puede modificar la estructura. Por ejemplo, si dentro de procedimiento almacenado hemos definido una variable de tabla con los campos código y nombre y luego de declararla queremos alterar la tabla para agregar la columna importe no nos va a permitir. Tampoco se pueden usar en una sola sentencia Insert into o select into, primero se debe declarar para luego insertar.
No se puede usar funciones en las restricciones.

En conclusión, revisando las ventajas y desventajas, podríamos pensar que es mejor usar una variable de tabla frente a una tabla temporal, pero en los casos donde se procesan grandes cantidades de datos y se necesita la creación de indices es mejor una tabla temporal. Por esta razón, se debe evaluar que opción es la mas recomendable para nuestro escenario.

Compartelo con tus amigos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *