Firebird 2.5 çalışma bileti veritabanını optimize ediyorum. Bu şekilde beyan edilen bir tabloda saklanırlar:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Genel olarak işlenmemiş ve Pending
statüsünde olan ilk bileti bulmak istiyorum .
Benim işlem döngüsü şöyle olurdu:
- 1. Bileti Al nerede
Pending
- Bilet ile çalışın.
- Bilet Durumunu Güncelle =>
Complete
- Tekrar et.
Çok süslü bir şey yok. Bu döngü çalışırken veritabanını izliyorsam, her yineleme için dizinli okuma tırmanışlarının sayısını görüyorum. Performansın anlayabildiğim kadar düştüğü görülmüyor, ancak test ettiğim makine oldukça hızlı. Ancak, bazı kullanıcılarımdan zaman içinde performans düşüşü raporları aldım.
Bir dizin var Status
, ama yine de Ticket_Id
her yineleme sütun aşağı tarar gibi görünüyor . Görünüşe göre bir şeye bakmıyorum, ama ne olduğundan emin değilim. Bunun gibi bir şey için indeksli okumaların tırmanma sayısı bekleniyor mu, yoksa endeks bir şekilde yanlış mı davranıyor?
- Yorumlar için düzenlemeler -
Firebird'de satır alımını şu şekilde sınırlandırırsınız:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
"İlk" dediğimde, sadece sınırlı bir kayıt kümesi istedim Status = 'Pending'
.
ticket_id
demekse, muhtemelen bir dizine ihtiyacınız var(status, ticket_id)
ticket_id
aslında Durum dizinine sahip olmaktan daha kötü performans içerecek şekilde değiştirir .
id
(veri türü) Eğer tanımlanan bir alanı?