Optymalizuję bazę zgłoszeń pracy Firebird 2.5. Są one przechowywane w tabeli zadeklarowanej jako taka:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Zasadniczo chcę znaleźć pierwszy bilet, który nie został przetworzony i ma Pending
status.
Moja pętla przetwarzania to:
- Odzyskaj 1. bilet gdzie
Pending
- Pracuj z Ticket.
- Zaktualizuj status biletu =>
Complete
- Powtarzać.
Nic nadzwyczajnego. Jeśli oglądam bazę danych podczas działania tej pętli, widzę liczbę indeksowanych odczytów wzlotów dla każdej iteracji. Wydajność nie wydaje się strasznie obniżać, co mogę powiedzieć, ale maszyna, na której testuję, jest dość szybka. Jednak otrzymałem raporty o spadku wydajności z czasem od niektórych moich użytkowników.
Mam włączony indeks Status
, ale nadal wygląda na to, że skanuje Ticket_Id
kolumnę po każdej iteracji. Wygląda na to, że coś przeoczyłem, ale nie jestem pewien, co. Czy oczekiwana jest rosnąca liczba indeksowanych odczytów dla czegoś takiego, czy też indeks jest w jakiś sposób niewłaściwy?
- Edycja komentarzy -
W Firebird ograniczasz pobieranie wierszy, takie jak:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Więc kiedy mówię „pierwszy”, proszę tylko o ograniczony zestaw rekordów gdzie Status = 'Pending'
.
ticket_id
, prawdopodobnie potrzebujesz indeksu na(status, ticket_id)
ticket_id
faktycznie działało gorzej niż tylko indeksowanie statusu.
id
(typ danych) to domena, którą zdefiniowałeś?