- •Лабораторная работа №1 Архитектура реляционных баз данных
- •1. Архитектура баз данных
- •1.1. Архитектура баз данных ms sql Server
- •Группы файлов
- •Страницы
- •Структура файла базы данных
- •1.2. Архитектура баз данных PostgreSql
- •Физическая архитектура баз данных PostgreSql
- •Хранение больших значений. Таблицы toast.
- •Формат страницы базы данных.
- •1.1.2. Логическая архитектура баз данных PostgreSql
- •Разработка логической модели базы данных
- •2.2. Пример создания базы данных.
- •Контрольное задание.
- •Контрольные вопросы:
Группы файлов
Файлы базы данных в SQL Server 2000 объединяются в группы. Это делается в основном с целью сохранения данных целых таблиц или даже отдельных столбцов таблиц в определенных файлах. По умолчанию в базе данных создается единственная группа. И все данные располагаются в этой группе.
Группы файлов бывают следующих типов:
Primary File Group — основная группа файлов. Основной отличительной особенностью этой группы является то, что она содержит основной файл базы данных (primary file) и, как следствие, включает все системные данные. Поскольку в базе данных имеется лишь один основной файл, то и основная группа файлов может быть только одна. Другой особенностью основной группы файлов является то, что в нее автоматически включаются все файлы, не приписанные явно ни к какой иной группе. Основная группа может состоять только из одного файла (primary file) и всегда существует в базе данных.
User File Group пользовательская группа файлов. Для объединения дополнительных файлов базы данных администратор может создать одну или более пользовательских групп. Состав файлов той или иной группы зависит от ее назначения. В принципе, в базе данных может не быть ни одной пользовательской группы файлов.
Default File Group группа файлов по умолчанию. Это маркер, присваиваемый одной из созданных в базе данных групп. Основным назначением группы файлов по умолчанию является хранение данных, не приписанных явно ни к какой группе файлов. Создавая в базе данных новый объект, пользователь может явно указать, в какой группе файлов он должен храниться. Если же эта информация не указывается, то объект размещается в группе по умолчанию. Допускается конфигурирование только одной группы по умолчанию. Сразу же после создания базы данных в качестве группы по умолчанию назначается основная группа файлов. Впоследствии можно установить в качестве группы по умолчанию любую другую группу.
При хранении данных в группе файлов. SQL Server 2000 равномерно распределяет данные между всеми файлами в группе. То есть вместо того, чтобы заполнить сначала первый файл, потом второй и т. д., SQL Server 2000 по возможности записывает данные сразу во все файлы параллельно. Объем информации, сохраняемой в каждом файле группы, напрямую зависит от размера файла. Система хранения SQL Server 2000 действует таким образом, чтобы заполнение всех файлов в группе было примерно одинаковым.
Страницы
В виртуальной системе хранения SQL Server 2000 страница представляет собой минимальный блок, с которым может работать ядро системы. Каждый файл данных базы данных разбит на множество страниц. При выполнении операций ввода/вывода данные из файлов базы данных считываются по страницам, а не по строкам. Даже если пользователь обращается к единственной строке таблицы, то все равно будет считана целая страница..
Размер страницы в SQL Server 2000 составляет 8 Кбайт. Размер страницы определяет максимальный размер некоторых типов данных. Дело в том, что в общем случае данные одного столбца не могут распределяться между несколькими страницами. Поэтому размер столбцов символьных типов данных и двоичного ограничен 8000 байтами, а для символьных типов данных, поддерживающих стандарт Unicode, 4000 байт, т.к. один символ описывается 2 байтами.
Работать персонально с каждой страницей было бы неразумно с точки зрения производительности, особенно с учетом тех громадных объемов информации, которые может хранить SQL Server 2000. Поэтому для облегчения работы со страницами были созданы так называемые экстенты (extent), которые представляют собой группу из 8 страниц. Таким образом, общий объем экстента составляет 64 Кбайта. Экстент является минимальным элементом, который выделяется на уровне файла для хранения данных. Даже если необходимо сохранить всего одну страницу, то будет выделен новый экстент (если конечно страницу нельзя сохранить в одном из имеющихся экстентов).
Так как каждая страница имеет своего владельца, в качестве которого может выступать таблица, индекс или другой объект, экстент может содержать страницы, принадлежащие либо одному объекту, либо разным. От этого зависит тип экстента:
Uniform. Экстенты этого типа содержат только страницы, принадлежащие одному владельцу. Если для таблицы, представления и т. д. было выделено 8 страниц, то имеет смысл расположить их рядом, чтобы повысить скорость поиска, считывания и записи данных как на физическом, так и на логическом уровне. Для этого они размещаются в одном экстенте. Подобный подход позволяет снизить фрагментацию страниц в файле, т. к. страницы одного экстента располагаются рядом.
Mixed. В экстентах данного типа могут содержаться страницы, принадлежащие разным владельцам. Это позволяет снизить непроизводительные расходы пространства в файлах базы данных. Если бы существовали только экстенты типа Uniform, то даже для небольших по объему данных, занимающих менее 1 страницы, пришлось бы выделять целые экстенты.
SQL Server поддерживает следующие типы страниц:
Data. Страницы этого типа используются для хранения собственно данных пользовательских и системных таблиц. Однако страницы типа Data не предназначена для хранения информации тяжелых столбцов — типов данных image, text и ntext.
Как видно, в начале каждой страницы располагается заголовок, в котором содержится системная информация — тип страницы, объем свободного пространства на странице, идентификационный номер объекта, которому принадлежит страница, и т. д. Размер заголовка равен 96 байтам, что составляет ровно половину объема, резервируемого на каждой страницы для системных нужд (8192— -8000=192=96x2). Указанный заголовок имеют страницы всех типов.
Непосредственно после заголовка располагаются данные столбцов таблицы. Каждая страница применяется для хранения строк только одной таблицы, для чего она разбивается на один или более блоков (слотов), каждый из которых используется для хранения отдельной строки. Размер слота, а следовательно и их количество на странице, зависят от размера соответствующей строки. При этом следует учитывать, что размер слота для одной и той же таблицы может быть и непостоянным. Подобная ситуация складывается при использовании типов данных переменной длины (varchar, nvarchar и varbinary). Конечно, скорость работы с такими строками снижается, но зато на странице выделяется ровно столько пространства, сколько занимают сами данные.
При поиске на странице нужной строки сервер должен учитывать, что строки могут иметь разную длину. Поэтому каждая страница содержит таблицу смещения строк (row offsets). Эта таблица располагается в конце страницы и содержит номер байта (от начала страницы, а не от начала области данных — конца заголовка), с которого начинается соответствующая строка. Порядок перечисления строк в таблице смещения зеркален их порядку на странице. То есть самая последняя запись соответствует самой первой строке, предпоследняя — второй и т. д. Подобный подход позволяет решить проблему с размером таблицы смещения — она может увеличиваться до тех пор, пока не столкнется с областью данных.
Index. Этот тип страниц применяется для хранения индексов таблиц и представлений. Такая информация включает значения индексируемых столбцов, для каждого из которых также указывается ссылка на исходную строку таблицы.
Tex/Image. В страницах этого типа сохраняются данные столбцов таблиц, имеющих тип данных image, text или ntext. Особенностью хранения данных указанного типа является то, что они могут занимать более одной страницы. Таким образом, в общем случае для хранения значения столбца одного из указанных типов данных должно быть выделено более одной страницы, что невозможно при использовании страниц Data. Для хранения одного значения столбца image, text или ntext выделяется сразу целая страница. Последующее пространство также выделяется страницами.
Global Allocation Map (GAM). Этот и последующие типы страниц являются чисто служебными. Страницы рассматриваемого типа содержат информацию об использовании экстентов.
Каждая страница имеет своего владельца, в качестве которого может выступать таблица, индекс или другой объект. Таким образом, экстент может содержать страницы, принадлежащие либо одному объекту, либо разным. Однако, как сервер находит свободные страницы и восстанавливает цепочку страниц, используемых для хранения данных конкретного объекта? При этом необходимо учитывать, что страницы одного и того же владельца могут располагаться более чем одном файле, что еще более усложняет восстановление цепочки. Эта проблема решается с помощью страниц GAM, которые представляет собой битовое поле, каждый бит которого соответствует одному экстенту. Так как размер страницы равен 8 Кбайт, то одна страница GAM может описать 64 000 экстентов. Соответственно, одна страница GAM охватывает область немногим менее 4 Гбайт (64 000 х 8 х 8192).
Итак, примерно на каждые 4 Гбайта (точнее на 3,95 Гбайта) данных необходимо выделить в файле данных две страницы типа GAM, общий размер которых составит всего 16 Кбайт. Такая плотность информации позволяет хранить в оперативной памяти информацию использования экстентов, что позволяет быстро находить свободное пространство для записи данных.
Page Free Space (PFS). Страницы данного типа содержат информацию о наличии свободного пространства на страницах файла.
Страницы GAM применяются только при поиске свободного пространства для записи страниц. Однако этих страниц для полноценной работы с данными явно недостаточно. Действительно, при сохранении одной-двух строк нет смысла выделять для них новую страницу, если на уже выделенных для соответствующего объекта страницах достаточно свободного пространства. Таким образом, встает задача найти страницы, принадлежащие объекту и определить количество свободного пространства на них.
Информация о степени заполнения страниц (не экстентов) хранится в страницах типа PFS. Каждая такая страница хранит информацию о количестве свободного пространства на 8000 страниц типа Data, Text/Image и Index. Таким образом, каждая страница описывается 1 байтом. Степень заполнения каждой страницы выражается в процентах, но не точно, а примерно, и указывается с помощью битов, каждому из которых соответствует определенное состояние страницы: 0%, 1-50%, 51-80%, 81-95%, 96-100%
Страницы PFS предназначены для быстрого поиска страниц, имеющих достаточно свободного пространства для хранения данных, без сканирования самих страниц.
Index Allocation Map (IAM). Страницы этого типа хранят информацию об экстентах, используемых таблицами или индексами.
Страницы PFS не содержат данных о том, кто именно является владельцем той или иной страницы. Очевидно, что эта же информация необходима для принятия решения о том, в какой именно странице файла следует сохранить данные. Информация о владельце страницы хранится в страницах типа IAM. Каждая страница IАМ описывает экстенты, принадлежащие одному объекту. Таким образом, каждому объекту (таблице или индексу) должна быть сопоставлена как минимум одна страница IAM.
Страница IАМ представляет собой битовое поле наподобие GAM. Если бит поля установлен в 1, то в экстенте содержатся страницы, принадлежащие соответствующему объекту. Когда же поле IAM содержит 0, то экстент принадлежит другому объекту либо вообще пуст. Таким образом, одна страница IAM охватывает блок данных объемом немногим менее 4 Гбайт (3,95 Гбайта), что соответствует 64 000 экстентам. Если же не все страницы объекта располагаются в этом интервале, то необходимо создать дополнительную страницу IAM. При этом в первой странице указывается номер второй страницы IAM. Таким образом можно охватить весь файл базы данных.
Номер страницы первого поля IAM хранится в столбце FirsIAM системной таблицы sysindexes. Зная номер первой страницы IAM, всегда можно восстановить всю цепочку страниц IAM и получить список всех экстентов, содержащих принадлежащие конкретному объекту данные. Таким объектом может быть индекс (кластерный или некластерный), таблица или отдельный столбец таблицы, имеющий тип данных text, ntext или image.
