Файлы и основы структуры данных

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

Имена файлов БД

В SQL Server каждый файл имеет два типа имен: имя файла ОС и логическое имя файла.

  • Имя файла ОС. Имя файла ОС — это полный путь к файлу в файловой системе, поэтому он должен соответствовать правилам файловой системы. Например, имя файла ОС: «C:\Program Files\Intel\Media SDK\cpa_32.vp».
  • Имя логического файла. Имя логического файла — это имя, которое ссылается на физический файл в операторах T-SQL*. Каждое логическое имя файла должно быть уникальным и соответствовать правилам идентификаторов SQL Server.

БД состоят из трех типов файлов:

  • Первичный файл — Этот файл содержит исходную информацию для запуска БД и указатели на другие файлы БД, поэтому в каждой БД должен быть один первичный файл. Данные и объекты, принадлежащие БД, хранятся в первичном файле или в одном из вторичных файлов. Рекомендуемое расширение имени основного файла — .mdf (основной файл данных).
  • Вторичный файл. Целью вторичных файлов данных является распределение и расширение данных БД по нескольким файлам. Поэтому эти файлы являются необязательными. Как мы видели, по умолчанию данные БД хранятся в первичном файле, но если мы хотим, мы можем создать вторичный файл данных, а затем распределить данные между этими двумя файлами (или более, мы решаем, сколько вторичных файлов мы создадим ). Рекомендуемое расширение имени вторичного файла — .ndf (новый файл данных).
  • Файл журнала транзакций — файл журнала транзакций, содержащий все журналы транзакций, выполненные в базе данных. Позже мы подробно рассмотрим назначение и механизм журнала транзакций, но на данный момент основная цель файла журнала транзакций — поддерживать согласованность и надежность БД. Каждая БД должна иметь хотя бы один файл журнала транзакций. Рекомендуемое расширение имени вторичного файла — .ldf (файл данных журнала).

Файловые группы — файловая группа — это группа из одного или нескольких файлов данных, которые используются для администрирования, распределения и размещения данных. Каждая БД имеет первичную файловую группу, которая содержит первичный файл и любые вторичные файлы (если они существуют).

В этом примере показано, как файловая группа помогает повысить производительность. Есть три файла, Data1.ndf, Data2.ndf и Data3.ndf, которые можно создать на трех дисках соответственно и назначить файловой группе fgroup1. Затем можно создать таблицу специально для файловой группы fgroup1. Запросы данных из таблицы будут распределены по трем дискам; это улучшит производительность.

Теперь давайте начнем понимать основы структур данных в SQL Server.

Страницы. Страница — это основная единица хранения данных в SQL Server. Размер страницы 8 КБ. Каждая страница начинается с 96-байтового заголовка, который используется для хранения системной информации, номера страницы, типа страницы, количества свободного места на странице и идентификатора единицы размещения объекта, которому принадлежит страница.

Экстенты. Экстент представляет собой набор из 8 страниц, поэтому размер экстента составляет 64 КБ. Экстент — это основная единица, в которой управляется пространство. Существует два типа экстента:

  • Унифицированный экстент — Унифицированный экстент — это экстент, в котором все его страницы принадлежат одному объекту. Начиная с SQL Server 2016, это экстент по умолчанию.

  • Смешанный экстент — смешанный экстент — это степень, в которой его страницы могут принадлежать разным объектам.

Единицы размещения. Единицы размещения — это 3 типа групп, которые содержат все страницы одного типа. Каждый раздел* может включать эти 3 типа единиц распределения. Назначение единиц распределения — включить динамический размер строк. Ниже приведены 3 типа единиц распределения:

  • IN_ROW_DATA — IN_ROW_DATA — это группа, содержащая все страницы данных, размер каждой строки в которых не превышает 8 КБ. Обычно IN_ROW_DATA будет содержать большую часть данных БД. Каждый раздел* содержит как минимум один IN_ROW_DATA.
  • ROW_OVERFLOW_DATA — ROW_OVERFLOW_DATA — это группа, содержащая страницы данных, содержащие определенные столбцы из строк. Всего строк соответствует размеру 8 КБ, но размер каждого отдельного столбца меньше 8 КБ.
  • LOB_DATA — LOB_DATA — это группа, содержащая LOB-страницы. Цель LOB-страниц состоит в том, чтобы содержать столбцы данных, размер которых превышает 8 КБ. Например, varchar(max) и Image.

