"Насколько я знаю, индексы появляются на картинке, когда вы использовали предложение where."
Это один из вариантов использования для индексов, когда нам нужен быстрый доступ к строкам, идентифицированным конкретными значениями индексированных столбцов. Но есть и другие варианты использования.
Подсчет строк один. Для подсчета количества строк в таблице Oracle фактически должен считать каждую строку (потому что статистика может быть недостаточно свежей), что означает буквальное чтение каждого блока хранения и подсчет строк в каждом блоке. Потенциально это много читает.
Однако в индексе столбца NOT NULL также есть запись для каждой строки таблицы. Индексы намного меньше таблиц (обычно только один столбец), поэтому в блоке индекса содержится гораздо больше записей, чем в блоке таблицы. Следовательно, Oracle должен прочитать намного меньше блоков индекса, чтобы получить количество строк, чем требуется для сканирования таблицы. Чтение меньшего количества блоков быстрее, чем чтение большего количества блоков.
Это не так, если таблица имеет индексы только для столбцов, допускающих значение NULL. Oracle не индексирует нулевые значения (если индекс не является составным индексом и не заполнен хотя бы один столбец), поэтому количество записей в индексе не может гарантировать фактическое количество строк таблицы.
Другим распространенным вариантом использования для чтения индексов является выполнение инструкции SELECT, когда все столбцы в проекции находятся в одном индексе, и этот индекс также обслуживает любые условия WHERE.