Я оптимізую базу даних робочих квитків Firebird 2.5. Вони зберігаються в таблиці, оголошеній як такий:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Я, як правило, хочу знайти перший квиток, який не був оброблений і знаходиться у Pending
статусі.
Мій цикл обробки буде:
- Отримайте перший квиток, куди
Pending
- Робіть роботу з квитком.
- Оновити статус квитка =>
Complete
- Повторіть.
Нічого занадто вигадливого. Якщо я переглядаю базу даних, поки цей цикл працює, я бачу кількість індексованих зчитувань підйомів для кожної ітерації. Продуктивність, здається, не дуже погіршується, що я можу сказати, але машина, на якій я тестуюсь, досить швидка. Однак я отримував повідомлення про зниження продуктивності з часом від деяких моїх користувачів.
У мене індекс Status
, але все ще здається, він сканує Ticket_Id
кожну ітерацію стовпця. Здається, я щось пропускаю, але я не впевнений у чому. Чи очікується збільшилася кількість індексованих читання для чогось подібного, чи індекс погано поводиться?
- Редагування коментарів -
У Firebird ви обмежуєте пошук рядків таким чином:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Тож коли я кажу "першим", я просто запитую, де обмежений набір записів, де Status = 'Pending'
.
ticket_id
, вам потрібен індекс на(status, ticket_id)
ticket_id
насправді виконується гірше, ніж просто індексування статусу.
id
(тип даних) визначений вами домен?