Максимальный размер таблицы в InterBase (до 2009 года)
Дмитрий Кузьменко, 20-окт-2009
Работая над интересным инцидентом технической поддержки с одним из наших клиентов, мы обнаружили, что фактическое максимальное количество строк отличается от заявленного лимита.
В документации [Operations Guide for InterBase 6, страница 27, InterBase Specification] можно прочитать следующее:
«Максимальное количество строк и столбцов в таблице: по дизайну, 2^32 строк, поскольку строки перечисляются 32-битным целым числом без знака для каждой таблицы».
Конечно, строки перечисляются 32-битным целым числом. К сожалению, на самом деле ни одна таблица никогда не сможет достичь лимита в 2 миллиарда записей - даже таблица только с одной колонкой.
Причина такого поведения кроется в алгоритме расчета свободного пространства для новой (вставленной) записи - может произойти целочисленное переполнение, и вы увидите следующее сообщение об ошибке в interbase.log:
pointer page vanished from DPM_next (249)
И реальность такова, что размер страницы базы данных или размер строки не влияет на этот лимит. Лимит - это магический размер таблицы, который всегда одинаков (~36,6 гигабайт) и может быть рассчитан в страницах для любого размера страницы базы данных как:
Максимальное количество страниц для одной таблицы можно рассчитать как
MaxDataPageCount = (MaxInt / PageSize) * 17.476
MaxInt, конечно, = 2147483647. Подставьте размер страницы вашей базы данных вместо PageSize, и результат покажет, сколько страниц может быть выделено для любой таблицы.
Например, таблица не может иметь более ~9 миллионов страниц данных в базе данных с размером страницы 4K.
С точки зрения количества записей, таблица с двумя целочисленными колонками не может вырасти более чем до 600 миллионов (!) записей (не забывайте, что каждая запись имеет 14 байт заголовка).
Запутались? Умножьте MaxDataPageCount на PageSize и разделите результат на средний размер записи вашей самой большой таблицы - вы узнаете, когда эта таблица превысит лимит и ваша база данных перестанет работать.
Этот лимит был исправлен только в Firebird 2. Он все еще существует в InterBase 2007.
Если у вас есть вопросы или предложения по информации на этой странице, не стесняйтесь связаться с нашей исследовательской командой через [email protected]. Мы также приветствуем любую информацию об интересных и/или странных вещах, связанных с InterBase или Firebird.