本記事ではInfiniDBの特徴である「エクステントマップ(水平パーティション)」について説明します。


InfiniDBのデータ格納形式

まず、エクステントマップを理解するために必要な前提知識であるInfiniDBのデータの単位について簡単に説明します。InfiniDBのデータの単位は、最小単位が「ブロック」、ブロックが複数集まった領域が「エクステント」、エクステントが複数集まった領域が「セグメントファイル」として構成されています(図1)。

InfiniDB_ExtentMap
図1:InfiniDBのデータ格納形式


InfiniDBでは上記の「エクステント」の単位でデータ内容を管理する「エクステントマップ」と呼ばれる領域を保持しています。

エクステントマップは、各エクステントに格納された列データの最小値と最大値を保持しており、各エクステントに格納されているデータの範囲を把握しています。データにアクセスする際には、このエクステントマップの最大値、最小値を参照してアクセス対象となるデータを絞り込んで抽出しています。



エクステントマップのイメージ

図2の例の場合は、顧客ID = 750のデータにアクセスする際に、InfiniDBは対象列のエクステントマップを参照します。このとき、最小値700、最大値950のエクステントである、「エクステント3」の中に顧客ID750が存在することが判断できるため、InfiniDBは必要最低限のエクステントにのみ(この場合はエクステント3にのみ)アクセスして目的のデータを取り出すことが可能です。

InfiniDB_ExtentMap02
図2 エクステントマップのイメージ


InfiniDBには汎用データベースで利用される索引機能はありませんが、エクステントマップを使用することで行の絞り込みが行われるため、すべてのエクステントにアクセスする場合に比べてディスクI/Oが減り処理を高速化できます。また、エクステントマップはInfiniDBが自動で生成してくれるため、ユーザ側でエクステントマップを作成するといったような特別な操作は不要です。

なお、エクステントマップが使用されるデータ型やデータ長については、「エクステントマップが使用されないデータ型」の記事をご参照ください。

http://infinidb-tech.ashisuto.co.jp/unused-datatypes-on-extentmap/