Какие показатели Oracle выбрал, зависит от многих факторов, включая вещи, которые вы не упомянули в своем вопросе, такие как количество строк в таблице, частота значений в столбце и наличие у вас отдельных или комбинированных индексов при наличии более одного столбца. индексируется.
Сказав это, я полагаю, что основная причина, по которой ваши индексы не используются:
Вы не присоединяетесь напрямую с GTABLE / GLOBAL. Вместо этого вы присоединяетесь к представлению, имеющему три дополнительных предложения WHERE, которые не являются частью индекса и, следовательно, делают его менее эффективным в этом созвездии.
Условие JOIN включает ИЛИ, что затрудняет использование индексов.
Обновление:
Если бы Oracle использовал ваши индексы для объединения - что уже очень сложно из-за условия ИЛИ - это привело бы к огромному количеству ROWID. Для каждого ROWID он должен был получить полный ряд. Поскольку полное сканирование таблицы может быть в 50 раз быстрее, чем выборка по ROWID (я не знаю, какое значение использует Oracle), он будет использовать индексы, только если он точно знает, что объединение уменьшит количество строк до получить в 50 раз.
В вашем случае существуют остальные условия WHERE (g.active = 0, g.name не равно NULL, SYSDATE - g.CTIME <= 2 * 365), которые не представлены в индексах. Таким образом, они должны применяться после объединения и после выборки строк GTABLE. Это еще более затрудняет достижение результирующего набора в 50 раз меньше, чем полное сканирование таблицы. </p>
Так что я уверен, что оценка стоимости Oracle верна, то есть использование индексов приведет к более дорогому запросу и еще большему времени выполнения.