Я оптимизирую базу данных рабочих билетов Firebird 2.5. Они хранятся в таблице, объявленной так:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Я обычно хочу найти первый билет, который не был обработан и находится в Pending
статусе.
Мой цикл обработки будет:
- Получить 1-й билет, где
Pending
- Работайте с Ticket.
- Обновить статус заявки =>
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
фактически выполняется хуже, чем просто индексирование Status.
id
(тип данных) доменом, который вы определили?