Vous êtes sur la page 1sur 3

Artculo

Inicio Artculo BBDD

15
votar!

Tablas temporales en el SQL Server

Tablas temporales en el SQL Server Introduccin En el mundo de las bases de datos es muy comn la utilizacin de tablas temporales. A pesar de que todo el mundo sabe que este tipo de estructuras ralentizan el funcionamiento de nuestras consultas, los pro ramadores no pueden evitar recurrir a ellas porque muc!as veces facilitan la resolucin de problemas. Almacenar datos para usarlos posteriormente, uardar resultados parciales, analizar randes cantidades de filas. "ay muc!os casos en los que podemos necesitar estas tablas temporales, #ero !ay que utilizarlas correctamente! Primer consejo: no usar tablas temporales El primer conse$o que tenemos que se uir a la !ora de traba$ar con tablas temporales es bien sencillo% no usarlas. &' por qu( no) #ues !ay un montn de razones que iremos viendo a lo lar o de este te*to, pero para empezar veamos en que se traduce el utilizar una tabla temporal en +,- +erver%

-as tablas temporales se crean en tempdb, y al crearlas se producen varios bloqueos sobre esta base de datos como por e$emplo en las tablas sysob$ects y sysinde*. -os bloqueos sobre tempdb afectan a todo el servidor. Al crearlas es necesario que se realicen accesos de escritura al disco . no siempre si las tablas son peque/as0 Al introducir datos en las tablas temporales de nuevo se produce actividad en el disco, y ya sabemos que el acceso a disco suele ser el 1cuello de botella1 de nuestro sistema Al leer datos de la tabla temporal !ay que recurrir de nuevo al disco. Adem2s estos datos le3dos de la tabla suelen combinarse con otros. Al borrar la tabla de nuevo !ay que adquirir bloqueos sobre la base de datos tempdb y realizar operaciones en disco. Al usar tablas temporales dentro de un procedimiento almacenado perdemos la venta$a de tener compilado el plan de e$ecucin de dic!o procedimiento almacenado y se producir2n recompilaciones m2s a menudo. -o mismo pasar2 cuando el +,- +erver intenta reutilizar el plan de e$ecucin de una consulta parametrizada. +i en la consulta tenemos una tabla temporal dif3cilmente se reutilizar2 dic!o plan de e$ecucin. 4istos estos problemas creo que no !ace falta repetir nuestro prime conse$o. !u" podemos #acer entonces$ En vez de tablas temporales podemos me$orar nuestro cdi o para que no sean necesarias, podemos usar subconsultas .normalmente usar una subconsulta me$ora dr2sticamente el rendimiento respecto a usar tablas temporales0, usar tablas permanentes, usar tablas derivadas. "ay que recordar siempre que cualquier alternativa es buena si evitamos usar tablas temporales .cursores e*cluidos por supuesto!0 5e todos modos si al una vez tenemos que usarlas es me$or conocerlas bien, as3 que vamos a ello. Tipos de tablas temporales -as tablas temporales son de dos tipos en cuanto al alcance la tabla. 6enemos tablas temporales locales y tablas temporales lobales. %locales: -as tablas temporales locales tienen una 7 como primer car2cter en su nombre y slo se pueden utilizar en la cone*in en la que el usuario las crea. 8uando la cone*in termina la tabla temporal desaparece. %%&lobales -as tablas temporales lobales comienzan con 77 y son visibles por cualquier usuario conectado al +,+erver. ' una cosa m2s, est2s tablas desaparecen cuando nin n usuario est2 !aciendo referencias a ellas, no cuado se desconecta el usuario que la creo. Temp 9ealmente !ay un tipo m2s de tablas temporales. +i creamos una tabla dentro de la base de datos temp es una tabla real en cuanto a que podemos utilizarla como cualquier otra tabla en cualquier base de datos, y es temporal en cuanto a que desaparece en cuanto apa amos el servidor. 'uncionamiento de tablas temporales 8rear una tabla temporal es i ual que crear una tabla normal. 4e2moslo con un e$emplo%

