Saya mengoptimalkan basis data Firebird 2.5 tiket kerja. Mereka disimpan dalam tabel yang dinyatakan sebagai:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Saya biasanya ingin menemukan tiket pertama yang belum diproses dan dalam Pending
status.
Loop pemrosesan saya adalah:
- Ambil Tiket 1 di mana
Pending
- Bekerja dengan Tiket.
- Perbarui Status Tiket =>
Complete
- Ulang.
Tidak ada yang terlalu mewah. Jika saya menonton database saat loop ini berjalan, saya melihat jumlah tanjakan yang diindeks dibaca untuk setiap iterasi. Performanya sepertinya tidak terlalu buruk, tetapi mesin yang saya uji cukup cepat. Namun, saya telah menerima laporan penurunan kinerja dari waktu ke waktu dari beberapa pengguna saya.
Saya sudah memiliki indeks Status
, tapi sepertinya masih memindai Ticket_Id
kolom setiap iterasi. Sepertinya saya mengabaikan sesuatu, tapi saya tidak yakin apa. Apakah jumlah pendakian yang diindeks dibaca untuk sesuatu seperti ini yang diharapkan, atau apakah indeks tersebut mengalami kesalahan dalam beberapa hal?
- Suntingan untuk komentar -
Di Firebird Anda membatasi pencarian baris seperti:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Jadi ketika saya mengatakan "pertama", saya hanya meminta catatan terbatas yang ditetapkan di mana Status = 'Pending'
.
ticket_id
, Anda mungkin perlu indeks pada(status, ticket_id)
ticket_id
benar - benar dilakukan lebih buruk daripada hanya memiliki Status diindeks.
id
(tipe data) domain yang Anda tetapkan?