Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. 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.