複合 HashIndex により、照会のパフォーマンスが向上し、高いコストがかかる マップのスキャンを避けることができます。また、この機能は、検索条件に多くの属性が関係する際、 キャッシュ・オブジェクトを検索するための便利な方法を HashIndex API に 提供します。
複合 HashIndex を使用すると、 一致検索条件に入れた複数の属性によって、キャッシュされたオブジェクトを 高速かつ簡単に見つけることができます。複合索引は、完全属性一致検索をサポート しますが、範囲検索はサポートしません。
適切な複合索引が WHERE 条件で 使用可能な場合、複合索引によって 照会のパフォーマンスを改善できます。適切な複合索引とは、 全属性一致の WHERE 条件に含まれているのとまったく同じ属性を その複合索引が持っているという意味です。
照会では、次の例のように 1 つの 条件に多数の属性が関係することがあります。
SELECT a FROM Address a WHERE a.city='Rochester' AND a.state='MN' AND a.zipcode='55901'
複合索引では、 マップのスキャンを回避したり、複数の単一属性索引の結果を結合したりすることで、 照会のパフォーマンスを改善できます。例では、属性 (city、state、zipcode) を持つ複合索引が定義されている場合は、照会エンジンは、複合索引を使用して、city='Rochester'、state='MN'、および zipcode='55901' のエントリーを検索できます。 複合索引も、city、state、および zipcode 属性に対する 属性索引もなければ、照会エンジンは、マップをスキャンするか、複数の単一属性検索を結合する必要があり、 それには通常コストの高いオーバーヘッドが生じます。また、複合索引の照会 がサポートするのは、完全一致パターンのみです。
複合索引を構成する方法は 3 とおりあります。XML を使用するか、プログラマチックに行うか、 またはエンティティー・アノテーションを付ける (エンティティー・マップの場合のみ) 方法です。
プログラマチック構成
プログラマチックに行う場合、以下のサンプル・コードによって、 上記 XML と同じ複合索引が作成されます。
HashIndex mapIndex = new HashIndex();
mapIndex.setName("Address.CityStateZip");
mapIndex.setAttributeName(("city,state,zipcode"));
mapIndex.setRangeIndex(true);
BackingMap bm = objectGrid.defineMap("mymap");
bm.addMapIndexPlugin(mapIndex);
複合索引の構成は、XML を使用した 通常の索引の構成と同じですが、attributeName プロパティー値は例外なので注意してください。複合索引の場合、attributeName の 値は、コンマ区切りの属性のリストです。 例えば、値クラス Address は、city、state、および zipcode の 3 つの 属性を持つとします。この場合、"city,state,zipcode" という attributeName プロパティー値を 使用して複合索引を定義し、複合索引に city、state、および zipcode が含まれていることを 示すことができます。
また、複合 HashIndexes は、範囲検索を サポートしないため、RangeIndex プロパティーを true に設定しないよう 注意してください。
XML の使用
XML で複合索引を 構成するには、下のようなコードを構成ファイルの backingMapPluginCollections エレメント内に 組み込みます。
Composite index - XML configuration approach
<bean id="MapIndexPlugin" className="com.ibm.websphere.objectgrid.plugins.index.HashIndex">
<property name="Name" type="java.lang.String" value="Address.CityStateZip"/>
<property name="AttributeName" type="java.lang.String" value="city,state,zipcode"/>
</bean>
エンティティー・アノテーション
エンティティー・マップの場合、 アノテーションによる方法を使用して 複合索引を定義できます。エンティティー・クラスのレベルで、CompositeIndexes アノテーション内に CompositeIndex のリストを定義できます。CompositeIndex には name と attributeNames プロパティーがあります。各 CompositeIndex は、エンティティーの関連の BackingMap に 適用される HashIndex インスタンスに関連付けられます。 HashIndex は、非範囲索引として構成されます。
@Entity
@CompositeIndexes({
@CompositeIndex(name="CityStateZip", attributeNames="city,state,zipcode"),
@CompositeIndex(name="lastnameBirthday", attributeNames="lastname,birthday")
})
public class Address {
@Id int id;
String street;
String city;
String state;
String zipcode;
String lastname;
Date birthday;
}
各複合索引の name プロパティーは、 エンティティーおよび BackingMap 内で固有でなければなりません。名前が指定されない場合は、 生成された名前が使用されます。attributeNames プロパティーを 使用して、HashIndex attributeName のデータ (コンマ区切りの属性のリスト) が 設定されます。属性名は、エンティティーがフィールド・アクセスを使用するように構成されているときは、 パーシスタント・フィールド名と一致します。そのように構成されていない場合は、 プロパティー・アクセス・エンティティーに対する JavaBeans 命名規則の定義に従い プロパティー名と一致します。例えば、属性名が「street」だった場合、 プロパティー getter メソッドの名前は getStreet です。
複合索引が構成されたら、 アプリケーションは、MapIndex インターフェースの findAll(Object) メソッドを使用して、 以下のように検索を実行できます。
Session sess = objectgrid.getSession();
ObjectMap map = sess.getMap("MAP_NAME");
MapIndex codeIndex = (MapIndex) map.getIndex("INDEX_NAME");
Object[] compositeValue = new Object[]{ MapIndex.EMPTY_VALUE,
"MN", "55901"};
Iterator iter = mapIndex.findAll(compositeValue);
// Close the session (optional in Version 7.1.1 and later) for improved performance
sess.close();
MapIndex.EMPTY_VALUE は compositeValue[ 0 ] に割り当てられ、評価から city 属性が除外されることを 示します。結果には、state 属性が"MN" に等しく、zipcode 属性が"55901" に 等しいオブジェクトのみが含まれます。
次の照会では、上記の 複合索引の構成が有効です。
SELECT a FROM Address a WHERE a.city='Rochester' AND a.state='MN' AND a.zipcode='55901'
SELECT a FROM Address a WHERE a.state='MN' AND a.zipcode='55901'
照会エンジンは適切な 複合索引を見つけ、それを使用して全属性一致の ケースで照会のパフォーマンスを高めます。
シナリオによっては、 全属性一致のすべての照会に対応するために、 一部の属性がオーバーラップする複数の複合索引をアプリケーションで定義する必要 がある場合があります。索引の数が増えることの欠点 は、マップ操作でパフォーマンス・オーバーヘッドが生じる可能性があることです。
複合索引の 使用に関する唯一の制約は、異種のコンテナーがある分散環境では、アプリケーションが 複合索引を構成できないことです。古いコンテナーは、複合索引構成を認識しないため、 古いコンテナーと新しいコンテナーは混用できません。複合索引は、 既存の通常の属性索引とよく似ていますが、 複合索引では、複数の属性にまたがる索引付けが許可される点が異なります。通常の属性索引のみを 使用する場合、コンテナー混在環境はそのまま存続できます。