Задвинутый чайник
Дата: 21.10.2015 15:32:50
один и тот же запрос выполняю в SQL Plus (выполняется отлично!) и в моей программулине (выполняется плохо). В V$SQLAREA вижу два SQL_ID с разными планами выполнения. Разница в планах (смотрел dbms_xplan.display_cursor('5nx8hn25yux4b','','typical')) видна невооруженным глазом: хороший берет селективный индекс в большой таблице (в предикате стоит соответствующий критерий Х), а плохой отчего-то не признает индекс (в предикате критерий X появляется не сам по себе, а вместе с другими условиями, что приводит к TABLE ACCESS FULL). Статистики пересобирал с инвалидацией - результат нулевой. Что еще можно посмотреть, например в V$SQLAREA, чтобы понять, откуда/почему берется неправильный план и как заставить CBO взять правильный?
Задвинутый чайник
Дата: 21.10.2015 16:05:11
вроде нарыл, проблема известная - bind peeking (звиняйте чайника за наивные вопросы!)
Том Кайт советует в таких случаях делать CURSOR_SHARING=SIMILAR. У меня это не дало эффекта, сработало только CURSOR_SHARING=EXACT. Есть какая-то определенная причина, почему SIMILAR не работает? Что посоветуете, рыть дальше или удовлетвориться EXACT-ом?