Sto ottimizzando un database Firebird 2.5 di ticket di lavoro. Sono memorizzati in una tabella dichiarata come tale:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
In genere desidero trovare il primo ticket che non è stato elaborato ed è in Pending
stato.
Il mio ciclo di elaborazione sarebbe:
- Recupera il primo biglietto dove
Pending
- Lavora con Ticket.
- Aggiorna stato ticket =>
Complete
- Ripetere.
Niente di troppo elegante. Se sto guardando il database mentre questo ciclo è in esecuzione, vedo il numero di salite indicizzate delle letture per ogni iterazione. Le prestazioni non sembrano peggiorare terribilmente, ma la macchina su cui sto testando è piuttosto veloce. Tuttavia, ho ricevuto segnalazioni di degrado delle prestazioni nel tempo da alcuni dei miei utenti.
Ho un indice attivo Status
, ma sembra comunque che scansiona la Ticket_Id
colonna ogni iterazione. Sembra che stia trascurando qualcosa, ma non sono sicuro di cosa. Il numero crescente di letture indicizzate per qualcosa di simile è previsto o l'indice si sta comportando in modo inappropriato?
- Modifiche per commenti -
In Firebird limiti il recupero delle righe come:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Quindi quando dico "prima", sto solo chiedendo un set di dischi limitato dove Status = 'Pending'
.
ticket_id
, hai bisogno di un indice su(status, ticket_id)
ticket_id
effettivamente comportato risultati peggiori rispetto alla semplice indicizzazione dello stato.
id
(il tipo di dati) di un dominio definito?