martes, febrero 08, 2011

Tablas temporales en Sql Server 2000: alternativas recomendadas

En ocasiones el resultado que deseamos obtener de una tabla o un conjunto de tablas a travez de solo una sentencia de select resulta complicado e inviable porque los datos tienen que ser tratados y 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. Es necesario que se escriba sobre el disco.
  3. Al insertar datos de nuevo se produce escritura al disco (Los accesos al disco suelen ser los cuellos de botella del sistema).
  4. Al leer datos de nuevo hay que rrecurrir al disco
  5. Al borrar la tabla de nuevo hay que adquirir bloqueos sobre la base de datos tempdb y realizar operaciones en disco.
  6. 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 travez de una sola consulta.

Siempre es bueno saber en que momento usar tablas temporales, para ello debemos conocer bien su funcionamiento y limitaciones, tambien es bueno conocer las posibles alternativas y revisar el plan de ejecución a fin de obtener la consulta mas óptima.

Con SQL Server 2000 podemos usar variables de tablas. Las variables de tablas tienen una serie de ventajas frente a tablas temporales:

  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
Pero también tiene una serie de inconvenientes:

  1. Una vez declara no se puede modificar la estructura de la tabla. 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.
  2. Los indices tienen que ser agrupados
  3. No se pueden usar en una sola sentencia Insert into o select into. Primero se deve declarar la variable de tabla y luego insertar los datos correspondientes.
  4. No se puede usar funciones en las restricciones.

Para finalizar, viendo las ventajas y desventajas es mejor usar variables de tablas frente a tablas temporales, pero en el caso en que se procesen grandes cantidades de datos y se necesite la creación de indices es mejor una tabla temporal.

Se debe evaluar que opción es la mas recomendable para nuestro procedimiento almacenado, en el siguiente post sobre tablas temporales colocare algunas formas de optimar su uso.


No hay comentarios.: