Я пытаюсь улучшить производительность проекта, над которым я работаю, и обнаружил, что самое большое узкое место в определенном запросе.
select bar from foo where bar in (:bars);
Цель запроса - просто отразить группузначений для бара вне таблицы foo, чтобы увидеть, какие там есть, а какие нет.Таблица foo огромна, и этот запрос занимает не менее 10 минут, даже если во входном списке всего 5 баров.
Теперь вот еще один запрос, который работает только для одного бара:
select case when exists (select 1 from foo.bar where bar = 'value') then 'Y' else 'N' end from dual;
Это выполняется за небольшую долю секунды и дает мне необходимую информацию.
Разница в планах объяснения между двумя запросами заключается в том, что первый использует «быстрое полное сканирование», а второй - «пропуск»сканирования.Столбец столбца индексируется, если это имеет значение.
Вопрос в том, как вообще, если я могу получить запрос, который выполняется с производительностью второго запроса, но позволяет мне бросать несколько столбцов в него, как первый запрос??Это важно для меня, потому что обычно проверяют по 10–100 тыс. Баров, причем не только складываются доли секунды, но и каждое соединение с базой данных является точкой отказа.
РЕДАКТИРОВАТЬ: Также в случаеэто имеет значение, запрос выполняется в Java, в частности с классом org.springframework.jdbc.core.JdbcTemplate.Я получаю одинаковые показатели производительности, независимо от того, запускаю ли я запрос через Java или запускаю его в SQL Developer.