Порядок расположения столбцов

С точки зрения реляционной модели порядок атрибутов в отношении может быть произвольным.

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

Например, если СУБД фиксирует изменения в строках таблицы с первого изменённого байта и до конца строки, то размещение столбцов в таблице может быть следующим: сначала редко обновляемые с фиксированной длиной, далее редко обновляемые с переменной длиной и, наконец, часто обновляемые. При таком размещении уменьшается объём регистрируемой информации и ускоряются все модификации.

В общем случае, часто изменяемые столбцы лучше размещать рядом.

Создание ссылочных ограничений

С точки зрения реляционной теории связи между отношениями устанавливаются косвенно: по совпадению значений первичного и внешнего ключа.

На физическом уровне для удобства администрирования и поддержки ссылочной целостности связи между таблицами обычно изображаются явно на уровне схемы базы данных. Создание связи предполагает необходимость предварительного создания первичного и внешнего ключа и определения типа связи: 1:1 или 1:m.

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

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

Факторы, влияющие на производительность БД

Индексы

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

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

В простейшем случае индекс можно представить следующей таблицей:

Таблица - Структура простейшего индекса

Значение индексного выражения № записи
Алексеев
Петрова

СУБД, как правило, поддерживает несколько типов индексов.

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

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

Некоторые СУБД создают, так называемые, кластерные индексы. Кластерный индекс задаёт физическую сортировку таблицы. У таблицы может быть только один кластерный индекс. По индексному выражению кластерного индекса таблица сортируется на диске.

На физическом уровне индекс чаще всего представляет собой индексное дерево или битовый массив.

В реляционных СУБД система сама определяет, надо использовать индекс при выполнении запроса или нет. В том случае, если СУБД не находит индекс, то скорее всего произойдёт последовательный просмотр записей. В случае поиска единичных записей (например, вывести сведения о конкретном человеке) – это очень дорогостоящая операция. Поэтому на этапе создания физической модели базы данных необходимо проанализировать запросы и определить, сколько и каких индексов необходимо создать.

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

Рассмотрим некоторые рекомендации по определению состава индексов.

Индексы создаются для первичных ключей.

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

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

Если таблица большая и запрос затрагивает менее 25% строк, то желательно создать индекс по условию поиска.

Если таблица большая, но запрос затрагивает больше 25% строк, то требуется более серьёзный анализ с учётом особенностей конкретной СУБД. Можно попытаться выяснить, будет ли СУБД использовать при выполнении запроса индекс, системными средствами, например, с помощью команды Show plan или аналогичной ей.

Если какие-то столбцы таблицы часто используются в запросах, то для них можно создать индексы.

Если, например, в одних запросах для поиска используется столбец ШифрТовара, в других ШифрТовара и ЦветТовара, то составной индекс ШифрТовара, ЦветТовара удовлетворит оба типа запросов.

Если все столбцы, участвующие в запросе, проиндексированы, то выполнение такого запроса может не потребовать реального ввода/вывода, то есть доступ к данным будет чисто индексным (в оперативной памяти), что может оказаться удобным.

Использование индексов позволяет избежать такой дорогостоящей операции, как физическая сортировка строк таблицы.

Если данные в столбце часто изменяются, то наличие индекса замедляет выполнение этих операций, так как обновить надо не только таблицу, но и индекс.

Для хранения индексов требуется дополнительное место на диске и дополнительные файлы, что может создать проблемы, так как ОС способна поддерживать определённое количество файлов.

Использование индексов требует от администратора правильного использования буферов и дисков (например, индексы и таблицы – в разных буферах при считывании и физическое хранение на разных дисках).

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

Денормализация

Нормализация предполагает хранение каждого факта в одном месте.

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

Денормализация – это процесс сознательного внесения избыточности в базу за счёт объединения таблиц, приводящего к дублированию фактов.

Если приложение требует высокой скорости выполнения запросов, то можно для повышения производительности попытаться использовать денормализацию.

Денормализации лучше избегать, если

- система может достичь приемлемой производительности без денормализации;

- денормализация не улучшает производительность;

- система становится менее надёжной в работе.

При выполнении денормализации рекомендуется учитывать следующие моменты:

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

если места на диске нет, то создаётся только денормализованная база, при этом её обновление всегда выполняется программно или с помощью хранимых процедур;

если приложение создаётся для работы с денормализованными таблицами, то желательно учесть в нём будущую возможность работы с нормализованной базой.

Все решения по денормализации должны быть хорошо задокументированы.


Наши рекомендации