Impresión de Acta de Regularidad

Estimados, buenos días…

En una implementación que tiene instalada la versión 2.06.2 de Guaraní los usuarios comenzaron a notar que la operación de Cierre de Acta de Regularidad tardaba demasiado, sobre todo en la impresión del acta. El acta no está personalizada, se utiliza el objeto dr_acta_reg_pend.

Hicimos un análisis del query y vemos que está ingresando primero y escaneando la tabla sga_curs_pendiente que generalmente tiene muchas filas y el costo estimado del query es altísimo… También está escaneando la sga_personas y la sga_actas_cursado.

Adjunto el plan de ejecución del query.

Estimated Cost: 2147483647
Estimated # of Rows Returned: 2147483647
Temporary Files Required For: Order By

  1. dba.sga_curs_pendiente: SEQUENTIAL SCAN

  2. dba.sga_alumnos: INDEX PATH

(1) Index Keys: unidad_academica carrera legajo   (Serial, fragments: ALL)
    Lower Index Filter: ((dba.sga_alumnos.carrera = dba.sga_curs_pendiente.carrera AND dba.sga_alumnos.legajo = dba.sga_curs_pendiente.legajo ) AND dba.sga_alumnos.unidad_academica = dba.sga_curs_pendiente.unidad_academica ) 

NESTED LOOP JOIN

  1. dba.sga_sedes: SEQUENTIAL SCAN
    NESTED LOOP JOIN

  2. dba.sga_comisiones: SEQUENTIAL SCAN

DYNAMIC HASH JOIN (Build Outer)
Dynamic Hash Filters: dba.sga_comisiones.sede = dba.sga_sedes.sede

  1. dba.sga_materias: SEQUENTIAL SCAN

DYNAMIC HASH JOIN
Dynamic Hash Filters: (dba.sga_materias.materia = dba.sga_comisiones.materia AND dba.sga_materias.unidad_academica = dba.sga_comisiones.unidad_academica )

  1. dba.sga_personas: SEQUENTIAL SCAN

DYNAMIC HASH JOIN
Dynamic Hash Filters: (dba.sga_personas.nro_inscripcion = dba.sga_alumnos.nro_inscripcion AND dba.sga_personas.unidad_academica = dba.sga_alumnos.unidad_academica )

  1. dba.sga_periodos_lect: SEQUENTIAL SCAN

DYNAMIC HASH JOIN
Dynamic Hash Filters: (dba.sga_periodos_lect.periodo_lectivo = dba.sga_comisiones.periodo_lectivo AND dba.sga_periodos_lect.anio_academico = dba.sga_comisiones.anio_academico )

  1. dba.sga_actas_cursado: SEQUENTIAL SCAN

    Filters:
    Table Scan Filters: (dba.sga_actas_cursado.acta = 1133 AND dba.sga_actas_cursado.unidad_academica = ‘SEG’ )

DYNAMIC HASH JOIN
Dynamic Hash Filters: (dba.sga_comisiones.comision = dba.sga_actas_cursado.comision AND dba.sga_curs_pendiente.comision = dba.sga_actas_cursado.comision )

  1. dba.sga_det_escala: INDEX PATH
(1) Index Keys: escala_notas nota   (Serial, fragments: ALL)
    Lower Index Filter: (dba.sga_det_escala.nota = dba.sga_curs_pendiente.nota AND dba.sga_det_escala.escala_notas = dba.sga_actas_cursado.escala_notas ) 

NESTED LOOP JOIN

  1. dba.sga_libros_actacur: INDEX PATH
(1) Index Keys: unidad_academica libro   (Serial, fragments: ALL)
    Lower Index Filter: (dba.sga_libros_actacur.libro = dba.sga_actas_cursado.libro AND dba.sga_libros_actacur.unidad_academica = dba.sga_actas_cursado.unidad_academica ) 

NESTED LOOP JOIN

  1. dba.sga_carreras: INDEX PATH
(1) Index Keys: unidad_academica carrera   (Serial, fragments: ALL)
    Lower Index Filter: (dba.sga_carreras.carrera = dba.sga_actas_cursado.carrera AND dba.sga_carreras.unidad_academica = dba.sga_actas_cursado.unidad_academica ) 

NESTED LOOP JOIN

  1. dba.sga_planes: INDEX PATH
(1) Index Keys: unidad_academica carrera plan   (Serial, fragments: ALL)
    Lower Index Filter: ((dba.sga_planes.carrera = dba.sga_comisiones.carrera AND dba.sga_planes.plan = dba.sga_comisiones.plan ) AND dba.sga_planes.unidad_academica = dba.sga_comisiones.unidad_academica ) 

NESTED LOOP JOIN

  1. dba.sga_atrib_mat_plan: INDEX PATH
(1) Index Keys: unidad_academica carrera plan version materia   (Serial, fragments: ALL)
    Lower Index Filter: ((((dba.sga_atrib_mat_plan.materia = dba.sga_comisiones.materia AND dba.sga_atrib_mat_plan.version = dba.sga_planes.version_actual ) AND dba.sga_atrib_mat_plan.plan = dba.sga_planes.plan ) AND dba.sga_atrib_mat_plan.carrera = dba.sga_planes.carrera ) AND dba.sga_atrib_mat_plan.unidad_academica = dba.sga_planes.unidad_academica ) 

NESTED LOOP JOIN

======================================================================================

Saludos.

Sergio

Hola Sergio, cual es el origen del query? datawindows?

Hola

Si. es una dw.

Puede estar faltando ejecutar algun update statistics.
O hay que revisar si están todas las fk relacionadas a las tablas que se unen.
La única inexistente en este caso es la de comisiones con sedes.

Tambien es el punto que, si hay pocos registros informix envia un sequential scan aunque haya índices. Ni idea de cuantos son “pocos”.

Emilio

Hola… La dw es la dr_acta_reg_pend, es la dw de la versión standard. Realizamos el update statistics pero sigue igual… Están todas las FK… Creo que el problema en como está planteado el query… En cuanto a la cantidad de registros, en estos momentos existen 10800 registros… No sé si por ese motivo hace un escaneo de la tabla, pero al hacerlo tarda demasiado tiempo…

Saludos.

Sergio.

Hola Sergio

fijate si existe la fk_cur_pen_ac_cur.
la foreign key de cursadas pendientes con actas de cursado.

Emilio