Вы говорите, что выполнение запроса занимает около 4 минут.Вывод EXPLAIN PLAN показывает приблизительную оценку 18 секунд.Таким образом, оптимизатор, вероятно, далек от некоторых своих оценок в этом случае.(Возможно, все еще выбирается наилучший из возможных планов, но, возможно, нет.)
Первым шагом в таком случае является получение фактического плана выполнения и статистики.Запустите ваш запрос с подсказкой /*+ gather_plan_statistics */
, а затем сразу же выполните select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'))
.
. Он покажет фактический план выполнения, который был выполнен, и для каждого шага он покажет предполагаемые строки, реальные строки ифактическое время занято.Опубликуйте результаты здесь, и, возможно, мы сможем сказать что-то более значимое о вашей проблеме.
Без этой информации я предлагаю попробовать следующую переписать запрос.Я считаю, что это эквивалентно, так как кажется, что ID является первичным ключом TableB.
select TableA.id,
TableA.stringField,
TableA.dateField,
TableA.someField2,
TableA.someField3,
TableB.someField1,
TableB.someField2,
TableB.someField3,
from (select * from(
select
TableA.id,
TableA.stringField,
TableA.dateField,
TableA.someField2,
TableA.someField3,
from TableA
WHERE TableA.stringField like '21'||'%'
order by TableA.dateField desc
)
where rownum < 201
) TableA
join TableB on TableA.id=TableB.id