Органичение на количество записей в первую очередь вызвано наличием 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 гигабайт снят.