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