Ich optimiere eine Firebird 2.5-Datenbank mit Arbeitstickets. Sie werden in einer als solche deklarierten Tabelle gespeichert:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Ich möchte in der Regel das erste Ticket finden, das noch nicht bearbeitet wurde und sich im Pending
Status befindet.
Meine Verarbeitungsschleife wäre:
- Holen Sie sich das erste Ticket wo
Pending
- Arbeiten Sie mit Ticket.
- Ticketstatus aktualisieren =>
Complete
- Wiederholen.
Nichts Besonderes. Wenn ich die Datenbank beobachte, während diese Schleife läuft, sehe ich die Anzahl der indizierten Lesezugriffe für jede Iteration. Die Leistung scheint sich nicht zu verschlechtern, aber der Rechner, auf dem ich teste, ist ziemlich schnell. Ich habe jedoch von einigen meiner Benutzer Berichte über Leistungseinbußen im Laufe der Zeit erhalten.
Ich habe einen Index für Status
, aber es scheint immer noch, als würde er die Ticket_Id
Spalte bei jeder Iteration durchsuchen . Es scheint, als würde ich etwas übersehen, aber ich weiß nicht, was. Wird die steigende Anzahl indizierter Lesevorgänge für so etwas erwartet, oder verhält sich der Index in irgendeiner Weise schlecht?
- Bearbeitungen für Kommentare -
In Firebird beschränken Sie den Zeilenabruf wie folgt:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Wenn ich also "zuerst" sage, frage ich nur nach einem begrenzten Datensatz, wo Status = 'Pending'
.
ticket_id
, benötigen Sie wahrscheinlich einen Index für(status, ticket_id)
ticket_id
tatsächlich einschließt, ist dies schlechter, als wenn nur der Status indiziert wird.
id
(der Datentyp) eine von Ihnen definierte Domain?