Оптимизация размеров табличных файлов БД

При создании таблиц БД ядро СУБД размечает файл данных и файл индексов таблицы под указанное количество записей. Если в процессе работы СУБД количество записей таблицы превысит запланированное, то СУБД будет расширять указанные файлы по правилам, изложенным в пункте «Автоматическое управление размерами рабочих файлов».

При попытке добавить данные в файл, достигший максимального размера, СУБД выдает соответствующий код завершения (например, 14 «Файл данных переполнен»). В этом случае необходимо создать новый файл нужного типа с помощью одной из SQL-конструкций:

ALTER TABLE … ADD DATAFILE;
ALTER TABLE … ADD INDEXFILE;
ALTER TABLE … ADD BLOBFILE;

Максимальное количество файлов (данных, индексов, BLOB) равно 63. При превышении их количества выдается код завершения 2107 «Недопустимое количество файлов».

Максимальный размер одного файла (данных, индексов, BLOB) в СУБД ЛИНТЕР может быть равен 512*32768*4096 = 64 Гбайт или ограничен в меньшую сторону файловой системой ОС.

Таким образом, максимальное количество записей (размером до 4 Кбайт), которое может быть размещено в таблице БД, вычисляется по формуле:

MaxCountRec = 63 * MaxFileSize / CompactSizeRec

где:

MaxCountRec – максимально возможное количество упакованных до размера CompactSizeRec записей в таблице;

MaxFileSize – максимально возможный размер одного файла данных (64 Гбайт или максимально допустимый размер файла в ОС);

CompactSizeRec – средний размер упакованной записи, вычисляется по формуле:

CompactSizeRec = RecSize * PCTFILL / 100

где:

RecSize – декларируемая при создании таблицы длина записи;

PCTFILL – параметр, характеризующий степень упаковки записей;

Примечание

Данная формула применима для расчета при декларируемой длине записей до 4 Кбайт. Более длинные записи (от 4 Кбайт до 64 Кбайт) хранятся не в файлах данных, а в BLOB-файлах.

Так, например, при размере упакованной записи в 500 байт в файлах данных таблицы можно разместить одновременно (теоретически максимально) примерно 2 млрд. записей (63*16*1000000000/500), хотя СУБД реально обеспечивает поддержку только до 1 млрд. записей.

Для планирования таблицы с большими объемами данных:

  1. указать с помощью утилиты gendb количество страниц, добавляемых при расширении файлов таблиц.

    Пример

    gendb
    gendb >SET EXTSIZE 256;
  2. указать в SQL-операторе создания базовой таблицы следующие параметры:

    • планируемое максимальное количество записей таблицы (параметр MAXROWID). Параметр указывает на то, что надо зарезервировать столько страниц конвертера данных таблицы, чтобы их хватило для размещения информации о MAXROWID записей (т.е. MAXROWID влияет только на количество страниц бит-конвертера);

    • планируемое место на диске для хранения заданного количества записей (параметр MAXROW). Параметр указывает на то, что надо создать первоначальный файл данных для одновременного хранения в нем MAXROW записей (размер рассчитывается исходя из декларируемого размера записей);

    • вычисленные значения параметров PCTFILL, PCTFREE, BLOBPCT;

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

      После исчерпания выделенного файлу индексов пространства он будет, при необходимости, расширяться порциями, указанными в конструкции EXTSIZE < размер расширения файлов > утилиты gendb до максимально возможного размера 64 Гбайт;

    • если планируемый объем данных таблицы может превышать максимально допустимый размер файла данных с учетом всех возможных расширений (64 Гбайт), то следует указать количество необходимых файлов данных/индексов (параметр DATAFILES/INDEXFILES).

    Пример

    CREATE TABLE [< имя схемы >.]< имя таблицы > ( … ) MAXROWID < значение > MAXROW < значение > PCTFILL < значение > PCTFREE < значение > BLOBPCT < значение > INDEXFILE 3 DATAFILE 2;