Это связано с индексом столбца actionhistory_id.
Во время первого запроса Oracle должна вернуть все блоки индекса, содержащие индексы для записей, которые идут после 'ACT100010000', затем она должна сопоставить индекс с таблицей, чтобы получить все записи, а затем она извлекает 29999 записей из набор результатов.
Во время второго запроса Oracle должен только возвращать блоки индекса, содержащие записи между «ACT100010000» и «ACT100030000». Затем он извлекает из таблицы те записи, которые представлены в индексных блоках. На этом шаге сбора записи после того, как найден индекс, гораздо меньше работы, чем при использовании первого запроса.
Замечание вашей последней строки о том, что идентификатор меньше ACT100000000 - звучит для меня, что все эти записи могут быть в одном блоке памяти (или в непрерывном наборе блоков).
РЕДАКТИРОВАТЬ: Пожалуйста, также подумайте, что сказал Джастин - я говорил о фактической производительности, но он указывает, что идентификатор, являющийся varchar, значительно увеличивает потенциальные значения (в отличие от числа) и что предполагаемый план отражать большее время, чем реальность, потому что оптимизатор не знает весь диапазон до выполнения. Для дальнейшей оптимизации, учитывая его точку зрения, вы можете поместить индекс на основе функции в столбец id или сделать его комбинированным ключом с частью varchar в одном столбце и числовой частью в другом.