Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/08/2012, 07:45
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Sonrisa "Snapshot too old usando un indice sobre una fecha ¿?

Tengo un misterio que no logramos resolver, y que nos está causando un enorme dolor de cabeza.
En el sistema, toas las aplicaciones postean sus mensajes en una cola, y luego estos mensajes se graban en una serie de tablas, todas relacionadas con una tabla cabecera, que denominaremos log_sistema. Esta cabecera llega a recibir 36 millones de registros/día (si, son bastantes).
Diariamente se eliminan de esa tabla todos los registros anteriores a cierta fecha, a fin de mantener solamente una cantidad de días, para análisis de performance. Este proceso de borrado se hace automáticamente por medio de un SP que corre todos los días.
Para determinar el rango a borrar el SP realiza algunas consultas, buscando las fechas más antiguas, y es una de las comprobaciones la que nos está causando problemas.
En la consulta problemática, usamos dos variables, una NUMBER y otra DATE. La variable fechaHasta es una variable DATE que contiene un DateTime representando la fecha hasta la cual se borrarán registros.
Si usamos un rango:
Código SQL:
Ver original
  1. SELECT COUNT(1)
  2. INTO totalDias
  3. FROM log_sistema
  4. WHERE TIEMPO BETWEEN fechaDesde AND fechaHasta
  5. AND ROWNUM = 1;
la consulta se ejecuta perfectamente y muy rápida.
Pero si buscamos directamente la menor a esa fecha:
Código SQL:
Ver original
  1. SELECT COUNT(1)
  2. INTO totalDias
  3. FROM log_sistema
  4. WHERE TIEMPO < fechaHasta
  5. AND ROWNUM = 1;
la consulta dura una enormidad y termina cayendo por "snapshot too old".
Un detalle: No podemos modificar los segmentos de rollback porque los administradores de base de datos no lo autorizan, así que esa solución no es una opción.

El misterio: Lo que no podemos entender es por qué falla, teniendo en cuenta que estamos usando un INDEX sobre el campo "TIEMPO", y pidiendo que busque el menor a cierta fecha, ambas cosas contenidas en el indice.
¿Qué puede causar que falle esta consulta tan elemental, cuyo plan de consulta usa efectivamente (ya lo comprobamos) el indice definido para el campo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)