Ограничения на количество записей в таблице

По материалам Jim Starkey и Ann Harrison

Органичение на количество записей в первую очередь вызвано наличием 4-байтового идентификатора записи в ключах индекса и при построении индексных битовых карт. Таким образом, максимальное количество записей в таблице может быть не более 2-х миллиардов.

Другое ограничение связано с размером страницы. Физически, таблица IB состоит из связанного набора страниц-указателей, каждая из которых указывает на (PAGE_SIZE - размер заголовка страницы) / 4 страниц данных. Для базы данных можно выбрать размер страницы от 1024 до 8192 байт. Таким образом, чем больше размер страницы, тем больше указателей содержит страница, и тем больше записей может быть размещено в таблице. При этом эффективность возрастает в квадрате при увеличении размера страницы в 2 раза.

Общее количество страниц таблицы также ограничено количеством 2^31. Данные Blob зачастую хранятся вне страниц данных (если данные blob больше размера страницы БД), поэтому их можно не принимать во внимание.

Каждая запись в IB имеет номер, который представляет собой закодированный номер страницы указателей, номер страницы данных, на которой размещена запись, и смещение записи в странице данных (извне "номер" записи можно получить как rdb$db_key, см. пример). Поскольку для конкретного размера страницы количество страниц-указателей является фиксированным, общее количество записей ограничивается количеством записей способных разместиться на странице данных. Записи хранятся в сжатом формате (т. е. не имеют фиксированной длины, зависящей от структуры записи. Особенно это относится к char и varchar, длина которых определяется длиной фактических данных, записанных в поле этого типа), при этом длина записи зависит еще и от версии ее формата (структуры метаданных), и от того, является ли запись оригиналом или версией другой записи. Поэтому максимальное количество записей на странице подсчитать очень трудно.

Теоретический минимум максимального количества записей можно представить как количество записей с минимальным размером.

Попробуем посчитать. Для начала рассмотрим физический размер всех типов IB:
 
Тип поля Количество байт
SMALLINT 2
INTEGER 4
FLOAT 4
DOUBLE PRECISION 8
DATE (диалект 1) 8
DATE (диалект 3) 4
TIME (диалект 3) 4
TIMESTAMP (диалект 3) 8
NUMERIC(18,x)/INT64 (диалект 3) 8
BLOB 8. Если размер данных меньше 256 байт, то значение BLOB хранится на странице данных. Если больше, то в записи хранится только указатель (8 байт).
CHAR(x) 2+x. Длина строки + длина значения поля
VARCHAR 2+x+2. Длина строки + длина значения поля + количество концевых пробелов

Для CHAR и VARCHAR необходимо рассматривать среднюю длину, а не максимальную.

Следует учитывать также размер заголовка записи, который состоит из идентификатора транзакции (32 бита), номера записи, битовой маски NULL-значений (32 бита) и другой служебной информации. Всего около 16-ти байт.

Во всех нынешних версиях InterBase, Firebird и Yaffil ограничение на максимальный размер данных в одной таблице – 36,7 гигабайт. Этот лимит не зависит от размера записи, количества записей или размера страницы БД.
 
P.S. В Firebird 2.0 лимит на размер таблицы в 36.7 гигабайт снят.

Подпишитесь на новости Firebird в России

Подписаться