lentitud al utilizar vistas

Hola

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 

Agrego algo mas

En el query con la vista hace un scan secuencial.
De otra forma no.


error_vw_mesas_examen.png

error_vw_mesas_examen.png

Emilio, esta query:

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.

3


vw_mesas_examen_v2.sql (3.54 KB)

Hola Alejandro

En co_actas esta esa consulta pero la vista es usada en otras 15 paginas.

Ya pruebo los cambios y te comento.

La vista que mandastes tiene cambios que no están en la 3.18.1 y tiene dos veces sga_mesas_examen.

Emilio

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.


vw_mesas_examen_v2.sql (3.54 KB)

Hola Alejandro

Sigue igual.
Hace una busqueda secuencial de los turnos y llamados.

En la 3.17.1 trabaja bien. El dropeo de la vista te puede provocar esto?

Emilio

El método donde esta la query que enviaste en el primer mensaje es get_listado_reporte_actas_cerradas?

No creo que el borrar y volver a crear la vista haga que cambie la forma en que el motor accede a los datos.
¿Estas en verison 3.18.0 o 3.18.1 ?

Hola

Los cambios se hacen en esa vista en 3.18.0

yo pasé la base de 3.17.1 a 3.18.1

y lo que hace lerda la consulta es

– negocio.get_nombre_actividad_mesa_examen(sga_mesas_examen.mesa_examen, 1) AS mesa_examen_elemento_nombre,

si no está eso responde rápido.

Emilio

Esa funcion tenia un problema que fue creada como VOLATILE, y debe ser creada como STABLE.
Fijate si la tenes creada de esta forma.

Si. Estaba como volatile
Cambiandola se reduce el tiempo de respuesta de la vista.

Gracias.

Emilio

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.

Hola

A ese script no lo tengo.

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.

Al script que mencionas no lo tengo.

Emilio

Subi un GDS y te enviamos el script 001448.sql. Por lo que vemos ese script no salió en versión 3.18.1, por eso no lo encontraste.

LIsto.

Solicitud 49233

Gracias

Hola

Aplicamos un fix a todos los nodos, dejo el foro de referencia.

Saludos!