CREATE TABLE #TablaTemporal (Campo1 int, Campo2 varchar(50))


' se usan de manera !abitual.

I !ERT I T" #TalbaTemporal #AL$E! (1,%&rimer campo%) I !ERT I T" #TalbaTemporal #AL$E! (2,%!e'(n)o campo%) !ELECT * +R", #TablaTemporal
8omo vemos no !ay pr2cticamente limitaciones a la !ora de traba$ar con tablas temporales .una limitacin es que no pueden tener restricciones :;9E<=> ?E'0. (ptimi)ar el uso de tablas temporales El uso que les podemos dar a este tipo de tablas es infinito, pero siempre teniendo en cuenta unas cuantas directivas que debemos se uir para que ralenticen nuestro traba$o lo menos posible. #or e$emplo no es mala costumbre crear las tablas temporales con comandos 55- como en el e$emplo anterior .89EA6E 6A@-E0 y lue o rellenarlas comandos <=+E96 o con <=+E96 <=6;. Es cierto que eso mismo lo podemos lo rar en un nico paso con +E-E86 <=6;, pero esta opcin es peor porque los bloqueos que se adquieren sobre ob$etos del sistema duran m2s tiempo.

8omo siempre es me$or pedir los campos que queremos y no poner el t3pico +E-86 A :9;B... 5e la misma manera es muy recomendable cualificar las filas que queremos y no tener filas que no vamos a utilizar en tablas temporales. ;tra buena costumbre es borrar nosotros nuestras tablas. +3 que es cierto que al acabar la cone*in las tablas temporales locales desaparecen, pero si tenemos un con$unto de sentencias lar o y creamos una tabla temporal al principio y no la vamos a utilizar en el resto del tiempo no tiene sentido tener esa tabla a!3 ocupando espacio y memoria. +i las tablas temporales son randes una opcin para aumentar el rendimiento es crear un 3ndice que nos ayude a recuperar los datos de esa tabla .para tablas peque/as es un asto intil porque nunca se usar2n los 3ndices0. 8olocar la base de datos tempdb en un disco dedicado solo para esta funcin aumentar2 el rendimiento lobal del sistema si se !ace un uso intensivo de tablas temporales. ' por ltimo pero no menos importante, no cre(is tablas temporales dentro de transacciones ni dentro de tri ers. creedme que la concurrencia de vuestra base de datos sufrir2 muc!o si lo !ac(is. *ariables de tabla 8on +,- +erver CDDD podemos declarar variables de tipo table. Este tipo de variables tienen una serie de venta$as sobre las tablas temporales por lo que siempre que podamos esco eremos usar variables de tabla frente a tablas temporales. Esar variables temporales es sencillo%

-ECLARE .#ariableTabla TABLE (Campo1 int, Campo2 char(50)) I !ERT I T" .#ariableTabla #AL$E! (1,%&rimer campo%) I !ERT I T" .#ariableTabla #AL$E! (2,%!e'(n)o campo%) !ELECT * +R", .#ariableTabla
4enta$as que encontraremos al usar variables de tipo tabla%

6ienen un 2mbito bien definido. El procedimiento almacenado, la funcin o el batc! en el que se declaran. -as variables de tipo tabla producen menos recompilaciones de los procedimientos almacenados en los que se encuentran que si utilizamos tablas temporales. -as variables de tabla no necesitan de bloqueos ni de tantos recursos como las tablas temporales. =o podemos cambiar la definicin de la tabla una vez declarada =o podemos utilizar 3ndices que no sean a rupados =o se pueden utilizar en <=+E96 <=6; ni en +E-E86 <=6; =o podemos utilizar funciones en las restricciones #ero tambi(n tienen inconvenientes%

