consulta sobre el siguiente select

hola:

La siguiente consulta me devuelve: resultado,forma_aprobacion,carrera,legajo,año_academico,periodo_lectivo,cantidad(de inscripciones por cuatrimestre o examen final) de cada alumnos, lo que sucede es que tarda muchisimo, como 12 hs, cual podria ser error?:

–UNLOAD TO “D:\TPSs 8-4-2010\pedidos\german-anita\inscripcionesSegunExamenCuatrimestre.csv”
SELECT DISTINCT DECODE(vhaf.resultado,‘A’, ‘Aprobado’ , ‘R’, ‘Reprobado’, ‘P’, ‘Promocionado’, ‘N’, ‘Reprobado’,‘E’,‘Pend. Aprob’,‘U’,‘Ausente’,‘V’,‘Pend. Virtual’) AS resultado,
DECODE(vhaf.forma_aprobacion, ‘Examen’, ‘Examen’,‘Examen equivalente’, ‘Examen Equiv.’, ‘Promoción’, ‘Promoción’, ‘Promoción en otra carrera’, ‘Promo. otra carrera’, ‘Homologada’, ‘Homologada’, ‘Equivalencia’, ‘Equivalencia’, ‘Equivalencia equivalente’, ‘Equivalencia Equiv.’, ‘Otras’, ‘Otras’ ) AS forma_aprobacion, sc.carrera || '- '|| sc.nombre,vhaf.legajo,scom.anio_academico,scom.periodo_lectivo,COUNT(vhaf.materia)

   FROM vw_hist_academicaFoja vhaf,    sga_carreras sc, sga_alumnos sa,sga_actas_promo scp,OUTER  sga_comisiones scom

WHERE vhaf.carrera = sc.carrera
AND vhaf.legajo = sa.legajo
AND vhaf.carrera = sa.carrera
AND scom.comision = scp.comision
AND scp.acta = vhaf.acta_promocion
– AND sa.regular = ‘S’
–AND sa.calidad <> ‘E’
AND vhaf.resultado <> ‘’
–AND sa.legajo = 9846
GROUP BY 1,2,3,4,5,6

UNION ALL

SELECT DISTINCT DECODE(vhaf.resultado,‘A’, ‘Aprobado’ , ‘R’, ‘Reprobado’, ‘P’, ‘Promocionado’, ‘N’, ‘Reprobado’,‘E’,‘Pend. Aprob’,‘U’,‘Ausente’,‘V’,‘Pend. Virtual’) AS resultado,
DECODE(vhaf.forma_aprobacion, ‘Examen’, ‘Examen’,‘Examen equivalente’, ‘Examen Equiv.’, ‘Promoción’, ‘Promoción’, ‘Promoción en otra carrera’, ‘Promo. otra carrera’, ‘Homologada’, ‘Homologada’, ‘Equivalencia’, ‘Equivalencia’, ‘Equivalencia equivalente’, ‘Equivalencia Equiv.’, ‘Otras’, ‘Otras’ ) AS forma_aprobacion, sc.carrera || '- '|| sc.nombre,vhaf.legajo,scp.anio_academico,scp.turno_examen,COUNT(vhaf.materia)

   FROM vw_hist_academicaFoja vhaf,    sga_carreras sc, sga_alumnos sa,OUTER sga_actas_examen scp

WHERE vhaf.carrera = sc.carrera
AND vhaf.legajo = sa.legajo
AND vhaf.carrera = sa.carrera
AND scp.acta = vhaf.acta
AND scp.materia = vhaf.materia
AND scp.carrera = vhaf.carrera
– AND sa.regular = ‘S’
– AND sa.calidad <> ‘E’
AND vhaf.resultado <> ‘’
–AND sa.legajo = 22249
GROUP BY 1,2,3,4,5,6;

muchisimas gracias!!!

Pablo:

En primer lugar, que es esa vista “vw_hist_academicaFoja”? Que hace? De donde sale? Es una personalización de ustedes?

Por otra parte, tenés UNION de 2 consultas con OUTER y GROUP BY. Si no utiliza bien los indices es comprensible que tarde mucho.

Cuanto tarda para 1 legajo? Que tamaño tienen las tablas? Como está configurado el motor? Hiciste el análisis con las herramientas que permite el Informix? Cual de las 2 partes del UNION es la que tarda? Las 2? Por que es el OUTER? Con un INNER JOIN tarda igual mucho?

Son muchas preguntas como para responderte de una que puede ser …

Saludos

Gustavo

Hola Pablo, podes postear cual es el resultado que quieren lograr?

Hola Pablo

si no usas el campo unidad_academica no se utilizaran los índices.

Emilio

hola:

Agregue la unidad_academica y tarda lo mismo.
El resultado que quiero es cantidad de materias q que se inscribe un alumno, segun cuatrimestre y año, y lo que devuelve la consulta es resultado,forma_aprobacion,carrera,nro_documento,año_academico,periodo_lectivo,cantidad(cant. de materias que se inscribio, segun cuatrimestre o mesa de examen), el primer select cursadas y el segundo examenes.

