В продолжение темы . Индекс на основе B* - дерева состоит из узловых и листовых блоков. Листовые блоки образуют двусвязный список. То есть блоки индекса последовательно связаны между собой ссылками. Но это совершенно не значит, что в сегменте индекса они размещены упорядочено. Вероятнее только оракл их кладет туда в произвольном порядке.
Теперь рассмотрим два вроде бы похожих вида индексных доступа: INDEX FULL SCAN и INDEX FAST FULL SCAN. Оба эти метода позволяют получать ROWID записей в таблице и по нему обращаться к записям таблицы (в том случае, если в индекс содержит все требуемые запросом колонки, то к таблице оракл вообще не обращается). Оба эти метода требуют, чтобы хотя бы одна колонка ключа имела ограничение not null.
При соблюдении этого условия запись таблицы попадет в индекс. Почему так, читайте здесь. Но на этом их похожесть и заканчивается.
INDEX FULL SCAN - при таком способе доступа оракл просматривает листовые блоки индекса в порядке их вхождения в двусвязный список листовых блоков. Что это дает? Этот метод гарантирует выборку ключей по порядку - обеспечивает отсортированную выборку. Но есть и минус в таком методе. Если индексные записи в списке находятся рядом, это совершенно не значит, что и в сегменте они также являются соседями. А это приводит к одиночному физическому чтению блоков, что не является быстрым способом получения данных с диска.
FULL SCAN доступно, если предикат ссылается на один из ключей индекса. Этот метод также доступен, когда нет предиката, но выполняются оба следующих условия:
- Все колонки, указанные в запросе, включены в индекс.
- По крайней мере, одна из индексных колонок имеет ограничение not null
INDEX FAST FULL SCAN - при таком методе читаются все индексные блоки в сегменте.
Выбираются между них листовые блоки, из которых уже берутся значения индекса.
Так как индексные блоки в сегменте размещены неупорядоченно, следовательно и результат выборки не может быть использован как отсортированная последовательность. Но есть существенный плюс в таком методе выборки. Из сегмента читаются сразу несколько смежных блоков за один заход (multiblock reads). Индекс читается несколькими параллельными процессами. Это позволяет довольно быстро получить данные с диска. FAST FULL SCAN позволяет добраться к данным, находящимся в индексе, без доступа к таблице.
Используется, когда индекс содержит все колонки, необходимые для запроса. А также одна колонна в индексном ключе должна иметь NOT NULL ограничение или хотя бы в конструкции WHERE на ключевую колонку должно быть выставлено условие is not null.