Эта страница переведена машинным переводом. Читайте английский оригинал. English

Библиотека IBSurgeon

Максимальный размер таблицы в 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.