+i ponemos en una balanza las venta$as y los inconvenientes vemos que en eneral es me$or utilizar las variables de tipo tabla que las tablas temporales. +olo en el caso de tener ran cantidad de datos en una tabla temporal y si la vamos a usar varias veces es preferible la opcin de tablas temporales porque en ellas podemos definir 3ndices. +n ejemplo 6odo esto est2 muy bien, pero como siempre lo me$or es ver un e$emplo en el que podamos ver que merece la pena el esfuerzo de repro ramar nuestro cdi o para no usar tablas temporales. 4amos a ver un e$emplo simple y ale$ado de la realidad pero que ilustre lo que queremos e*plicar en este te*to. 4amos a utilizar la base de datos =ort!Find. En esta base de datos los pedidos se env3an a trav(s de tres compa/3as de trasnportes% +peedy E*press.10, Enited #acGa e.C0 y :ederal +!ippin .H0. -a compa/3a :ederal +!ippin nos oferta realizar todos los env3os que !acemos a trav(s de Enited #acGa e al precio fi$o de 1DI. 5ecidimos que este a!orro merece la pena y vamos a cambiar en nuestra base de datos todos los pedidos abiertos que tienen que ser enviados por Enited #acGa e para que sean enviados a trav(s de :ederal +!ippin . #ara !acer esta actualizacin de los datos tenemos varias opciones. 4amos a comparar tres formas de !acerlo. ,etodo -: Tablas temporales

)eclare ./t )atetime !ET ./t 0'et)ate() CREATE TABLE #Act(ali1ar ("r)erI) int, !hip#ia int, +rei'ht mone2) I !ERT I T" #Act(ali1ar !ELECT "r)erI-, !hip#ia, +rei'ht +R", "r)er/ 34ERE !hip#ia02 A - !hippe)-ate I! $LL $&-ATE "r)er/ !ET !hip#ia05, +rei'ht010 34ERE "r)erI- I (!ELECT "r)erI- +R", #Act(ali1ar)-R"& TABLE #Act(ali1ar &RI T %"peracion completa)a en6 % RTRI,(ca/t()ate)i88(m/,./t,'et)ate()) a/ char(10))) 7 % mili/e'(n)o/%
' obtenemos como resultado%

(11 8ila/ a8ecta)a/) (11 8ila/ a8ecta)a/) "peracion completa)a en6 190 mili/e'(n)o/
,etodo -: *ariables tipo Tabla

-ECLARE ./t )atetime !ET ./t 0'et)ate() -ECLARE .Act(ali1ar TABLE("r)erI) int, !hip#ia int, +rei'ht mone2) I !ERT I T" .Act(ali1ar !ELECT "r)erI-, !hip#ia, +rei'ht +R", "r)er/ 34ERE !hip#ia02 A - !hippe)-ate I! $LL $&-ATE "r)er/ !ET !hip#ia05, +rei'ht010 34ERE "r)erI- I

(!ELECT "r)erI- +R", .Act(ali1ar) &RI T %"peracion completa)a en6 % rtrim(ca/t()ate)i88(m/,./t,'et)ate()) A! char(10))) 7 % mili/e'(n)o/%
' en este caso el resultado es%

(11 8ila/ a8ecta)a/) (11 8ila/ a8ecta)a/) "peracion completa)a en6 :5 mili/e'(n)o/
,etodo -: Sin Tablas temporales

-ECLARE ./t )atetime !ET ./t 0'et)ate() $&-ATE "r)er/ !ET !hip#ia05, +rei'ht010 34ERE "r)erI- I (!ELECT "r)erI- +R", "r)er/ 34ERE !hip#ia02 A - !hippe)-ate I! $LL) &RI T %"peracion completa)a en6 % 7 rtrim(ca/t()ate)i88(m/,./t,'et)ate()) A! char(10))) 7 % mili/e'(n)o/%
' por ltimo obtenemos%

(11 8ila/ a8ecta)a/) "peracion completa)a en6 50 mili/e'(n)o/


5esde lue o este e$emplo no es si nificativo, y en cada caso !ay que estudiar la situacin y comparar los resultados obtenidos en un entorno de traba$o para saber cual es la me$or opcin, pero de todos modos espero que esto os sirva al menos para conocer un poco me$or a las 1tablas temporales1.

Vous aimerez peut-être aussi