reparar indices corruptos

Hola:

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.

muchas gracias!!!

Hola Pablo

Para reparar tablas / indices, dispones de los siguientes comandos. Tene en cuenta que no siempre pueden reparar.

oncheck -cd base:tabla
oncheck -cD base:tabla
oncheck -ci base:tabla
oncheck -cI base:tabla

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.

Hola:

Hice lo que me dijiste, y no me funciono.
Hay alguna forma de exportar los resultados cuando los va generando el procedure a un txt?.

muchas gracias!!!

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.

Saludos

Gustavo

Hola Pablo, como andas

Cual es el procedimiento que tarda 10 minutos y con que parametros lo corres?

Como sabes que el problema se debe a un indice corrupto ?.

Puede ser que por falta de actualizacion de estadisctas no este usando los indices.

Podrias correr un update statistics en produccion ?. Y de paso un “update statistcis for procedure ayz”

saludos

Hola:

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:

SELECT DISTINCT sga_personas.unidad_academica, --798
sga_personas.apellido,
sga_personas.nombres,
SGA_personas.nro_inscripcion,
sga_datos_censales.e_mail,
sga_datos_censales.te_per_lect,
SGA_DATOS_CEN_AUX.CELULAR_NUMERO

– INTO pUA, pApellidodoc, pNombredoc, pNroInsc, pE_mail,pTel,pCelular
FROM sga_personas INNER JOIN sga_docentes ON sga_personas.nro_inscripcion = sga_docentes.nro_inscripcion
LEFT OUTER JOIN sga_datos_censales ON sga_personas.nro_inscripcion = sga_datos_censales.nro_inscripcion
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
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

No tiene nada raro. Tambien probe haciendo un group by, unique en vez de distinct, y nada.

muchas gracias!!!

Hola

Los join que tenes con nro_inscripcion deben llevar la unidad_academica tambien.
Si no no estás usando los índices y/o fk
Fijate que pasa.

Emilio

Hola,

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:

SELECT DISTINCT sga_personas.unidad_academica, --798
sga_personas.apellido,
sga_personas.nombres,
SGA_personas.nro_inscripcion,
sga_datos_censales.e_mail,
sga_datos_censales.te_per_lect,
SGA_DATOS_CEN_AUX.CELULAR_NUMERO

– INTO pUA, pApellidodoc, pNombredoc, pNroInsc, pE_mail,pTel,pCelular
FROM sga_personas , sga_docentes , OUTER sga_datos_censales , OUTER sga_datos_cen_aux , sga_docentes_com ,sga_comisiones, sga_actas_cursado
WHERE sga_personas.unidad_academica = sga_docentes.unidad_academica AND sga_personas.nro_inscripcion = sga_docentes.nro_inscripcion
AND sga_personas.unidad_academica = sga_datos_censales.unidad_academica AND sga_personas.nro_inscripcion = sga_datos_censales.nro_inscripcion
AND sga_personas.unidad_academica = sga_datos_cen_aux.unidad_academica AND sga_personas.nro_inscripcion = sga_datos_cen_aux.nro_inscripcion
AND sga_docentes.legajo = sga_docentes_com.legajo
AND sga_docentes_com.comision = sga_comisiones.comision
AND sga_actas_cursado.comision = sga_comisiones.comision

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??

Saludos

Gustavo

Hola Gustavo

mmm…
donde hay queries escritos con LEFT OUTER JOIN o LEFT JOIN, etc…

Me parece que no hay.

Emilio

Emilio:

Yo he visto algunos, ahora no te puedo decir cuales. Salvo que en las últimas versiones los hayan cambiado.

Saludos

Gustavo

hace poco probé muchas consultas que devuelvan un registro en lugar de una que devuelva muchos y no había diferencia escribiendo

FROM sga_personas INNER JOIN sga_docentes ON sga_personas.nro_inscripcion = sga_docentes.nro_inscripcion

o

from sga_personas, sga_docentes where …

con los índices completos obviamente.

Emilio:

En la versión 2.7 hay como 72 archivos entre SP y vistas que usan el OUTER, por ejemplo la vista sga_cursadas.

Saludos

Gustavo

Hola Gustavo

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

Emilio

Hola Gustavo,

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 ?

saludos
Ignacio

Ignacio:

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.

Saludos

Gustavo

hola:

Muchismas gracias!!!. la consulta vuela.

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

SELECT sga_personas.unidad_academica, --798
sga_personas.apellido,
sga_personas.nombres,
SGA_personas.nro_inscripcion,
sga_datos_censales.e_mail,
sga_datos_censales.te_per_lect,
SGA_DATOS_CEN_AUX.CELULAR_NUMERO

– 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)

muchas gracias!!!, si es eso lo que buscaba.