Оптимизация размеров табличных файлов БД
При создании таблиц БД ядро СУБД размечает файл данных и файл индексов таблицы под указанное количество записей. Если в процессе работы СУБД количество записей таблицы превысит запланированное, то СУБД будет расширять указанные файлы по правилам, изложенным в пункте «Автоматическое управление размерами рабочих файлов».
При попытке добавить данные в файл, достигший максимального размера, СУБД выдает соответствующий код завершения (например, 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 млрд. записей.
Для планирования таблицы с большими объемами данных:
-
указать с помощью утилиты gendb количество страниц, добавляемых при расширении файлов таблиц.
Пример
gendb gendb>SET EXTSIZE 256;
-
указать в 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;
-