Существует несколько типов страниц. Страницы, содержащие пользовательские данные и индексы, а также страницы, используемые SQL Server для управления страницами, экстентами и единицами распределения:

  • Страница данных — страница данных — это страница, содержащая данные таблицы. максимальный размер страницы 8 КБ. В дополнение к заголовку страницы строки данных размещаются на странице последовательно, начиная сразу после заголовка. Таблица смещения строк начинается в конце страницы, и каждая таблица смещения строк содержит одну запись для каждой строки на странице. Каждая запись записывает, насколько далеко первый байт строки от начала страницы. Записи в таблице смещения строк располагаются в обратной последовательности относительно последовательности строк на странице. (Тип страницы = 1)

  • Страница указателя — страницы указателя содержат части индексов SQL Server*. (Тип страницы = 2)
  • Страница LOB (текст/изображение) — как мы видим в единице распределения «LOB_DATA», когда размер столбца превышает 8 КБ, обычная страница данных не может обрабатывать эти типы данных. . LOB-страницы, предназначенные для хранения больших объектов. (Тип страницы = 3 и 4)
  • Страница GAM — страница GAM (Global Allocation Map) представляет собой растровое изображение, отображающее, какие экстенты были выделены. Если бит равен 1, экстент свободен, иначе, что означает 0, экстент выделен. Страница GAM охватывает 64 000 экстентов (= ~4 ГБ). Обратите внимание, что обложка страницы GAM также называется Интервал GAM. Все системные страницы, кроме страницы PFS (страницы GAM, SGAM, IAM, DCM, BCM), отображают экстент в этом диапазоне. (Тип страницы = 8)
  • Страница SGAM — страница SGAM (общая глобальная карта распределения) представляет собой растровое изображение, отображающее, какие экстенты используются в качестве смешанных экстентов, а также содержит как минимум одну неиспользуемую страницу. Если бит равен 1, то экстент используется как смешанный экстент, а также имеет по крайней мере одну неиспользуемую страницу, в противном случае, что означает 0, экстент не используется как смешанный экстент или это смешанный экстент, и все его страницы используются. . Страница SGAM охватывает 64 000 экстентов (= ~4 ГБ). (Тип страницы = 9)

Комбинация GAM и SGAM обеспечивает простой алгоритм распределения экстентов:

  • Чтобы выделить единый экстент, ядро ​​СУБД SQL Server ищет в GAM бит 1 и устанавливает для него значение 0.
  • Чтобы найти смешанный экстент со свободными страницами, компонент SQL Server Database Engine ищет в SGAM 1 бит.
  • Чтобы выделить смешанный экстент, ядро ​​СУБД SQL Server ищет в GAM бит 1, устанавливает его в 0, а затем также устанавливает соответствующий бит в SGAM в 1.
  • Чтобы освободить экстент, ядро ​​СУБД SQL Server устанавливает для бита GAM значение 1, а для бита SGAM — значение 0. Алгоритмы, используемые внутри ядра СУБД SQL Server, более сложны, чем те, что описаны в этом документе. статье, потому что ядро ​​базы данных SQL Server равномерно распределяет данные в базе данных. Однако даже настоящие алгоритмы упрощаются за счет отсутствия необходимости управлять цепочками информации о распределении экстентов.
  • Страница PFS — страница PFS (свободное пространство страницы) записывает состояние распределения каждой страницы. Каждая страница имеет 1 байт в PFS, который записывает, выделена ли страница, и если да, то является ли она пустой, заполнена ли она на 1–50 процентов, заполнена на 51–80 процентов, заполнена на 81–95 процентов или заполнена на 96–100 процентов. Эта информация используется для определения места размещения новых страниц. Обратите внимание, что количество свободного места на странице поддерживается только для страниц кучи и текста/изображения. Страница PFS охватывает 8000 страниц. (Тип страницы = 11)
  • Страница IAM — страница IAM (карта распределения индекса) сопоставляет экстенты в части файла базы данных размером 4 ГБ, используемой единицами распределения. Каждая единица распределения содержит как минимум одну IAM-страницу в зависимости от количества файлов и их размеров. Несколько страниц IAM будут связаны в цепочку IAM. Страница IAM представляет собой растровое изображение, каждый бит которого представляет экстент, и если экстент выделяется единице распределения этой страницы IAM. Страница IAM охватывает диапазон 4 ГБ в файле. (Тип страницы = 10)

