Некоторые уродливые / умные хаки, которые могут просто сработать или могут быть просто перебором.
1) Вы можете создать хороший небольшой индекс на основе функций, подобный этому (синтаксис может быть немного неработающим, сейчас у вас нет доступа к Oracle).
CREATE INDEX my_small_queue_index
ON queue_table ( decode(is_processed,'YES',null,queue_name)
,decode(is_processed,'YES',null,id)
);
Тогда вы можете выбрать вот так:
SELECT --+ index_asc(q my_small_queue_index)
decode(is_processed,'YES',null,id) AS id
FROM queue_table q
WHERE decode(is_processed,'YES',null,queue_name) = 'some queue name'
AND rownum = 1;
Должно работать хорошо, если есть огромный процент обработанных строк и только несколько необработанных (10 ^ 9 против нескольких сотен). В любом случае должно быть не больше, чем несколько.
2) Вы можете создать раздел для каждой очереди, если имена очередей фиксированы и их не много.