2.3.5. Индексы
2.3.5. Индексы
В таблице БД данные обычно хранятся в том же порядке, в котором их ввели в таблицу. Многие реляционные СУБД имеют страничную организацию, при которой физически таблица может храниться фрагментарно в разных областях диска, причем строки таблицы располагаются на страницах неупорядоченно. Хотя такой способ хранения и позволяет быстро вводить новые данные, но для того, чтобы найти нужную строку, придется просмотреть всю таблицу. В промышленных системах каждая таблица может содержать миллионы строк, поэтому простой перебор ведет к катастрофическому падению производительности ИС.
Чтобы решить проблему поиска данных, СУБД использует особый объект, называемый индексом. Он подобен содержанию книги, которое указывает на все номера страниц, посвященных конкретной теме. Индекс содержит отсортированную по колонке или нескольким колонкам информацию и указывает на строки, в которых хранится конкретное значение колонки.
Например, если необходимо найти клиента по имени (рис. 2.73), можно создать индекс по колонке CustomerName таблицы CUSTOMER. В индексе имена клиентов будут отсортированы в алфавитном порядке. Для имени индекс будет содержать ссылку, указывающую, в каком месте таблицы хранится эта строка.
Рис. 2.73
Для поиска клиента серверу направляется запрос с критерием поиска (CusfomerName ="Иванов"). При выполнении запроса СУБД просматривает индекс, вместо того чтобы просматривать по порядку все строки таблицы CUSTOMER, Поскольку значения в индексе хранятся в определенном порядке, просматривать нужно гораздо меньший объем данных, что значительно уменьшает время выполнения запроса. Индекс можно создать для всех колонок таблицы, по которым часто производится поиск.
При генерации схемы физической БД ERwin автоматически создает отдельный индекс на основе первичного ключа каждой таблицы, а также на основе всех альтернативных ключей, внешних ключей и инверсионных входов, поскольку эти колонки наиболее часто используются для поиска данных. Можно отказаться от генерации индексов по умолчанию и для повышения производительности создать собственные индексы. Администратор СУБД должен анализировать наиболее часто выполняемые запросы и создавать индексы с различными колонками и порядком сортировки для увеличения эффективности поиска при работе конкретных приложений.
При создании индекса на основе ключа ERwin вводит в его состав все колонки ключа. Например, если в сущности CUSTOMER (рис. 2.73) три атрибута назначены как АК1, ERwin автоматически создает индекс и включает в него все три атрибута (CustomerName, Region, City}. Следовательно, на уровне логической модели можно неявно создать индекс, включая колонки в состав альтернативных ключей и инверсионных входов.
ERwin автоматически генерирует имя индекса, созданного на основе ключа по принципу "X" + имя ключа + имя таблицы (физическое имя таблицы, а не логическое имя сущности!), где имя ключа "РК" для первичного ключа, "IFn" - для внешнего, "AKn" - для альтернативного, "IEn" -для инверсионного входа. Например, по умолчанию при создании таблицы CUSTOMER (см. рис. 2.70) будут созданы индексы XPKCUSTOMER (первичный ключ, в состав войдет колонка CustomerID), XAK1CUSTOMER (альтернативный ключ, колонки CusfomerName, Region, City), XIE1CUSTOMER (инверсионный вход 1, колонка Region) и XIE2CUSTOMER (инверсионный вход 2, колонка CustomerAddress).
Изменить характеристики существующего индекса или создать новый можно в редакторе Index Editor (рис. 2.74). Для его вызова следует щелкнуть правой кнопкой мыши по таблице и выбрать во -всплывающем меню пункт Index.
В редакторе Index Editor можно изменить имя индекса, изменить его определение так, чтобы он принимал уникальные или дублирующиеся значения, или изменить порядок сортировки данных.
Рис. 2.74. Диалог Index Editor
ERwin создает индексы, которые могут содержать либо повторяющиеся, либо только уникальные значения. При создании нового уникального индекса (кнопка NewH, диалог New Index, рис. 2.75) следует включить опцию Unique, для создания индекса с неповторяющимися значениями опцию следует выключить. Если на основе колонки создается уникальный индекс, то при попытке вставить запись с неуникальным (повторяющимся) значением сервер выдаст ошибку и значение не будет вставлено. Например, уникальный индекс в таблице CUSTOMER, построенный на колонке QistomerName, предотвратит от внесения двух строк с информацией об одном и том же клиенте.
Иногда необходимо разрешить повторяющиеся значения, если ожидается, что индексированная колонка будет с большой вероятностью содержать повторяющуюся информацию. Например, на основе инверсионных входов, которые используются для доступа к нескольким строкам и поэтому могут содержать повторяющиеся значения, генерируется неуникальный индекс. Неуникальный индекс генерируется также на основе внешнего ключа. На основе первичного и альтернативных ключей генерируются уникальные индексы.
И наоборот, при создании нового индекса автоматически создается альтернативный ключ для уникального и инверсионный вход для неуникального индекса, а также соответствующее ключу имя индекса. Имя сгенерированного индекса в дальнейшем при необходимости можно изменить вручную.
Рис. 2.75. Диалог New Index
По умолчанию ERwin автоматически сохраняет значена . в порядке возрастания (значения сортируются по алфавиту от A до Z, а числа от 0 до 9). Если нужно изменить порядок сортировки для колонки и выбранная СУБД поддерживает режим сортировки по убыванию, следует выбрать колонку и включить опцию DESC (см. рис. 2.74).
Редактор Index Editor содержит следующие закладки:
Members - позволяет включить колонки в состав индекса;
Comment - содержит комментарий для каждого индекса;
UDP - позволяет связать с индексом свойства, определяемые пользователем
закладка, соответствующая выбранной СУБД (на рис 2.76 ORACLE) задает свойства индекса, специфические для выбранной СУБД.
Рис. 2.76. Закладка ORACLE диалога Index Editor
При создании индекса для СУБД ORACLE, SYBASE или SQL Server можно выбирать, в каком объекте физической памяти (создание и редактирование объектов физической памяти рассмотрено в 2.2.6) будет храниться индекс, и изменять параметры хранения. В табл. 2.5 представлены некоторые параметры объектов физической памяти, доступные в закладке, соответствующей выбранной СУБД диалога Index Editor для ORACLE, SYBASE и SQL.
Таблица 2.5. Параметры объектов физической памяти
Параметр Назначение ORACLE PCTFREE Задает размер пространства, которое нужно оставить свободным для обновлений и вставок в каждом блоке данных NO SORT Ускоряет создание индекса, если данные расположены физически по порядку. Если опция установлена, то значения индекса не сортируются; если нет, то значения индекса сортируются INITTRANS Задает параметры для команды CREATE TABLE MAXTRANS Задает параметры для команды CREATE TABLE SQL И SYBASE IGNORE DUPKEY Разрешает или запрещает использование повторяющихся значений ключа в таблице с уникальным индексом (кластеризованным или некластеризованным). Если опция установлена, то повторяющиеся значения не допускаются; если нет, то повторяющиеся значения разрешаются SORTED DATA Ускоряет создание индекса, если данные расположены физически по порядку. Если опция установлена, то значения индекса не сортируются; если нет, то значения индекса сортируются DUP ROW Разрешает или запрещает использование повторяющихся значений ключа в таблице с кластеризованным индексом. Если опция установлена, то повторяющиеся значения не допускаются; если нет, то повторяющиеся значения разрешаются FILLFACTOR Задает, сколько данных можно добавить к странице данных при создании индексаНекоторые СУБД поддерживают кластеризованные и кластеризованные хешированные индексы. ERwin позволяет создать такие индексы для DB2/MVS, DB2/390, HiRDB, INFORMIX, MS Access, MS SQL Server, SYBASE и SQLBase. Для того чтобы сделать индекс кластеризованным, нужно включить опцию CLUSTER в закладке, соответствующей выбранной СУБД. Кластеризованный индекс - это специальная техника индексирования, при которой данные в таблице физически располагаются в индексированном порядке. Использование кластеризованного индекса значительно ускоряет выполнение запросов по индексированной колонке. Например, можно создать кластеризованный индекс в таблице CUSTOMER по колонке City. Информация о всех клиентах из одного города будет физически располагаться на диске рядом, что значительно повысит скорость выполнения запроса, который делает выборку всех клиентов из какого-то определенного города.
Поскольку данные физически расположены в индексированном порядке, для каждой таблицы может существовать только один кластеризованный индекс. Если СУБД поддерживает использование кластеризованного индекса, то ERwin автоматически создает индекс первичного ключа кластеризованным. При создании кластеризованного индекса не по первичному ключу ERwin автоматически снимает кластеризацию с индекса по первичному ключу. Для СУБД SQLBase (CENTURA) ERwin позволяет создать кластеризованный хешированный индекс (clustered hashed index). Хеширование -альтернативный способ хранения данных в заранее заданном порядке с целью ускорения поиска, но физически это более сложно, чем простое сохранение строк в алфавитном порядке или в соответствии с числовыми значениями.
Кластеризованный или хешированный индекс значительно ускоряет операции поиска и сортировки, но добавление и удаление строк замедляется из-за необходимости реорганизации данных для соответствия индексу.