Estou otimizando um banco de dados Firebird 2.5 de tickets de trabalho. Eles são armazenados em uma tabela declarada como tal:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Geralmente, quero encontrar o primeiro ticket que não foi processado e está no Pending
status.
Meu loop de processamento seria:
- Recupere o 1º tíquete onde
Pending
- Trabalhe com o Ticket.
- Atualizar status do ticket =>
Complete
- Repetir.
Nada muito chique. Se eu estiver assistindo o banco de dados enquanto esse loop é executado, vejo o número de leituras indexadas aumentar para cada iteração. O desempenho não parece degradar terrivelmente o que posso dizer, mas a máquina em que estou testando é bastante rápida. No entanto, recebi relatórios de degradação do desempenho ao longo do tempo de alguns dos meus usuários.
Eu tenho um índice Status
, mas ainda parece que ele varre a Ticket_Id
coluna a cada iteração. Parece que estou ignorando algo, mas não sei ao certo o que. O número crescente de leituras indexadas é algo como isso esperado ou o índice está se comportando de alguma maneira?
- Edições para comentários -
No Firebird você limita a recuperação de linhas como:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Então, quando digo "primeiro", estou apenas pedindo um conjunto limitado de registros Status = 'Pending'
.
ticket_id
, você probbaly precisa um índice em(status, ticket_id)
ticket_id
realmente teve um desempenho pior do que apenas ter o Status indexado.
id
(o tipo de dados) um domínio que você definiu?