У вас есть два критерия с предикатами диапазона (больше / меньше чем). Сканирование диапазона индекса может начинаться в одной точке индекса и заканчиваться в другой.
Для составного индекса времени начала и «Время начала + длительность / 24», поскольку передний столбец - время начала, а предикат - «меньше значения привязки», он начнется с самого левого края индекса (самое раннее время начала) и диапазон сканирования всех строк до точки, где время начала достигает предела. Для каждого из этих совпадений он может оценить вычисленное значение для «Starttime + duration / 24» в индексе по отношению к значению привязки и пропустить или отклонить строку. Я подозреваю, что большинство данных в таблице старые, поэтому у большинства записей старое время старта, и вы в конечном итоге сканируете большую часть индекса.
Для составного индекса «Время начала + длительность / 24» и время начала, поскольку передний столбец является функцией, а предикат «больше значения привязки», он будет начинаться частично через индекс и работать до конца. Для каждого из этих совпадений он может сравнить начальное время индекса со значением привязки и пропустить или отклонить строку. Если переданная конечная дата является недавней, я подозреваю, что это на самом деле связано с гораздо меньшим количеством сканируемого индекса.
Даже без времени начала в качестве второго столбца в индексе существующий индекс на основе функций «Время начала + длительность / 24» все равно должен быть полезен и использоваться. Проверьте план объяснения, чтобы убедиться, что значение привязки является либо датой, либо преобразованной в дату. Если он преобразован, убедитесь, что используется соответствующая маска формата (например, введенное значение '1 / Jun / 09' может быть преобразовано в год 0009, поэтому Oracle увидит условие как очень смягченное и будет склонно не использовать индекс - плюс результат может быть неправильным).
"В Sql Developer план запроса показывает, что индексы не используются." Если индекс не использовался для поиска строк таблицы2, я подозреваю, что оптимизатор думал, что большая часть / вся таблица2 будет возвращена [что очевидно не является ' т, по вашим номерам. Я предполагаю, что это хотя большая часть таблицы 1 будет возвращена, и, следовательно, ни один из ваших предикатов не сделал большую фильтрацию. Как я уже говорил выше, я думаю, что предикат «меньше чем» не является селективным, но «больше чем» должно быть. Посмотрите на план объяснения, особенно значение ROWS, чтобы увидеть, что Oracle думает
PS.
Корректировка значения означает, что оптимизатор меняет основу для своих оценок. Если планировщик поездки говорит, что на поездку у вас уйдет шесть часов, потому что она предполагает среднюю скорость 50, если вы скажете, что она в среднем составляет 100, она выйдет через три часа. на самом деле это не повлияет на скорость, с которой вы путешествуете, или на то, сколько времени потребуется, чтобы совершить путешествие.
Таким образом, вы только хотите изменить это значение, чтобы оно более точно отражало фактическое значение для вашей базы данных (или сеанса).