
Каждый дата файл делится на блоки. Размер блока указан в файле инициализации, параметр DB_BLOCK_SIZE. Каждый дата файл имеет заголовок размер которого 20 байт, (further the number of blocks in the data file can be found 24 bytes into the file) Эту строку я для себя перевел как: если количество блоков большое то 24 байта. Блоки различаются по типам: табличные данные, индексные данные, cluster data(шо за зверь пока незнаю). Каждый блок подразделен на секции. Картинка показывает эти секции.
Заголовок блока содержит: тип блока; object id таблицы, индекса или кластера; контрольную сумму. Ниже расположен table directory и еще ниже row directory. Оба переменной длины. row directory содержит информацию о том как много строк с данными в блоке и для каждой этой строки выделено 2 байта, указатель(смещение) на фактическое расположение данных. Чтобы получить адрес данных, нужно отсчитывать смещение от начала row directory. Данные заполняются снизу вверх(от конца блока). При вставке новой строки сами данные заполняют нижнюю часть свободной области, а ссылка на данные (смещение) в row directory соответственно сверху свободной области. Когда блок полностью заполнен, начинается заполнение нового блока.
Каждая строка в блоке имеет 3х байтовый заголовок. Первый байт содержит набор флагов показывающих состояние строки. Как пример установленный 5 бит показывает, что строка удалена. Обычно первый байт содержит 0х2С, если строка удалена 0х3С. Второй байт показывает блокирована ли строка. Третий байт показывает количество столбцов в строке. Если общая сумма превышает 255 байт, то заголовок строки 4 байта учитывающих 65536 байт. После заголовка строки идут данные. Каждый столбец(колонка таблицы) начинается с 1 байта указывающего на размер столбца. Если значение столбца NULL то поле заполняется значением 0xFF.
Пример дампа
189d3790h: 3C 01 11
189d37a0h: 04 C3 06 13 2F 04 C3 06 13 2F 02 C1 37 0D 4D 59
189d37b0h: 5F 54 45 4D 50 5F 54 41 42 4C 45 02 C1 02 FF 02
189d37c0h: C1 03 07 78 6B 03 17 12 08 38 07 78 6B 03 17 12
189d37d0h: 08 38 07 78 6B 03 17 12 08 38 02 C1 02 FF FF 01
189d37e0h: 80 FF 02 C1 07 02 C1 02
Пример столбцов
Col 1 04 C3 06 13 2F
Col 2 04 C3 06 13 2F
Col 3 02 C1 37
Col 4 0D 4D 59 5F 54 45 4D 50 5F 54 41 42 4C 45
Col 5 02 C1 02
Col 6 FF
Col 7 02 C1 03
Col 8 07 78 6B 03 17 12 08 38
Col 9 07 78 6B 03 17 12 08 38
Col 10 07 78 6B 03 17 12 08 38
Col 11 02 C1 02
Col 12 FF
Col 13 FF
Col 14 01 80
Col 15 FF
Col 16 02 C1 07
Col 17 02 C1 02
Когда строка удалена, пространство становится доступным для записи. Но сами данные все еще находятся в блоке, хоть место и помечено как свободное.