Я оптимізую базу даних робочих квитків 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(тип даних) визначений вами домен?