- Методы доступа к данным в Oracle
- Общая информация
- TABLE FULL SCAN
- TABLE ACCESS BY ROWID, он же ROWID
- INDEX FULL SCAN
- INDEX FAST FULL SCAN
- INDEX FULL SCAN и INDEX FAST FULL SCAN
- 8 Optimizer Access Paths
- Introduction to Access Paths
- Table Access Paths
- About Heap-Organized Table Access
- Row Storage in Data Blocks and Segments: A Primer
- Importance of Rowids for Row Access
- Direct Path Reads
- Full Table Scans
- When the Optimizer Considers a Full Table Scan
- How a Full Table Scan Works
- Full Table Scan: Example
- Table Access by Rowid
- When the Optimizer Chooses Table Access by Rowid
- How Table Access by Rowid Works
- Table Access by Rowid: Example
- Sample Table Scans
- When the Optimizer Chooses a Sample Table Scan
Методы доступа к данным в Oracle
Не найдя на хабре статьи, объединяющей в удобном для чтения виде информацию о методах доступа к данным, используемых СУБД Oracle, я решил совершить «пробу пера» и написать эту статью.
Общая информация
Не углубляясь в детали, можно утверждать что Oracle хранит данные в таблицах, вместе с которыми могут существовать особые структуры данных – индексы, призванные ускорить запросы к таблицам. При выполнении запросов Oracle по-разному обращается к таблицам и индексам – способы доступа к данным в различных ситуациях и являются предметом этой статьи.
Для примеров мы будем использовать следующую таблицу и данные в ней:
Для анализа плана выполнения запроса будем пользоваться следующими средствами:
После создания индекса и использования его в примерах и перед созданием следующего индекса, он должен быть удален. Это можно сделать с помощью следующего запроса:
TABLE FULL SCAN
Данный метод доступа, как следует из названия, подразумевает перебор всех строк таблицы с исключением тех, которые не удовлетворяют предикату where (если таковой есть). Применяется он либо в случае, когда условия предиката отсутствуют в индексе, либо когда индекса нет в принципе. Примеры:
TABLE ACCESS BY ROWID, он же ROWID
Этот индекс применяется в случаях, когда нам однозначно известен внутренний идентификатор интересующей нас строки таблицы (ROWID). Это происходит в двух случаях:
- Мы указали идентификатор строки в предикате where;
- ROWID запрошенной записи был найден в индексе;
Переходим к методам доступа, используемым Oracle в случае наличия индексов.
INDEX FULL SCAN
Данный метод доступа просматривает все листовые блоки индекса для поиска соответствий условиям предиката. Для того чтобы Oracle мог применить этот метод доступа, хотя бы одно из полей ключа должно иметь ограничение NOT NULL, т.к. только в этом случае соответствующая строка таблицы попадет в индекс. Этот метод обычно быстрее чем TABLE FULL SCAN, но медленнее, чем INDEX RANGE SCAN (см. ниже).
INDEX FAST FULL SCAN
Этот метод доступа применяется, когда выполнены все требования для INDEX FULL SCAN, а также все данные, выбираемые запросом, содержатся в индексе и таким образом доступ к самой таблице не требуется. В отличие от INDEX FULL SCAN этот метод может читать блоки индекса в несколько параллельных потоков и таким образом порядок возвращаемых значений не регламентирован. Oracle также не может использовать этот метод для bitmap-индексов.
Источник
INDEX FULL SCAN и INDEX FAST FULL SCAN
В продолжение темы . Индекс на основе 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.
Источник
8 Optimizer Access Paths
An access path is a technique used by a query to retrieve rows from a row source.
This chapter contains the following topics:
Introduction to Access Paths
A row source is a set of rows returned by a step in an execution plan. A row source can be a table, view, or result of a join or grouping operation.
A unary operation such as an access path , which is a technique used by a query to retrieve rows from a row source, accepts a single row source as input. For example, a full table scan is the retrieval of rows of a single row source. In contrast, a join operation is binary and receives inputs from two row sources
The database uses different access paths for different relational data structures. The following table summarizes common access paths for the major data structures.
Table 8-1 Data Structures and Access Paths
Access Path | Heap-Organized Tables | B-Tree Indexes and IOTs | Bitmap Indexes | Table Clusters |
---|---|---|---|---|
Reason | Explanation | To Learn More |
---|---|---|