Tablas Temporales

27/12/2004 - 11:36 por Javier Carrascal | Informe spam
Buenos días y FELIZ NAVIDAD !!! a todo el foro.

Me gustaría haber si me pueden ayudar en la siguiente cuestión. Tengo un SP
en el cuál, creo una tabla temporal ... el caso, es que he llegado a leer
por ahí, que es más optimo crear una variable de tipo TABLE, antes que crear
una tabla temporal. Esto que tiene de cierto ??? cuál de las dos soluciones
es más optima ???

Más gráficamente, cuál de estas dos sentencias es más optima:

DECLARE @PuntosControl TABLE (
id_area BIGINT,
id_servicio BIGINT,
numero_mapa INT)

CREATE TABLE #PuntosControl (
id_area BIGINT,
id_servicio BIGINT,
numero_mapa INT)

Salu2

Preguntas similare

Leer las respuestas

#6 Javier Carrascal
27/12/2004 - 16:41 | Informe spam
Intentaré ser lo más explicito posible, pero la query en si es complicada
... te pongo un poco en ámbito ...

Mi intención es sacar un informe estadístico, en cuanto a desfases de tiempo
se refiere ... Para ello, dispongo de una tabla de vehículos y de una tabla
de itinerarios, por lo que se deduce que un vehículo tiene asignado una
serie de itinerarios. Centrandonos un poco más en los itinerarios, estos se
componen de una serie de puntos de control, los cuales tienen fijada una
hora de paso, en una determinada posición X e Y. Por otro lado, contamos con
un histórico de posiciones, para saber en todo momento, las coordenadas por
las que pasó el vehículo.

El esquema del informe, sería algo así:

Vehiculo
Itinerario A
PuntoControl A Desfase
PuntoControl B Desfase

Itienerario B
PuntoControl A Desfase
PuntoControl B Desfase



Por tanto, la finalidad de este SP es la dé, para un determinado vehículo,
presentar todos sus itinerarios, y para cada itinerario, ver el desfase de
tiempo de dicho vehiculo, sobre cada uno de los puntos de control
pertenecientes a dicho itinerario.

En cuanto a T-SQL se refiere, realizo los siguientes pasos:

Realizo una primera query, para sacar todos los itinerarios pertenecientes
al vehiculo establecido, con sus puntos de control. Dicho resultado, es lo
que guardo en la tabla temporal (@PuntosControl).

Realizado esto, que es el eje de todo el procedimiento ... lo primero que
hago es sacar los distintos itinerarios:

SELECT id_area, id_servicio, numero_mapa, nombre
FROM @PuntosControl
GROUP BY id_area, id_servicio, numero_mapa, nombre

Para cada uno de ellos (Cursor), obtengo sus puntos de control, con los
datos necesarios:

SELECT id_tipo_punto, hora_paso, x, y, hora_inicio, hora_fin
FROM @PuntosControl
WHERE id_area = @IdArea AND id_servicio = @IdServicio AND numero_mapa @numero_mapa

A continuación, obtengo mediante una función de usuario, todas las
posiciones del vehículo, acotadas, por la hora_inicio y hora_fin del punto
de control.

SELECT hora, x, y
FROM Posiciones_Vehiculo(@IdVehiculo, hora_inicio, hora_fin)

Finalmente, para cada una de las posiciones (Cursor) del vehiculo, compruebo
si está comprendida en un rango de +/- 100m para la coordenada X y +/- 100m
para la coordenada Y, y si es así, calculo su desfase ... Si se da esta
última condición, lo voy almacenando en una segunda tabla temporal, que es
la que definitivamente se devuelve con los datos necesarios.

Como te decía, no es muy trivial, dado que tengo que estar comprobando para
cada punto de control, si existe alguna posición que tenga una coordenada
similar a la del punto de control no se me ocurre otra forma de hacer
esto, que no sea con un bucle, en terminos de T-SQL un Cursor ... ya se, que
el uso de los cursores, no es que sea muy optimo, pero si quiero establecer
toda la lógica en el procedimiento almacenado, no tengo otra posibilidad.
Otra forma, que alomejor puede ser mucho más optima, es la de establecer
toda la lógica en código

