J'optimise une base de données Firebird 2.5 de tickets de travail. Ils sont stockés dans une table déclarée comme telle:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Je souhaite généralement trouver le premier ticket qui n'a pas été traité et qui est en cours Pending
.
Ma boucle de traitement serait:
- Récupérer le 1er ticket où
Pending
- Travaillez avec Ticket.
- Mettre à jour l'état du ticket =>
Complete
- Répéter.
Rien d'extraordinaire. Si je regarde la base de données pendant l'exécution de cette boucle, je vois le nombre de lectures indexées grimper pour chaque itération. Les performances ne semblent pas se dégrader terriblement, ce que je peux dire, mais la machine sur laquelle je teste est assez rapide. Cependant, j'ai reçu des rapports de dégradation des performances au fil du temps de certains de mes utilisateurs.
J'ai un index Status
, mais il semble toujours qu'il balaye la Ticket_Id
colonne à chaque itération. Il semble que j'oublie quelque chose, mais je ne sais pas quoi. Le nombre croissant de lectures indexées pour quelque chose comme cela est-il attendu, ou l'index se comporte-t-il d'une manière ou d'une autre?
- Modifications pour commentaires -
Dans Firebird, vous limitez la récupération des lignes comme:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Donc quand je dis "premier", je lui demande juste un record limité où Status = 'Pending'
.
ticket_id
, vous avez probablement besoin d'un index sur(status, ticket_id)
ticket_id
réellement effectué moins bien que simplement avoir le statut indexé.
id
type de données est-il un domaine que vous avez défini?