Muchas Gracias!!

Podrás enviar la definicion de vw_hist_academicaFoja?
Si no ponés los join, cuanto tarda en devolverte la información?

Con esta consulta estás levantando todos los alumnos de la ua.

hola emilio:

Te paso el script de vw_hist_academicaFoja, es muy similar a la vista vw_hist_academica.

Gracias!!!


vw_hist_academicaFoja.zip (2.91 KB)

Hola Pablo

Sinceramente no logré acelerarlo mucho.
Tal vez te convenga poner un filtro por unidad_academica-carrera
Esta es la última consulta que usé (le saque los decode para probar unicamente)

SELECT DISTINCT vhaf.resultado AS  resultado,
                                 vhaf.forma_aprobacion AS forma_aprobacion, sc.carrera || '- '|| sc.nombre,vhaf.legajo,scom.anio_academico,scom.periodo_lectivo,COUNT(vhaf.materia)

       FROM vw_hist_academicaFoja vhaf,    
	sga_carreras sc, 
	sga_alumnos sa,
	sga_actas_promo scp,
	OUTER  sga_comisiones scom
WHERE vhaf.unidad_academica = sc.unidad_academica
	AND vhaf.carrera       = sc.carrera

       AND vhaf.legajo                                = sa.legajo
       AND vhaf.carrera                              = sa.carrera
       AND vhaf.unidad_academica = sa.unidad_academica

       AND scom.comision = scp.comision

      AND scp.unidad_academica = vhaf.unidad_academica
       AND scp.acta = vhaf.acta_promocion
       AND vhaf.acta_promocion is not null
       AND vhaf.resultado <> ''
GROUP BY 1,2,3,4,5,6

UNION ALL

SELECT DISTINCT vhaf.resultado AS  resultado,
                                 vhaf.forma_aprobacion AS forma_aprobacion, sc.carrera || '- '|| sc.nombre,vhaf.legajo,scp.anio_academico,scp.turno_examen,COUNT(vhaf.materia)

       FROM vw_hist_academicaFoja vhaf,    
	sga_carreras sc, 
	sga_alumnos sa,
	OUTER sga_actas_examen scp
WHERE vhaf.unidad_academica = sc.unidad_academica
	AND vhaf.carrera       = sc.carrera

       AND vhaf.legajo                                = sa.legajo
       AND vhaf.carrera                              = sa.carrera
       AND vhaf.unidad_academica   = sa.unidad_academica

       AND scp.unidad_academica = vhaf.unidad_academica
       AND  scp.tipo_acta = vhaf.tipo_acta
       AND scp.acta = vhaf.acta
       AND vhaf.acta is not null

       AND vhaf.resultado <> ''
GROUP BY 1,2,3,4,5,6;

Emilio

Esto esta dentro de un procedure? Si es asi, proba lo siguinte, o podes probarlo directamente desde el sql editor:

  1. Crear una tabla temporal
    create temp table t (resultado char(1), …) with no log;

  2. Insertar los registros en la tabla temporal sin agrupar los mismos
    INSERT INTO t (resultado, …)
    SELECT DISTINCT vhaf.resultado AS resultado, vhaf.forma_aprobacion AS forma_aprobacion, sc.carrera || '- '|| sc.nombre,vhaf.legajo,scom.anio_academico,scom.periodo_lectivo,COUNT(vhaf.materia)
    FROM vw_hist_academicaFoja vhaf,

    UNION ALL
    SELECT DISTINCT vhaf.resultado AS resultado,
    vhaf.forma_aprobacion AS forma_aprobacion, sc.carrera || '- '|| sc.nombre,vhaf.legajo,scp.anio_academico,scp.turno_examen,COUNT(vhaf.materia)
    FROM …

  3. Hacer la consulta de la tabla temporal con el group by
    SELECT …, count(*)
    FROM T
    GROUP BY 1,2,3,4,5,6

Ademas, la primer consulta parecería que queres recuperar las actas de promocion, para ello podrias cambiar:
AND vhaf.acta_promocion is not null
AND vhaf.resultado <> ‘’
por:
AND vw.forma_aprobacion IN (‘Promoción’,‘Promoción en otra carrera’)
y hacer un join directo (sacar el outer) de la tabla sga_comisiones.

Lo mismo hacer con la 2da consulta respecto de las actas de examen, cambiar:
AND vhaf.acta is not null
AND vhaf.resultado <> ‘’
por:
AND vw.forma_aprobacion IN ('‘Examen’, ‘Examen equivalente’)

Siempre van a tener un resultado, asi que no debería ir: AND vhaf.resultado <> ‘’

hola alejandro:

gracias, lo estoy viendo pero ahora estamos con las inscripciones cuando lo pruebe te digo.

Saludos!!!