Файловая группа по умолчанию
Если в базе данных создаются объекты без указания файловой группы, к которой они относятся, они назначаются файловой группе по умолчанию. В любом случае только одна файловая группа создается как файловая группа по умолчанию. Файлы в файловой группе по умолчанию должны быть достаточно большими, чтобы вмещать новые объекты, не назначенные другим файловым группам.
Файловая группа PRIMARY является группой по умолчанию, если только она не была изменена инструкцией ALTER DATABASE.
Системные объекты и таблицы распределяются внутри первичной файловой группы, а не внутри файловой группы по умолчанию. В случае если произошло заполнение всех файлов внутри первичной файловой группы до максимального размера, создание новых объектов и таблиц будет невозможно. Поэтому, при проектировании базы, очень важно учитывать возможный размер первичной файловой группы.
Физическая структура файлов данных
Основной единицей хранилища данных в SQL Server является страница. Место на диске, предоставляемое для размещения файла данных (MDF- или NDF-файл) в базе данных, логически разделяется на страницы с непрерывным перечислением от 0 до n. Дисковые операции ввода-вывода выполняются на уровне страницы - SQL Server считывает или записывает целые страницы данных, что при правильной организации структур хранения позволяет минимизировать количество операций ввода-вывода (данные объектов, которые часто запрашиваются вместе при правильной организации будут располагаться на одной странице).
Файлы журнала не содержат страниц, в них содержится последовательность записей журнала.
Страницы
В SQL Server размер страницы составляет 8 КБ. Это значит, что в одном мегабайте базы данных SQL Server содержится 128 страниц. Каждая страница начинается с 96-байтового заголовка, который используется для хранения системных данных о странице. Эти данные включают номер страницы, тип страницы, объем свободного места на странице и идентификатор единицы распределения объекта, которому принадлежит страница.
В следующей таблице представлены типы страниц, используемые в файлах данных базы данных SQL Server.
Тип страницы | Содержимое |
Данные | Строки данных со всеми данными, кроме данных типа text,ntext, image, nvarchar(max), varchar(max) и varbinary(max), а также данными типа xml, когда параметр текст в строке установлен в значение ON. |
Индекс | Записи индекса. |
Текст/изображение | Типы данных больших объектов: text,ntext, image, nvarchar(max), varchar(max), varbinary(max) и xml. Столбцы переменной длины, когда строки данных превышают размер 8 КБ: varchar, nvarchar, varbinary и sql_variant. |
Глобальная карта распределения, общая глобальная карта распределения | Сведения о том, размещены ли экстенты. |
Свободное место на страницах | Сведения о размещении страниц и доступном на них свободном месте. |
Карта распределения индекса | Сведения об экстентах, используемых таблицей или индексом для единицы распределения. |
Схема массовых изменений | Сведения об экстентах, измененных массовыми операциями со времени последнего выполнения инструкции BACKUP LOG для единицы распределения. |
Схема разностных изменений | Сведения об экстентах, измененных с момента последнего выполнения инструкции BACKUP DATABASE для единицы распределения. |
Поддержка больших строк
Максимальный объем данных и служебного кода, содержащихся в одной строке на странице, составляет 8 КБ. Это ограничение может быть нарушено только в двух случаях:
· если строка содержит данные типа varchar(max), nvarchar(max) или varbinary (max) - размер этих данных не учитывается. Такие данные будут храниться в виде последовательности страниц типа «Текст/изображение», а в странице содержащей строку будет храниться только указатель на начало этой последовательности.
· если строка содержит данные переменной длины типа varchar(не max), nvarchar(не max) varbinary (не max) илиsql_variant, то как только общий размер строки превысит предел в 8 060 байт, SQL Server динамически перемещает один или несколько столбцов переменной длины на отдельные страницы, начиная со столбца с наибольшим размером. Когда происходит перемещение столбца на отдельную страницу, на исходной странице сохраняется только указатель. Если при последующей операции размер строки уменьшается, SQL Server динамически перемещает столбцы обратно на исходную страницу данных. Важно отметить, что в данном случае предел в 8 060 байт может превышать только общий размер строки данных, при этом размер каждого поля строки не может быть больше размера страницы.
Экстенты
Экстенты являются основными единицами организации пространства и используются для эффективного управления страницами. Экстент - это коллекция, состоящая из восьми физически непрерывных страниц.
SQL Server поддерживает два типа экстентов.
· Однородные экстенты принадлежат одному объекту; все восемь страниц в кластере могут быть использованы только этим владеющим объектом.
· Смешанные экстенты могут находиться в общем пользовании у не более восьми объектов. Каждая из восьми страниц в экстенте может находиться во владении разных объектов.
Использование смешанных экстентов позволяет сделать распределение места более эффективным, поскольку SQL Server не размещает целые экстенты для таблиц с небольшим объемом данных.
Новая таблица или индекс - это обычно страницы, выделенные из смешанных экстентов. При увеличении размера таблицы или индекса до восьми страниц эти таблица или индекс переходят на использование однородных экстентов для последовательных единиц распределения. При создании индекса для существующей таблицы, в которой содержится достаточно строк, чтобы сформировать восемь страниц в индексе, все единицы распределения для индекса находятся в однородных экстентах.
FILESTREAM
На практике при создании приложений часто приходится хранить большие объемы неструктурированных данных, например, текстовые документы, изображения и видеоролики. Хранение множества таких объектов в реляционной базе данных может привести к падению производительности SQL Server Database Engine, поскольку для их кэширования будет использоваться буферный пул SQL Server. Поэтому обычно такие неструктурированные данные хранятся за пределами базы данных отдельно от структурированных данных. Подобное разделение как правило приводит к усложнению логики приложения. Либо, если данные связаны со структурированным хранилищем, могут быть ограничены возможности файловых потоков и производительность.
В SQL Server 2008 был добавлен новый тип хранения больших двоичных объектов (BLOB) FILESTREAM, который объединяет компонент Database Engine с файловой системой NTFS, размещая данные больших двоичных объектов (BLOB) типа varbinary(max) в файловой системе в виде файлов. Манипулирование данными, хранящимися в FILESTREAM осуществляется при помощи инструкций Transact-SQL, что позволяет использовать оптимизированное хранилище без изменения логики приложений его использующих. Интерфейсы файловой системы Windows также обеспечивают потоковый доступ к этим данным.
Для кэширования данных файлов в хранилище FILESTREAM используется системный кэш NT, что позволяет снизить возможное влияние данных FILESTREAM на производительность компонента Database Engine, поскольку буферный пул SQL Server не используется и память доступна для обработки запросов.
В SQL Server 2008 большие двоичные объекты (BLOB) могут храниться двумя способами:
· данные стандартного типа varbinary(max), данные которых хранятся в таблице
· объекты FILESTREAM типа varbinary(max), данные которых хранятся в файловой системе
Выбор в качестве хранилища базы данных или файловой системы определяется размером и назначением данных. Объекты FILESTREAM следует использовать в следующих случаях:
· средний размер сохраняемых объектов превышает 1 МБ, поскольку при работе с объектами меньшего размера сохранение больших двоичных объектов (BLOB) типа varbinary(max) в базе данных часто позволяет добиться лучшей производительности потоков;
· важен быстрый доступ для чтения;
Хранилище FILESTREAM реализовано в виде столбца типа varbinary(max), данные которого хранятся в файловой системе как большие двоичные объекты (BLOB). Стандартное ограничение типа varbinary(max), согласно которому размер файла не должен превышать 2 ГБ, не применяется к объектам BLOB, сохраняемым в файловой системе - размеры объектов ограничены только размером тома файловой системы.
Данные FILESTREAM могут сохраняться только в файловых группах FILESTREAM. Файловая группа FILESTREAM представляет собой особый тип файловой группы, в которой вместо файлов базы данных содержатся системные каталоги файлов. Эти системные каталоги файлов называются контейнерами данных, и являются интерфейсом между хранилищем компонента Database Engine и хранилищем файловой системы.