4.2.1.2.1.3.2.4. Сохранение на диск

 
Сохранение InMem-фрагмента на диск выполняется по одному из следующих условий:
Когда совокупный объём достигает предела, определённого параметром data/write/chunk_size
Когда выявляется, что InMem-фрагмент является отстающим
 
В обоих случаях InMem-фрагмент закрывается для дальнейшей записи и перемещается в очередь на сохранение на диск.
 
Сохранение выполняется отдельным фоновым потоком в порядке очереди. Если данные в InMem-фрагмент захватывали несколько временных секций (т.е. разные сутки), то для каждой из них сохраняется отдельный файл фрагмента.
 
Совокупный размер сохранённых файлов фрагментов может быть меньше значения параметра data/write/chunk_size. Это связано с тем, что структуры внутри файлового фрагмента более компактны в сравнении с их аналогами в InMem-фрагменте.
 
После передачи InMem-фрагмента на сохранение новый фрагмент для соответствующей секции ключей порождается только при вставке новой записи. Таким образом, если по секции ключей прекращают поступать новые записи, то её текущий InMem-фрагмент по прошествии некоторого времени будет принудительно сохранён на диск (как отстающий). Новый фрагмент для секции не будет порождён. Соответственно, по устаревшим секциям оперативная память не потребляется.
 
После сохранения очередного InMem-фрагмента на диск выполняется операция отсечения начала журнала транзакций (TxCut).

Принудительное сохранение отстающих InMem-фрагментов

 
В случае, если по секции ключей новые записи сохраняются со значительно меньшей интенсивностью в сравнении с другими секциями, то её текущий InMem-фрагмент будет препятствовать выполнению операции отсечения начала журнала транзакций (TxCut), что приведёт к следующим эффектам:
Увеличение размера файла журнала ввиду необходимости выделения дополнительных сегментов
Увеличению времени запуска базы данных ввиду необходимости просканировать большее число записей журнала
 
Чтобы избежать этого, реализован механизм принудительного сохранения InMem-фрагмента: если с момента порождения текущего InMem-фрагмента по некоторой секции ключей было сохранено на диск NumActiveItemSections InMem-фрагментов по другим секциям (NumActiveItemSections - количество секций ключей в базе данных, по которым ведётся сохранение новых записей), то такой InMem-фрагмент признаётся отстающим, закрывается для записи и передаётся в очередь на сохранение на диск.