Читайте также: |
|
Следует отметить два случая, когда после выборки идентификатора строки из индекса может понадобиться несколько посещений блока. Первый — если строка имеет в длину более одного блока (так называемая расщепленная строка), и второй — когда строка за время своего существования увеличилась и ее пришлось переместить из исходного блока в другой (мигрировавшая строка). В редких случаях строка может сначала мигрировать, а затем опять увеличиться и стать расщепленной.
Рассмотрим некоторые свойства индексов, имеющих структуру В*-дерева.
1. Количество операций ввода-вывода, необходимых для получения идентификатора строки, зависит от числа уровней ветвления дерева. По мере того как индекс увеличивается в размерах, Oracle может добавлять в него новые уровни, чтобы обеспечить сбалансированность дерева. Однако в действительности практически невозможно получить более четырех уровней. Например, при двухкилобайтных блоках базы данных индекс для шестибайтных значений столбца вырастет до четырех уровней, когда число элементов индекса превысит 2000000, и (в зависимости от степени сжатия блоков-ветвей) останется на этом же уровне для миллиардов строк. Что касается чтения с диска, то, как правило, осуществляется чтение не более двух нижних уровней, поскольку первые два уровня часто используемых индексов обычно кэшируются в SGA.
2. Корневой узел и узлы-ветви индекса сжимаются, поэтому они содержат ровно столько начальных байтов значения, сколько нужно для того, чтобы отличить его от других значений. Узлы-листья содержат полное значение. Это позволяет выполнить некоторые запросы только при помощи индекса, т.е. без обращения к блоку данных:
SELECT COUNT(*)
FROM employees emp
WHERE emp.ename LIKE 'S%';
Однако это сработает лишь при условии, что столбец ENAME определен как NOT NULL (поскольку неопределенные значения не индексируются).
3. Значения в индексе упорядочиваются по ключевому значению, а блоки индексов связываются в двунаправленный список. Это обеспечивает последовательный доступ к индексу и позволяет использовать индекс для выполнения операции ORDER BY в запросе.
4. Индекс, имеющий структуру В*-дерева, можно применять как для поиска точного соответствия, так и для поиска диапазона значений:
ename < 'JONES', ename BETWEEN 'JONES' AND 'SMITH'
5. Индексы, имеющие структуру В*-дерева, могут охватывать несколько столбцов таблицы (такие индексы называются составными). Оптимизатор может использовать составные индексы только там, где задана лидирующая часть индекса. Например, индекс по столбцам (ENAME, JOB) при выполнении запроса
SELECT * from employee emp WHERE emp.job = 'SALES';
применяться не будет, поскольку лидирующая его часть (ENAME) в запросе не указана.
6. Оптимизатор Oracle сам примет решение о том, использовать индекс или нет, если мы не повлияем на него посредством подсказки или путем изменения SQL-запроса.
7. Неопределенные значения не индексируются. Если столбец, для которого рассматривается возможность индексирования, допускает неопределенные значения, то оптимизатор откажется применять его в определенных операциях, которые, по вашему мнению, могут выполняться с использованием индекса. Самый очевидный пример — ORDER BY.
Дата добавления: 2015-08-09; просмотров: 86 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Как работает индекс? | | | Отключение индексов |