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