Tôi đang tối ưu hóa cơ sở dữ liệu của Firebird 2.5 về vé làm việc. Chúng được lưu trữ trong một bảng được khai báo như sau:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Tôi thường muốn tìm vé đầu tiên chưa được xử lý và đang ở Pending
trạng thái.
Vòng lặp xử lý của tôi sẽ là:
- Lấy vé thứ 1 ở đâu
Pending
- Làm việc với vé.
- Cập nhật tình trạng vé =>
Complete
- Nói lại.
Không có gì quá lạ mắt. Nếu tôi đang xem cơ sở dữ liệu trong khi vòng lặp này chạy, tôi sẽ thấy số lần đọc được lập chỉ mục cho mỗi lần lặp. Hiệu suất dường như không suy giảm khủng khiếp mà tôi có thể nói, nhưng máy tôi đang thử nghiệm khá nhanh. Tuy nhiên, tôi đã nhận được báo cáo về sự suy giảm hiệu suất theo thời gian từ một số người dùng của tôi.
Tôi đã có một chỉ mục trên Status
, nhưng có vẻ như nó quét xuống Ticket_Id
cột mỗi lần lặp. Có vẻ như tôi đang xem xét một cái gì đó, nhưng tôi không chắc chắn những gì. Là số lần leo lên của các lần đọc được lập chỉ mục cho một cái gì đó như thế này dự kiến, hoặc là chỉ số đang hoạt động sai theo một cách nào đó?
- Chỉnh sửa cho ý kiến -
Trong Firebird, bạn giới hạn truy xuất hàng như:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Vì vậy, khi tôi nói "đầu tiên", tôi chỉ yêu cầu nó cho một hồ sơ giới hạn được thiết lập ở đâu Status = 'Pending'
.
ticket_id
, thì bạn có thể cần một chỉ số trên(status, ticket_id)
ticket_id
thực sự hoạt động kém hơn so với việc chỉ có Trạng thái được lập chỉ mục.
id
(kiểu dữ liệu) là một miền bạn xác định?