РЕДАКТИРОВАТЬ: Я нарушил основное правило SO, я не ответил на OP. Поскольку уже принятый ответ, я счел целесообразным предупредить.
Как правило, смешивать SQL и PL / SQL - очень плохая идея. Есть 2 отдельных движка для кода. Есть движок SQL и движок PL / SQL. Принудительное переключение между тысячами переключателей приведет к снижению производительности.
Я понимаю, почему программисты хотят это делать. Я понял Это все заключено в капсулу, тепло и нечетко, но это сильно подействует. Как природа, она соблазнит вас своими взглядами и звуками, а затем сломает лодыжку.
Даже что-нибудь столь же глупое, как это.
create or replace function my_Date (p_Date in date)
return varchar
as
begin
return to_char(p_Date, 'yyyy/mm/dd');
end;
Будет Убить ваше время выполнения.
Включите Включите автоматическую трассировку
затем запустите эти.
select to_char(created, 'yyyy/mm/dd'), to_char(last_ddl_time, 'yyyy/mm/dd') from all_objects
select my_date(created), my_Date(last_DDL_TIME) From all_objects
Второму длится вдвое больше времени. Я получаю ответ на запрос 1 за 1 секунду и 2 за 2 секунды.
И это ЧРЕЗВЫЧАЙНО простой случай ... все, что я делаю, это приведение значений. Представьте себе, если вы должны присоединиться к нему, как вы хотите. Это действительно худший случай.
Теперь подумайте о том, что оптимизатор совершенно не может сделать, когда вы прячете вещи в функции.
Когда вы делаете IN, иногда это гораздо быстрее сделать объединением. Если определенные условия выполняются, оптимизатор сделает это за вас. Он преобразует IN в JOIN. Но поскольку вы замаскировали выбор внутри функции, он больше не может определить, созрели ли условия. Вы FORCED оптимизатор, чтобы сделать что-то неоптимально.
Одной из ключевых статистических данных, на которые опирается оптимизатор, является количество строк. Это один ряд или 1 миллиард. Это известно из статистики по таблицам и индексам. Статистика вашей функции отсутствует.
Вы можете поместить их туда, можно намекать на мощность, я не говорю, что вы не можете, но почему? Почему ты хочешь? По-видимому, вы используете эту функцию, потому что вы прилежный программист, которому всю жизнь велели разбивать избыточный код на функции.
Эти правила в вашей голове, почти ни одно не относится к SQL. Оптимизатор не является компилятором. Это не может встроить вашу функцию. Только вы можете помочь вашему оптимизатору получить лучший план.