Espero haberme expresado con claridad, obviamente, es un poco más complejo
de lo que aquí te presento, pero creo que la idea fundamental y la finalidad
del procedimiento almacenado está clara.

Gracias.



"Maxi" escribió en el mensaje
news:
Hola, Tablas temporales + Cursores = muerte del servidor :(

A ver, ninguna de las 2 tecnicas es buena :(, porque no hacemos una cosa a
ver que te parece:

Si me comentas (lo mas detallado y con ejemplos) lo que necesitas, podemos
ver como resolverlo, quizas no haga falta la tabla temporal y mucho menos


el
cursor :-)


Salu2
Maxi


"Javier Carrascal" escribió en el mensaje
news:
> Ufff, buena recomendación Maxi, no me lo había planteado desde ese punto
> de
> vista.
>
> El caso, es que el SP lo que primeramente hace es una selección previa


de
> un
> conjunto de datos, los cuales, voy a necesitar varias veces, a lo largo


de
> dicho SP, tanto para el uso de Cursores, como para selecciones


filtradas,
> etc ... Por eso, de guardar dichos datos en una variable de tipo tabla o
> en
> un tabla temporal, para un manejo más sencillo. No se me ocurre otra
> forma,
> a través de T-Sql de hacer esto, que no sea sustituir esta tabla o
> variable,
> por la SELECT previamente realizada ... En cualquier caso, me has hecho
> recapacitar, y le volveré a dar una vuelta al dichoso SP ...
>
> Gracias
>
>
> "Maxi" escribió en el mensaje
> news:%
>> Hola, pues todo depende, veamos cuales son las diferencias entre ambos
>> modelos
>>
>> Tablas temporales: Estas se almacenan en disco, BDD Tempdb
>>
>> Variables tipo Tabla: Estas se almacenan en la RAM
>>
>> La segunda es mas optima en principio pero hay que tener mucho cuidado
>> porque puede llegar a ser mortal el consumo de la RAM con lo cual el
>> servidor se podria poner muy ineficiente :(
>>
>> Mi recomendacion:
>>
>> No uses ni una ni la otra :-), el uso de tablas temporales deberia ser
>> muy
>> pero muy contado con los dedos de la primer mano, este tipo de tecnicas
> son
>> generalmente aplicadas cuando no se puede resolver directamente un
> problema
>> con T-sql, y los casos que esto pueda pasar son remotos, ahora hay


muchos
>> programadores que no disponen de todo el conocimiento de T-sql y esto
> puede
>> ser un causante del uso de tablas Temporales en lungares donde quizas


no
> era
>> tan necesario.
>>
>> Un abrazo
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "Javier Carrascal" escribió en el mensaje
>> news:O73oj$$
>> > Buenos días y FELIZ NAVIDAD !!! a todo el foro.
>> >
>> > Me gustaría haber si me pueden ayudar en la siguiente cuestión. Tengo
>> > un
>> > SP
>> > en el cuál, creo una tabla temporal ... el caso, es que he llegado a
> leer
>> > por ahí, que es más optimo crear una variable de tipo TABLE, antes


que
>> > crear
>> > una tabla temporal. Esto que tiene de cierto ??? cuál de las dos
>> > soluciones
>> > es más optima ???
>> >
>> > Más gráficamente, cuál de estas dos sentencias es más optima:
>> >
>> > DECLARE @PuntosControl TABLE (
>> > id_area BIGINT,
>> > id_servicio BIGINT,
>> > numero_mapa INT)
>> >
>> > CREATE TABLE #PuntosControl (
>> > id_area BIGINT,
>> > id_servicio BIGINT,
>> > numero_mapa INT)
>> >
>> > Salu2
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#7 Antonio Ortiz R.
27/12/2004 - 22:24 | Informe spam
Buena aclaracion, segun mi opinion es que las tablas temporales son un mal
habito heredado de las bases de datos .dbf o similares (basadas en
archivos). Segun yo deberia ser tan cambiado por otro recurso como una vista
o SP

