Sobre Tabla Temporal.

31/10/2007 - 15:31 por Penta | Informe spam
Estimados.
Uso SQL 2000.
Resulta que tengo la siguiente duda.
Tengo un Select * from #temporal la cual cruzo despues con una tabla
fisica, todo este proceso se demora 1100 milisegundos.

Pero si no uso la temporal ( que es lo aconsejado) y cruzo la tabla
con el select se demora 3200 milisegundos

Por que aumenta el tiempo ??
DECLARE @horas TABLE (codprof [varchar] (30) COLLATE
Modern_Spanish_CI_AS NULL , n int)
INSERT INTO @horas
SELECT h.codprof, count(*) n
FROM ra_horari h
inner join ra_ramo r on r.codramo=h.codramo and r.duracion=2
WHERE ano 07 and periodo=1
GROUP BY h.codprof

SELECT cont=count(*),glosa = 'Recuperativas del mes sin
eliminar',indicador='B'
FROM av_programacion_clases apc
INNER JOIN ra_profes p on p.codprof=case when apc.codprof is null
then apc.prof_prog else apc.codprof end
WHERE
apc.fecha between @inicio_anterior and @termino_anterior
and estado=1
and apc.codcarr+apc.ramoequiv+convert(varchar(10), apc.fecha,
103)+convert(varchar, apc.codsecc)+convert(varchar,apc.modulo_inicio)
+apc.prof_prog in

( SELECT codcarr+ramoequiv+convert(varchar(10), fecha_recuperada,
103)+convert(varchar, codsecc)+convert(varchar,mi_recuperada)
+prof_prog
FROM av_programacion_clases apc
WHERE apc.fecha between @inicio_anterior and @termino_anterior
and fecha_recuperada between @inicio_anterior and
@termino_anterior
)
-
GROUP BY av.CODPROF
HAVING SUM(av.HORAS)<>0

Atte.
Penta.
 

Leer las respuestas

#1 Jose Mariano Alvarez
31/10/2007 - 19:33 | Informe spam
No te entiendo la pregunta porque @tabla no veo donde se usa o como se la
puede usar, pero si te haria el comentario siguiente:

La condicion que te copio aqui abajo nunca va a usar un indice adecuadamente

WHERE
apc.codcarr
+ apc.ramoequiv
+ convert(varchar(10), apc.fecha,103)
+ convert(varchar, apc.codsecc)
+ convert(varchar,apc.modulo_inicio)
+apc.prof_prog
IN (
...
)


Cambia el IN por EXISTS e iguala las columnas en lugar de concatenarlas.
Si la relacion es N a 1 tambien podrias usar un join pero para el
optimizador es casi lo mismo cualquiera de las alternativas.






Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)


IMPORTANTE

Por favor traten de indicar la versión de SQL y Service Pack.
La inclusión de (CREATE, INSERTS, etc.) para poder reproducir el problema
también ayuda.



"Penta" wrote in message
news:
Estimados.
Uso SQL 2000.
Resulta que tengo la siguiente duda.
Tengo un Select * from #temporal la cual cruzo despues con una tabla
fisica, todo este proceso se demora 1100 milisegundos.

Pero si no uso la temporal ( que es lo aconsejado) y cruzo la tabla
con el select se demora 3200 milisegundos

Por que aumenta el tiempo ??
DECLARE @horas TABLE (codprof [varchar] (30) COLLATE
Modern_Spanish_CI_AS NULL , n int)
INSERT INTO @horas
SELECT h.codprof, count(*) n
FROM ra_horari h
inner join ra_ramo r on r.codramo=h.codramo and r.duracion=2
WHERE ano 07 and periodo=1
GROUP BY h.codprof

SELECT cont=count(*),glosa = 'Recuperativas del mes sin
eliminar',indicador='B'
FROM av_programacion_clases apc
INNER JOIN ra_profes p on p.codprof=case when apc.codprof is null
then apc.prof_prog else apc.codprof end
WHERE
apc.fecha between @inicio_anterior and @termino_anterior
and estado=1
and apc.codcarr+apc.ramoequiv+convert(varchar(10), apc.fecha,
103)+convert(varchar, apc.codsecc)+convert(varchar,apc.modulo_inicio)
+apc.prof_prog in

( SELECT codcarr+ramoequiv+convert(varchar(10), fecha_recuperada,
103)+convert(varchar, codsecc)+convert(varchar,mi_recuperada)
+prof_prog
FROM av_programacion_clases apc
WHERE apc.fecha between @inicio_anterior and @termino_anterior
and fecha_recuperada between @inicio_anterior and
@termino_anterior
)
-
GROUP BY av.CODPROF
HAVING SUM(av.HORAS)<>0

Atte.
Penta.

Preguntas similares