このページは機械翻訳されています。英語の原文をお読みください。 English

IBSurgeon ライブラリ

InterBase(2009年之前)中的最大表大小

Dmitry Kuzmenko、2009年10月20日

当社の顧客の1人に関する興味深いテクニカルサポートのインシデントに対応している際に、実際の最大行数が宣言された制限とは異なることを発見しました。

ドキュメントセット [Operations Guide for InterBase 6, 27ページ, InterBase Specification] には次のように記載されています:

「テーブルあたりの最大行数と列数:設計上、2^32行。行はテーブルごとに32ビットの符号なし整数で列挙されるためです。」

もちろん、行は32ビット整数で列挙されます。残念ながら、実際にはどのテーブルも20億レコードの制限に達することはできません。たとえ1つの列だけを持つテーブルであってもです。

このような動作の理由は、新しい(挿入された)レコードの空き領域を計算するアルゴリズムにあります。整数オーバーフローが発生する可能性があり、interbase.logに次のエラーメッセージが表示されます:

pointer page vanished from DPM_next (249)

そして、実際のところ、データベースページサイズや行サイズはこの制限に影響しません。この制限は、常に同じ(約36.6ギガバイト)である魔法のテーブルサイズであり、任意のデータベースページサイズに対してページ単位で次のように計算できます:

1つのテーブルの最大ページ数は次のように計算できます:

MaxDataPageCount = (MaxInt / PageSize) * 17.476

もちろん、MaxInt = 2147483647です。PageSizeの代わりにデータベースページサイズを代入すると、その結果は任意のテーブルに割り当て可能なページ数を示します。

例えば、4Kページサイズのデータベースでは、テーブルは約900万データページを超えることはできません。

レコード数の観点から見ると、2つの整数列を持つテーブルは6億(!)レコードを超えて成長することはできません(すべてのレコードには14バイトのヘッダーがあることを忘れないでください)。

混乱しましたか? MaxDataPageCountにPageSizeを掛け、その結果をテーブルの最大平均レコードサイズで割ってください。そうすれば、このテーブルがいつ制限を超え、データベースが動作を停止するかを知ることができます。

この制限はFirebird 2でのみ修正されました。InterBase 2007ではまだ存在しています。

このページの情報に関する質問や提案がある場合は、[email protected] まで当社の研究チームにお気軽にご連絡ください。また、InterBaseまたはFirebirdに関連する興味深い、および/または奇妙な事柄に関する情報も歓迎します。