saludos,

Antonio Ortiz Ramirez
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com



"Maxi" escribió en el mensaje
news:
Hola, Tablas temporales + Cursores = muerte del servidor :(

A ver, ninguna de las 2 tecnicas es buena :(, porque no hacemos una cosa a
ver que te parece:

Si me comentas (lo mas detallado y con ejemplos) lo que necesitas, podemos
ver como resolverlo, quizas no haga falta la tabla temporal y mucho menos


el
cursor :-)


Salu2
Maxi


"Javier Carrascal" escribió en el mensaje
news:
> Ufff, buena recomendación Maxi, no me lo había planteado desde ese punto
> de
> vista.
>
> El caso, es que el SP lo que primeramente hace es una selección previa


de
> un
> conjunto de datos, los cuales, voy a necesitar varias veces, a lo largo


de
> dicho SP, tanto para el uso de Cursores, como para selecciones


filtradas,
> etc ... Por eso, de guardar dichos datos en una variable de tipo tabla o
> en
> un tabla temporal, para un manejo más sencillo. No se me ocurre otra
> forma,
> a través de T-Sql de hacer esto, que no sea sustituir esta tabla o
> variable,
> por la SELECT previamente realizada ... En cualquier caso, me has hecho
> recapacitar, y le volveré a dar una vuelta al dichoso SP ...
>
> Gracias
>
>
> "Maxi" escribió en el mensaje
> news:%
>> Hola, pues todo depende, veamos cuales son las diferencias entre ambos
>> modelos
>>
>> Tablas temporales: Estas se almacenan en disco, BDD Tempdb
>>
>> Variables tipo Tabla: Estas se almacenan en la RAM
>>
>> La segunda es mas optima en principio pero hay que tener mucho cuidado
>> porque puede llegar a ser mortal el consumo de la RAM con lo cual el
>> servidor se podria poner muy ineficiente :(
>>
>> Mi recomendacion:
>>
>> No uses ni una ni la otra :-), el uso de tablas temporales deberia ser
>> muy
>> pero muy contado con los dedos de la primer mano, este tipo de tecnicas
> son
>> generalmente aplicadas cuando no se puede resolver directamente un
> problema
>> con T-sql, y los casos que esto pueda pasar son remotos, ahora hay


muchos
>> programadores que no disponen de todo el conocimiento de T-sql y esto
> puede
>> ser un causante del uso de tablas Temporales en lungares donde quizas


no
> era
>> tan necesario.
>>
>> Un abrazo
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "Javier Carrascal" escribió en el mensaje
>> news:O73oj$$
>> > Buenos días y FELIZ NAVIDAD !!! a todo el foro.
>> >
>> > Me gustaría haber si me pueden ayudar en la siguiente cuestión. Tengo
>> > un
>> > SP
>> > en el cuál, creo una tabla temporal ... el caso, es que he llegado a
> leer
>> > por ahí, que es más optimo crear una variable de tipo TABLE, antes


que
>> > crear
>> > una tabla temporal. Esto que tiene de cierto ??? cuál de las dos
>> > soluciones
>> > es más optima ???
>> >
>> > Más gráficamente, cuál de estas dos sentencias es más optima:
>> >
>> > DECLARE @PuntosControl TABLE (
>> > id_area BIGINT,
>> > id_servicio BIGINT,
>> > numero_mapa INT)
>> >
>> > CREATE TABLE #PuntosControl (
>> > id_area BIGINT,
>> > id_servicio BIGINT,
>> > numero_mapa INT)
>> >
>> > Salu2
>> >
>> >
>>
>>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida