la primera consulta que sigue, tarda 1 minuto 48 segundos
La segunda tarda 144 ms.
Las dos son aproximadamente la misma consulta, excepto que la primera usa una vista y la segunda, las tablas que componen la vista
La máquina es debian 10, con postgresql 11 y guarani 3.18.1
Hay alguna forma que las consultas que utilicen vistas, trabajen mas rápido?
Alguna optimizacion?
Emilio
set search_path to negocio;
SELECT *
FROM vw_mesas_examen,
sga_actas
LEFT JOIN sga_actas AS rectificada ON sga_actas.acta_referencia = rectificada.id_acta,
sga_actas_estados,
sga_elementos,
sga_ubicaciones
WHERE sga_actas.llamado_mesa = vw_mesas_examen.llamado_mesa AND
sga_actas.estado = sga_actas_estados.estado
AND vw_mesas_examen.mesa_examen_elemento = sga_elementos.elemento
AND vw_mesas_examen.mesa_examen_ubicacion = sga_ubicaciones.ubicacion
AND sga_actas.id_acta = 229599
ORDER BY sga_actas.nro_acta
select *
from sga_actas sa
LEFT JOIN sga_actas AS rectificada ON sa.acta_referencia = rectificada.id_acta
left join sga_llamados_mesa slm ON slm.llamado_mesa = sa.llamado_mesa
left join sga_mesas_examen sme ON slm.mesa_examen = sme.mesa_examen
left join sga_elementos se ON se.elemento = sme.elemento
left join sga_ubicaciones su ON sme.ubicacion = su.ubicacion
left join sga_actas_estados sae ON sa.estado = sae.estado
left join sga_llamados_turno slt ON slm.llamado =slt.llamado
left join sga_periodos splt ON slt.periodo = splt.periodo
left join sga_turnos_examen st ON st.turno_examen = slt.turno_examen
left join sga_periodos spte ON spte.periodo = st.periodo
where sa.id_acta = 229599
SELECT *
FROM vw_mesas_examen,
sga_actas
LEFT JOIN sga_actas AS rectificada ON sga_actas.acta_referencia = rectificada.id_acta,
sga_actas_estados,
sga_elementos,
sga_ubicaciones
WHERE sga_actas.llamado_mesa = vw_mesas_examen.llamado_mesa AND
sga_actas.estado = sga_actas_estados.estado
AND vw_mesas_examen.mesa_examen_elemento = sga_elementos.elemento
AND vw_mesas_examen.mesa_examen_ubicacion = sga_ubicaciones.ubicacion
AND sga_actas.id_acta = 229599
ORDER BY sga_actas.nro_acta
Proba la misma query pero escrita de otra forma (primero la tabla sga_actas que es por donde entras a consultar, luego llevar las condiciones de join del WHERE al FROM y ubicar el LEFT JOIN al final del FROM):
SELECT *
FROM sga_actas
JOIN vw_mesas_examen ON sga_actas.llamado_mesa = vw_mesas_examen.llamado_mesa
JOIN sga_actas_estados ON sga_actas.estado = sga_actas_estados.estado
JOIN sga_elementos ON vw_mesas_examen.mesa_examen_elemento = sga_elementos.elemento
JOIN sga_ubicaciones ON vw_mesas_examen.mesa_examen_ubicacion = sga_ubicaciones.ubicacion
LEFT JOIN sga_actas AS rectificada ON sga_actas.acta_referencia = rectificada.id_acta
WHERE sga_actas.id_acta = 229599
ORDER BY sga_actas.nro_acta
Estamos reescribiendo las querys de esa forma.
En donde está esa query asi la reescribimos.
Adjunto a este mensaje la vista vw_mesas_examen. Fijate que cambie el orden de las tablas, primero sga_llamados_mesa y luego sga_mesas_examen. Porque en general cuando se usa esta vista en las querys se hace join por el campo “llamado_mesa”
Proba recrear la vista y volver a ejecutar esa query.
Si, habia quedado mal, y saque el campo “fecha_publicacion_mesas_docente”, asi podes recrearla sin tener que borrar y volver a crear porque debes borrar otras vistas que llaman a esta.
Emilio, entonces no estas en version 3.18.1.Porque en esta versión en el script de conversion nro 001448.sql se cambia esta forma de crear las funciones de VOLATILE a STABLE.
Si estas en version 3.18.0, fijate si podes pasarte a version 3.18.1 o para tener estas mejoras en algunas funciones utilizadas en vistas de mesas de examen y comisiones corre ese script de conversion, ya que lo que unico que hace es cambiar es definición en unas funciones.
Estamos en 3.17.1 y traté de pasar a 3.18.1 en producción.
Ese problema con las actas hizo que volvamos atras.
Corregí el diferencial que crea las funciones, para que la proxima vez que cambiemos de versión quede bien.