- •Базы данных
- •Раздел 4. Создание и использование баз данных средствами субд Microsoft sql Server (Лекции 12÷14)
- •Клиент-серверная система sql Server
- •Настольная система
- •Ускорение доступа к данным. Индексирование. Хеширование
- •Схемы хеширования
- •Отображение ключей путем хеширования с цепочками
- •Подробнее о методах хеширования см. – Литература.
Ускорение доступа к данным. Индексирование. Хеширование
Чтобы пользователь чувствовал себя комфортно, время ожидания ответа на запрос к БД должно быть приемлемым – желательно не превышать нескольких секунд. В связи с этим требованием, на физическом уровне архитектуры баз данных специально разрабатываются методы ускорения выборки, позволяющие обойтись без полного перебора строк при выполнении реляционных операций модификации отношений и отбора данных.
Наибольший эффект дают метод индексирования и метод хеширования значений ключей отношения.
Индексирование
Индекс, индексирование представляет собой механизм доступа, ускоряющий выборку данных из таблицы.
Индексирование – логическая сортировка строк таблицы. Оно заключается в создании вспомогательных файлов, содержащих упорядоченные списки значений ключей отношения со ссылками на строку отношения, в которой они находятся.
Индексные файлы занимают дополнительную память, но резко ускоряют поиск, благодаря применению специальных высокоэффективных методов поиска, например, метода половинного деления. Для одного отношения может быть создано несколько индексов. Кроме того, можно создавать индекс для нескольких отношений, если они содержат одинаковые атрибуты, что позволяет ускорить выполнение операций соединения отношений.
Индексы позволяют находить строки, в которых значения ключевых полей совпадают с заданным значением или принадлежат заданному интервалу.
Хеширование (перемешивание, иногда называли рандомизацией)
Хеширование (или хэширование, англ. hashing, от hash - перемешивание) – это метод прямого произвольного доступа к записям базы данных, обеспечивающий быструю произвольную выборку и редактирование записей.
Метод заключается в преобразовании ключа записи в абсолютный или относительный адрес расположения записи в физической памяти. Хеширование обычно используется для уменьшения времени доступа к дисковым файлам базы данных.
Функцию преобразования ключа обычно называют функцией хеширования (хеш-функцией или функцией свёртки), таких функций много, они имеют разную эффективность. Результат вычисления хеш-функции – хеш-код (или хеш-адрес) – обычно целое число в диапазоне физических номеров строк таблицы.
В общем случае однозначного соответствия между исходными данными и хеш-кодом нет. Поэтому может существовать множество записей данных, дающих одинаковые хеш-коды – т.е. возникают так называемые коллизии. Вероятность возникновения коллизий играет немаловажную роль в оценке «качества» хеш-функций. В идеале для задач поиска хеш-адрес должен быть уникальным, чтобы за одно обращение получить доступ к элементу, характеризуемому заданным ключом (идеальная хеш-функция). Однако на практике идеал приходится заменять компромиссом и исходить из того, что получающиеся наборы с одинаковым хеш-адресом содержат более одного элемента – т.е. допускаются коллизии. Коллизии разрешаются за счет организации списков в дополнительных участках памяти.
На практике часто используют простые хеш-функции, например, f(k)= k mod p, где k – целое число, первичный ключ отношения; р – простое целое число; mod – операция, вычисляющая остаток при целочисленном делении.
Хеширование используется не только в базах данных – это широко используемый метод информатики. Хеширование полезно, когда широкий диапазон возможных значений должен быть сохранен в малом объеме памяти, и нужен способ быстрого, практически произвольного доступа. Заглядывая в адресную книгу, энциклопедию, алфавитный указатель, мы даже не задумываемся, что упорядочение по алфавиту является не чем иным, как хешированием.
В общем, в широком смысле, – хеширование есть разбиение множества ключей (однозначно характеризующих элементы хранения и представленных, как правило, в виде текстовых строк или чисел) на непересекающиеся подмножества (наборы элементов), обладающие определенным свойством. Это свойство и описывается хеш-функцией, и называется хеш-адресом. Решение обратной задачи возложено на хеш-структуры (хеш-таблицы): по хеш-адресу они обеспечивают быстрый доступ к нужному элементу.
В определенном смысле, хеширование похоже на использование массивов для прямого доступа к элементам данным по индексу массива. Как известно, массив задает отображение (A) множества индексов (I) на множество элементов (E), т. е. A: I → E. Массив позволяет по индексу быстро найти требуемый элемент. Хеширование решает в точности такую же задачу. Однако здесь уже в роли индекса выступает хеш-адрес, который определяется как значение некоей хеш-функции, применяемой к уникальному ключу. В этом смысле хеш-структуры можно рассматривать как обобщение массива.
Хеш-таблицы часто применяются в базах данных, и, не менее широко, в языковых процессорах типа компиляторов и ассемблеров, где они эффективно обслуживают таблицы идентификаторов. В таких приложениях, таблица – наилучшая структура данных.
Так как всякий доступ к таблице должен быть произведен через хеш-функцию, функция должна удовлетворять двум требованиям: Она должна быть быстрой, и она должна порождать хорошие ключи для распределения элементов по таблице. Последнее требование минимизирует коллизии (случаи, когда два разных элемента имеют одинаковое значение хеш-функции) и предотвращает случай, когда элементы данных с близкими значениями попадают только в одну часть таблицы
