Estoy optimizando una base de datos Firebird 2.5 de tickets de trabajo. Se almacenan en una tabla declarada como tal:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Generalmente quiero encontrar el primer ticket que no se ha procesado y está en Pending
estado.
Mi ciclo de procesamiento sería:
- Recupere el 1er boleto donde
Pending
- Trabaja con Ticket.
- Actualizar estado del ticket =>
Complete
- Repetir.
Nada muy elegante. Si estoy viendo la base de datos mientras se ejecuta este ciclo, veo el número de lecturas indexadas que sube para cada iteración. El rendimiento no parece degradarse terriblemente, puedo decirlo, pero la máquina en la que estoy probando es bastante rápida. Sin embargo, he recibido informes de degradación del rendimiento con el tiempo de algunos de mis usuarios.
Tengo un índice Status
, pero todavía parece que escanea la Ticket_Id
columna cada iteración. Parece que estoy pasando por alto algo, pero no estoy seguro de qué. ¿Se espera el número creciente de lecturas indexadas para algo como esto, o el índice se está comportando de alguna manera?
- Ediciones para comentarios -
En Firebird limitas la recuperación de filas como:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Entonces, cuando digo "primero", solo le pido un conjunto de registros limitado donde Status = 'Pending'
.
ticket_id
, probablemente necesite un índice en(status, ticket_id)
ticket_id
realidad se desempeñó peor que simplemente tener el estado indexado.
id
(el tipo de datos) un dominio que definió?