Порядок, вызывая более медленный выбор в Oracle

У меня есть таблица, в которую будут вставлены записи транзакций различных программ, и я буду обрабатывать их одну за другой. Записи выбираются одна за другой, и есть поле приоритета, где сначала обрабатывается наименьшее число.

Мой текущий запрос:

SELECT * FROM (SELECT CODE,NAME,TYPE,START_DATE, LANGUAGE, PRIORITY, SOURCE 
FROM TBL_INQUEUE ORDER BY PRIORITY) q WHERE ROWNUM = 1

Когда набор данных становится большим, выполнение запроса замедляется. Мы добавили индекс на PRIORITY колонка, но это не помогает. Мы пытались удалить ORDER BY предложение и производительность почти в два раза, но нам нужно это предложение, чтобы убедиться, что приоритетные записи будут обработаны первыми.

Есть ли способ оптимизировать это?

ОБНОВИТЬ

С предоставленными ответами вот два плана объяснения:

С заказом по индексу

введите описание изображения здесь

С МАКС. (ПРИОРИТЕТ)

введите описание изображения здесь

2 ответа

Решение

ПРИОРИТЕТ установлен на НЕ НУЛЬ, не так ли? Индекс не будет использоваться в противном случае.

Вы можете обойти эту проблему, создав составной индекс на основе функций (PRIORITY, 0), или включив в запрос "приоритет не равен нулю".

Возможно, это поможет?

SELECT CODE,NAME,TYPE,START_DATE, LANGUAGE, PRIORITY, SOURCE 
FROM TBL_INQUEUE 
WHERE PRIORITY = (SELECT MAX(PRIORITY) FROM TBL_INQUEUE)
AND ROWNUM = 1

NB. Использование "and rownum=1" произвольно; то есть, если есть несколько строк, которые разделяют значение MAX(PRIORITY), можно выбрать любую из этих строк.

Другие вопросы по тегам