(извините, это слишком долго для комментария, так я добавляю его как «ответ»)
Travis, я подозреваю, что вам убежище» У меня все получилось. Вы изменили запрос, и он «исправил его» (т. Е. Запустил менее 3 минут), но вы не знаете, почему. Позже вы обнаружите, что новая процедура снова будет перенесена с той же проблемой.
Причина в том, что при повторном запросе запроса (например, при внесении небольшого изменения в него, например добавлении скобок), Oracle генерирует новый план запроса. Когда он генерирует запрос, он, вероятно, использует функцию переплета переменных, чтобы увидеть, что вы ищете. Когда он анализирует его значением «Джо», он создает лучший план для этого конкретного значения, и он работает быстро. Если, однако, запрос будет повторно рассмотрен позже (что, вероятно, будет время от времени по мере того, как запрос будет выровнен из общего пула), может быть представлено другое значение (например, «Том»), и Oracle будет оптимизировать запрос для этого значения, который вполне может быть совсем другим планом. Затем, неожиданно, запрос на «Джо» работает намного медленнее.
Итог: если вы не знаете, почему это стало быстрее, вы не знаете, является ли улучшение постоянным или временным.
Отказ от ответственности: вышесказанное является общим советом - если вы укажете версию своей базы данных и предоставите отчет плана объяснения для двух запросов, вы можете получить более конкретные рекомендации.
Итак, вы жестко закодированы '' Joe% ''в ** этой ** хранимой процедуре, и она быстро запущена? –
да. Я снова тестирую, но выглядит как SELECT * FROM myTable WHERE FNAME (firstName || '%') AND dept = 'xyz'; починил это. – Travis