По материалам 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 гигабайт снят.