Самый простой способ выяснить это - проверить ваши запросы.
Убедитесь, что проверили это самостоятельно, индексы и данные в вашей таблице могут дать разные результаты с вашей таблицей.
Без индекса, похоже, есть лучший подход с использованием аналитической функции DENSE_RANK :
SELECT MIN(id) KEEP (DENSE_RANK FIRST ORDER BY creation_date)
INTO lv_id
FROM table1
WHERE foo = p_foo;
Я использовал следующий код для проверки времени, затрачиваемого вашими запросами (выполнить этот блок несколько раз, результаты могут отличаться):
DECLARE
p_foo table1.foo%TYPE := 'A';
lv_id table1.id%TYPE;
t TIMESTAMP := SYSTIMESTAMP;
BEGIN
FOR i IN 1 .. 100 LOOP
-- Query here
END LOOP;
dbms_output.put_line(SYSTIMESTAMP - t);
END;
Результаты:
Использование курсора, выборка первой строки:
2,241 с
Использование запроса с ROWNUM
:
1,483 с
Использование DENSE_RANK
:
1,168 с