Общие сведения о индексах

Оценить
(4 голоса)

Системы баз данных обычно используют индексы для обеспечения быстрого доступа к реляционным данным. Индекс является отдельной физической структурой данных, которая предоставляет ускоренный доступ запросов к одной или нескольким таблицам. Правильная настройка индексов является ключевым моментом для улучшения производительности запросов.

У индекса есть много сходного с предметным указателем книги. Когда вы отыскиваете необходимую тему в книге, то используете ее предметный указатель для определения номера страницы (страниц), где описывается эта тема. Аналогично этому, когда вы осуществляете поиск строки в таблице, Database Engine использует индекс для нахождения ее физического размещения. Однако существуют два основных отличия предметного указателя от индекса базы данных.

♦ Как читатель книги, вы можете решить, будете ли использовать предметный указатель книги. Такой возможности практически не существует, когда вы используете систему базы данных: компонент этой системы, называемый оптимизатором запросов, принимает решение, нужно ли использовать существующий индекс. Пользователь может манипулировать индексом при помощи индексных советов. Однако их использование рекомендовано только в небольшом количестве особых случаев. Оптимизатор и индексные советы описаны.

♦ Конкретный предметный указатель книги редактируется вместе с самой книгой и в принципе не изменяется. Это означает, что вы можете найти тему точно на той странице, где ее определяет указатель. В противоположность этому индекс базы данных может изменяться каждый раз, когда меняются соответствующие данные.

Если таблица не имеет подходящего индекса, система баз данных для поиска строки применяет метод сканирования таблицы. Сканирование таблицы означает, что последовательно (от первой до последней) отыскивается и проверяется каждая строка и эта строка помещается в результирующий набор данных в том случае, если условие поиска в предложении where возвращает значение «истина». Поэтому в память загружаются все строки в соответствии с их физическим размещением во внешней памяти. Этот метод менее эффективен, чем доступ при помощи индексов, как объясняется далее.

Индексы сохраняются в дополнительных структурах данных, называемых индексными страницами. (Структура индексных страниц очень похожа на структуру страниц с данными, как вы увидите) Для каждой индексируемой строки существует индексная запись, которая сохраняется на индексной странице.

Каждая индексная запись содержит индексный ключ плюс указатель. Поэтому каждая индексная запись значительно короче, чем соответствующая строка. Следовательно, количество индексных записей на (индексной) странице много больше, чем количество строк на странице (данных). Это свойство индексов играет очень важную роль, потому что количество операций ввода/вывода, требуемых для перемещения по структуре индекса, значительно меньше, чем количество операций ввода/вывода, требуемых для перемещения по соответствующим станицам данных. Иными словами, сканирование таблицы потребует, вероятно, много больше операций ввода/вывода, чем доступ к данным через соответствующий индекс.

Индексы Database Engine сконструированы с использованием структуры данных в виде В-дерева (сбалансированного двоичного дерева). Как предполагает само название, В-дерево имеет древоподобную структуру, в которой все самые нижние узлы (узлы-листья) имеют одинаковый номер уровня по отношению к верхнему (корневому) узлу дерева. Это свойство поддерживается, даже если добавляются новые данные или удаляются индексируемые столбцы.

На рис. 10.1 иллюстрируется структура В-дерева и прямой доступ к строке таблицы employee со значением 25 348 в столбце empno. Предполагается, что таблица employee имеет индекс по столбцу empno. Вы также можете видеть, что каждое В-дерево состоит из корневого узла, узлов листьев и нуля или более промежуточных узлов.

Общие сведения о индексах

 

Поиск данных со значением 25 348 может быть выполнен следующим образом: начиная с корневого узла В-дерева, поиск продолжается по наименьшим ключевым значениям, большим или равным отыскиваемому значению. Следовательно, в корневом узле отыскивается значение 29 346; затем загружается значение 28 559 в качестве промежуточного уровня, и искомое значение 25 348 отыскивается на уровне листа. С помощью соответствующих указателей отыскивается нужное значение. Альтернативным, но эквивалентным вариантом метода поиска может быть поиск по условию «меньше или равно».

Поиск по индексу обычно является более предпочтительным и, очевидно, более эффективным методом доступа к множеству строк таблицы. При использовании доступа по индексу требуется немного операций ввода/вывода для поиска любой строки таблицы за очень короткое время, в то время как последовательный перебор требует гораздо больше времени для поиска строки, физически находящейся в конце таблицы.

Далее обсуждаются два существующих типа индексов, кластеризованные и некластеризованные, после чего вы узнаете, как создавать индексы.


Подробнее в этой категории: Кластеризованные индексы »
Кластеризованные индексы
Некластеризованные индексы
Transact-SQL и индексы
Создание индексов
Получение информации о фрагментации индекса

Добавить комментарий


Защитный код
Обновить

© 2018 www.serversql.ru. Все права защищены.