Каждая страница IAM и PFS охватывает множество страниц данных, поэтому в базе данных мало страниц IAM и PFS. Это означает, что страницы IAM и PFS обычно находятся в памяти в буферном пуле SQL Server, поэтому их можно быстро найти. Для индексов точка вставки новой строки задается ключом индекса, но когда требуется новая страница, происходит описанный ранее процесс.

  • Страница DCM — страница DCM (карта дифференциальных изменений) отслеживает экстенты, которые изменились с момента последнего резервного копирования БД. Страница DCM представляет собой растровое изображение, каждый бит представляет экстент, если бит равен 1, экстент был изменен, иначе, что означает 0, экстент не был изменен. Страница DCM охватывает 64 000 экстентов (= ~4 ГБ). (Тип страницы = 16)
  • Страница BCM — страница BCM (карта массовых изменений) отслеживает экстенты, которые были изменены в результате операций с неполным протоколированием с момента последнего резервного копирования журнала. Страница BCM представляет собой растровое изображение, каждый бит представляет экстент. Если бит равен 1, экстент был изменен операциями с неполным протоколированием после последнего резервного копирования журнала, в противном случае, что означает 0, экстент не был изменен операциями с неполным протоколированием. Страницы BCM актуальны только в том случае, если база данных использует модель восстановления с неполным протоколированием. Страница BCM охватывает 64 000 экстентов (= ~4 ГБ). (Тип страницы = 17)

Грязные страницы. Грязные страницы — это страницы, которые были изменены. Пока страницы находятся в ОЗУ и не были сброшены (название операции, перемещающей данные из ОЗУ на диск), они являются грязными страницами.

Checkpoint — Checkpoint записывает на диск все грязные страницы (которые находятся в буферном кеше*) и информацию журнала транзакций*, которая находится в ОЗУ. Следовательно, контрольная точка является хорошей точкой для применения изменений, содержащихся в журнале, во время восстановления после неожиданного завершения работы или сбоя. существует несколько типов контрольно-пропускных пунктов:

  • Автоматическая контрольная точка. Автоматическая контрольная точка выполняется автоматически в фоновом режиме, когда количество записей журналов в пуле буферов достигает предполагаемого количества журналов, которое ядро ​​СУБД SQL Server может обработать за интервал времени восстановления*.
  • Косвенная контрольная точка — непрямая контрольная точка очень похожа на автоматическую контрольную точку, за исключением того, что в этом типе контрольной точки интервал восстановления теперь можно настроить на уровне БД, поэтому время восстановления будет быстрее и точнее по сравнению с автоматический КПП.
  • Проверка вручную — проверка вручную выполняется, когда пользователь отправляет команду T-SQL CHECKPOINT.
  • Внутренняя контрольная точка — внутренняя контрольная точка возникает, когда SQL Server выполняет внутренние операции, такие как резервное копирование базы данных, создание моментального снимка базы данных, добавление или удаление файлов базы данных, выполняется чистое завершение работы службы SQL Server или 70% журнала транзакций базы данных простой модели восстановления заполнена.

Интервал восстановления. Интервал восстановления — это время, затрачиваемое ядром базы данных SQL Server* на повтор и отмену транзакций с последней контрольной точки.

Фрагментация. Существует два типа фрагментации:

  • Внутренняя фрагментация — внутренняя фрагментация, вызванная слишком большим количеством свободного места внутри страниц. Это может быть вызвано многими причинами, но основная причина заключается в том, что файлы данных не хранят данные в последовательной структуре (по сравнению с файлом журнала транзакций, которым он является). В приведенном ниже примере мы видим, как вставка данных может создать внутреннюю фрагментацию.

  • Внешняя фрагментация — внешняя фрагментация, вызванная неупорядоченными страницами. Когда происходит внешняя фрагментация, SQL Server должен следить за всеми страницами, потому что они не находятся в одном и том же месте, что снижает производительность.

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

Примечание. Фрагментация SQL Server — это не фрагментация ОС. В то время как фрагментация SQL Server связана со страницами и экстентами, фрагментация ОС связана с блоками и выполняется самой ОС.

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

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