Обычно вы хотите избежать форсирования определенного порядка исполнения.Если данные или запрос изменятся, ваши подсказки и уловки могут иметь неприятные последствия.Обычно лучше предоставлять полезные метаданные в Oracle, чтобы он мог принимать правильные решения за вас.
В этом случае вы можете предоставить лучшую статистику оптимизатора о функции с помощью ASSOCIATE STATISTICS .
Например, если ваша функция очень медленная, потому что она должна читать 50 блоков каждый раз, когда она вызывается:
associate statistics with functions
check_if_player_is_eligible default cost(1000 /*cpu*/, 50 /*IO*/, 0 /*network*/);
По умолчанию Oracle предполагает, что функция выберет строку 1/20 отвремя.Oracle хочет исключить как можно больше строк, изменение селективности должно снизить вероятность выполнения функции в первую очередь:
associate statistics with functions
check_if_player_is_eligible default selectivity 90;
Но это вызывает некоторые другие проблемы.Вы должны выбрать селективность для ВСЕХ возможных условий, 90% точно не всегда будут точными.Стоимость ввода-вывода - это количество выбранных блоков, но стоимость процессора - это «используемые машинные инструкции», что именно это означает?
Существуют более продвинутые способы настройки статистики, например, с использованием Oracle DataКартридж расширяемый оптимизатор .Но картридж данных, вероятно, является одной из самых сложных функций Oracle.