Очень часто, когда планы выполнения с сканированиями диапазона индексов превосходят планы с полным сканированием + сортировками или хэш-соединениями, но CBO выбирает полные сканирования, потому что оптимизатор полагает, что найдет больше совпадающих результатов, чем на самом деле жизнь.
Другими словами, если оптимизатор думает, что он собирается получить 1M строк из таблицы A и 1000 строк из таблицы B, он вполне может выбрать полное сканирование + сортировка слиянием или хэш-соединение; если, однако, когда он на самом деле выполняет запрос, он получает только 1 строку из таблицы A, сканирование диапазона индекса вполне может быть лучше.
Сначала я посмотрю на некоторые плохо выполняющиеся запросы и проанализирую избирательность предикатов, чтобы определить, делает ли оптимизатор разумные оценки числа строк для каждой таблицы.
EDIT:
Вы упомянули, что оценки мощности неверны. Это коренная причина ваших проблем; стоимость хеш-соединений и сортировок, вероятно, вполне приемлема. В некоторых случаях оптимизатор может использовать неправильные оценки, потому что он не знает, насколько коррелированы данные. Гистограммы в некоторых столбцах могут помочь (если вы их еще не получили), а в некоторых случаях вы можете создавать функциональные индексы и собирать статистику по скрытым столбцам, чтобы предоставить оптимизатору еще лучшие данные.
В конце концов, ваш трюк по определению количества элементов в различных таблицах в запросах вполне может потребоваться для достижения удовлетворительной производительности.