Порядок, вызывая более медленный выбор в 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), можно выбрать любую из этих строк.