Hay alguna forma de reparar los indices?. Creo que hay algun indice corrupto ya que en una base de desarrollo ejecuto un procedimiento y la respuesta del mismo es de mas o menos 1 segundo y en produccion el mismo procedimiento tarda como 10 minutos, cuando hago la prueba pongo los mismo parametros.
Si esto no repara el indice, lo mas recomendable es borrarlo y volver a crearlo. Sabes en que tabla esta el problema de los indices ?
De todas maneras, quizas el problema no se deba a que un indice esta corrupto sino a que no existe directamente. En ese caso podrias comparar ambas bases (prod y desa) haciendo un dbschema de cada una y ver si hay indices faltantes.
Si, Pablo, con el comando para redireccionar de Linux o con el de DOS si la instalación es en Windows.
Con instalaciones en Windows el comando sería por ejemplo:
oncheck -cd nombredelabase > xxxx.txt
No te olvides que para los índices hay un parámetro más que es -x para lockear la tabla durante la ejecución y que te los pueda reparar. Si no, te dice que hay error pero no lo repara.
Si en una base de prueba te anda bien quizás te convenga exportar la base de producción y volverla a importar, y tomar la importada como la base buena. La importación mejora unas cuantas cosas ya que se reorganizan los datos en la base.
Hice el update statistics para toda la base y para el procedure y sigue igual.
Gracias por responder, el problema fijandome en el procedimiento,es la siguiente consulta que es la que me tarda:
Correcto Emilio, hay que agregar la unidad academica, luego de agregarla lo probe pero sigue tardando, pero la demora ahora tiene que ve con el ON, INNER y los OUTER hay algo que hace mal el optimizador de Informix. A mi me demoraba 20 segs. Reformule el query usando la notacion para JOIN sin INNER ni ON y ahora tarda 1 seg
Pablo proba este query (que deberia ser equivalente al que mandaste ) y fijtate cuanto demora:
Uhhh!!! Ignacio, que bomba estás tirando si no entiendo mal!!
No nos digas que todo el código escrito de la forma anterior hace que el optimizador de Informix no funcione bien!! Es eso así ? (ya que veo que de 20 seg bajaste a 1).
Si es así, habría que revisar todos los queries del Guaraní para reescribirlos??
Outer si se usa.
lo que no me acuerdo son estos tipos de construcciones
LEFT OUTER JOIN sga_datos_cen_aux ON sga_personas.nro_inscripcion = sga_datos_cen_aux.nro_inscripcion
INNER JOIN sga_docentes_com ON sga_docentes.legajo = sga_docentes_com.legajo
No deberia haber diferencia en los tiempos de respuesta por la forma de escribir un query. Ya que (al menos en teoria) el optimizador de Informix deberia encontrar plan de acceso optimo para resolver el query sin importar si se uso un ON o una junta en el WHERE. En mi caso es la primera vez que veo un query que da diferentes resultados. Igualmente me gustaria revisar y comparar como esta optimizando ambos queries con un SEt EXPLAIN.
De todas maneras, seria bueno verificar si esto tambien se reproduce en linux, y con versiones de Informix mas nuevas. Yo lo probe en una 9.21 sobre windows. Algun voluntario ?
Ya sé que en teoría no debería haber diferencia. Por eso me llamó la atención tu mensaje.
Si me enviás los 2 querys yo los pruebo en distintas instalaciones, todas con Windows e Informix 9.21. También le puedo pedir a Freddy que las pruebe con Informix 9.21en Linux. Y ahora que me acuerdo, donde estoy ahora las puedo probar con Informix 11.7 en Linux.
Aunque no sé la validez de probarlas en distintas bases, con distinta carga de datos. Pero se puede intentar y ver que sale.
Cual es el objetivo de esa consulta?
Lo que interpreto es que queres sacar los datos censales de los docentes que figuren en algún acta de fin de curso.
El mayor retardo en la misma es por el distinct. proba la siguiente si te devuelve lo que queres y mas rápido
– INTO pUA, pApellidodoc, pNombredoc, pNroInsc, pE_mail,pTel,pCelular
FROM sga_personas
INNER JOIN sga_docentes ON sga_personas.unidad_academica = sga_docentes.unidad_academica
AND sga_personas.nro_inscripcion = sga_docentes.nro_inscripcion
LEFT OUTER JOIN sga_datos_censales ON sga_personas.unidad_academica = sga_datos_censales.unidad_academica
AND sga_personas.nro_inscripcion = sga_datos_censales.nro_inscripcion
LEFT OUTER JOIN sga_datos_cen_aux ON sga_personas.unidad_academica = sga_datos_cen_aux.unidad_academica
AND sga_personas.nro_inscripcion = sga_datos_cen_aux.nro_inscripcion
WHERE sga_datos_censales.fecha_relevamiento = (SELECT max(fecha_relevamiento) FROM sga_datos_censales cen2
WHERE sga_datos_censales.unidad_academica = cen2.unidad_academica
AND sga_datos_censales.nro_inscripcion = cen2.nro_inscripcion)
AND sga_datos_cen_aux.fecha_relevamiento = (SELECT max(fecha_relevamiento) FROM sga_datos_cen_aux cen2
WHERE sga_datos_censales.unidad_academica = cen2.unidad_academica
AND sga_datos_censales.nro_inscripcion = cen2.nro_inscripcion)
AND EXISTS (SELECT ‘’
FROM sga_docentes_com
INNER JOIN sga_comisiones ON sga_docentes_com.comision = sga_comisiones.comision
INNER JOIN sga_actas_cursado ON sga_actas_cursado.comision = sga_comisiones.comision
WHERE sga_docentes.legajo = sga_docentes_com.legajo)