Zusammengesetzten Index verwenden

Der zusammengesetzte Hash-Index verbessert die Abfrageleistung und unterbindet das kostenintensiv Durchsuchen von Maps. Außerdem bietet das Feature der Anwendungsprogrammierschnittstelle "HashIndex" eine komfortable Möglichkeit, zwischengespeicherte Objekte zu suchen, wenn die Suchkriterien sehr viele Attribute enthalten.

Verbesserte Leistung

Ein zusammengesetzter Hash-Index ist eine schnelle und komfortable Methode für das Suchen zwischengespeicherter Objekte mit mehreren Attribute in Suchkriterien. Der zusammengesetzte Index unterstützt Suchoperationen mit vollständiger Attributübereinstimmung, aber keine Bereichssuche.

Anmerkung: Zusammengesetzte Indizes unterstützen den Operator BETWEEN in der ObjectGrid-Abfragesprache nicht, da BETWEEN die Unterstützung von Bereichssuchen voraussetzt. Die Bedingungen "größer als" (>) und "kleiner als" (<) funktionieren nicht, weil sie Bereichsindizes erfordern.

Ein zusammengesetzter Index kann die Leistung von Abfragen verbessern, wenn der entsprechende zusammengesetzte Index für die WHERE-Bedingung verfügbar ist. Das bedeutet, dass der zusammengesetzte Index exakt dieselben Attribute hat, die auch in der WHERE-Bedingung verwendet werden, und eine vollständige Attributübereinstimmung erzielt wird.

Eine Abfrage kann viele Attribute in einer Bedingung enthalten. Sehen Sie sich das folgende Beispiel an:

SELECT a FROM Address a WHERE a.city='Rochester' AND a.state='MN' AND a.zipcode='55901'

Ein zusammengesetzter Index kann die Anfrageleistung verbessern, indem das Durchsuchen von Maps oder das Verknüpfen mehrerer Einzelattributindexergebnisse vermieden wird. Wenn in dem Beispiel ein zusammengesetzter Index mit Attributen (city,state,zipcode) definiert wird, kann die Abfragesteuerkomponente den zusammengesetzten Index verwenden, um den Eintrag mit city='Rochester', state='MN' und zipcode='55901' zu suchen. Sie keinen zusammengesetzten Index und Attributindizes für die Attribute "city", "state" und "zipcode" verwenden, muss die Abfragesteuerkomponente die Map durchsuchen oder mehrere Einzelattributsuchen verknüpfen, was gewöhnlich Kosten und Aufwand verursacht. Außerdem wird bei Abfragen des zusammengesetzten Index nur das Muster mit vollständiger Übereinstimmung unterstützt.

Zusammengesetzten Index konfigurieren

Sie können einen zusammengesetzten Index auf drei Arten konfigurieren: mit XML, über das Programm und mit Entitätsannotationen (nur für Entitäts-Maps).

Programmgesteuerte Konfiguration

Der folgende Beispielcode für die programmgesteuerte Konfiguration erstellt denselben zusammengesetzten Index wie der Beispielcode für die XML-Konfiguration.

	  HashIndex mapIndex = new HashIndex();
    mapIndex.setName("Address.CityStateZip");
    mapIndex.setAttributeName(("city,state,zipcode"));
    mapIndex.setRangeIndex(true);

    BackingMap bm = objectGrid.defineMap("mymap");
    bm.addMapIndexPlugin(mapIndex);

Die Konfiguration eines zusammengesetzten Index entspricht abgesehen von der Definition des Werts für die Eigenschaft "attributeName" der Konfiguration eines regulären Index mit XML. Bei einem zusammengesetzten Index ist der Wert von "attributeName" eine durch Kommas begrenzte Liste mit Attributen. Die Werteklasse "Address" hat beispielsweise 3 Attribute: city, state und zipcode. Ein zusammengesetzter Index kann mit dem Wert "city,state,zipcode" für die Eigenschaft "attributeName" definiert werden. Dieser Wert zeigt an, dass city, state und zipcode in den zusammengesetzten Index eingeschlossen werden sollen.

Beachten Sie auch, dass zusammengesetzte Hash-Indizes keine Bereichssuchen unterstützen und die Eigenschaft "RangeIndex" deshalb nicht auf "true" gesetzt werden kann.

Mit XML

Zum Konfigurieren eines zusammengesetzten Index mit XML müssen Sie Code wie den folgenden in das Element "backingMapPluginCollections" der Konfigurationsdatei einfügen.

Zusammengesetzter Index - Konfigurationsansatz mit XML
<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>

Mit Entitätsannotationen

Für Entitäts-Maps kann der Annotationsansatz zum Definieren eines zusammengesetzten Index verwendet werden. Sie können eine Liste zusammengesetzter Indizes in der Annotation "CompositeIndexes" auf der Ebene der Entitätsklasse definieren. Ein zusammengesetzter Index hat eine Eigenschaft "name" und eine Eigenschaft "attributeNames". Jeder zusammengesetzte Index wird einer HashIndex-Instanz zugeordnet, die auf die BackingMap der jeweiligen Entität angewendet wird. Die HashIndex-Instanz wird als Index ohne Bereichsunterstützung konfiguriert.

@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;
}

Die Eigenschaft "name" jedes zusammengesetzten Index muss in der Entität und in der BackingMap eindeutig sein. Wenn Sie den Namen nicht angeben, wird ein generierter Name verwendet. Die Eigenschaft "attributeNames" wird verwendet, um die Eigenschaft "attributeName" der HashIndex-Instanz mit der durch Kommas begrenzten Liste von Attributen zu füllen. Die Attributnamen stimmen mit den persistenten Feldnamen überein, wenn die Entitäten für die Verwendung von Entitäten mit Feldzugriff konfiguriert sind, bzw. mit dem Eigenschaftsnamen gemäß Definition in den JavaBeans-Namenskonventionen für Entitäten mit Eigenschaftszugriff. Beispiel: Wenn der Attributname "street" lautet, wird die Getter-Methode für die Eigenschaft "getStreet" benannt.

Suchoperationen in zusammengesetzten Indizes durchführen

Nach der Konfiguration eines zusammengesetzten Index kann eine Anwendung die Methode "findAll(Object)" in der Schnittstelle "MapIndex" wie folgt verwenden, um Suchoperationen durchzuführen:

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 wird compositeValue[ 0 ] zugeordnet, d. h., dass das Attribut "city" von der Auswertung ausgeschlossen wird. Es werden nur Objekte in das Ergebnis eingeschlossen, deren Attribut "state" den Wert "MN" und deren Attribut "zipcode" den Wert "55901" hat.

Die folgenden Abfragen profitieren von der zuvor beschriebenen Konfiguration des zusammengesetzten Index:

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'

Die Abfragesteuerkomponente sucht den entsprechenden zusammengesetzten Index und verwendet diesen zur Leistungsverbesserung in den Fällen mit vollständiger Attributübereinstimmung.

In einigen Szenarien muss die Anwendung mehrere zusammengesetzte Indizes mit überlappenden Attributen definieren, um alle Abfragen mit vollständiger Attributübereinstimmung abzudecken. Ein Nachteil einer höheren Anzahl zusammengesetzter Indizes sind die möglichen Leistungseinbußen in Map-Operationen.

Migration und Interoperabilität

Bezüglich der Verwendung zusammengesetzter Indizes ist eine einzige Einschränkung zu beachten: Eine Anwendung kann einen zuammengesetzten Index nicht in einer verteilten Umgebung mit heterogenen Containern konfigurieren. Alte und neue Container können nicht gemischt werden, da ältere Container die Konfiguration eines zusammengesetzten Index nicht erkennen. Der zusammengesetzte Index gleicht abgesehen davon, dass er die Indexierung über mehrere Attribute unterstützt, dem vorhandenen regulären Attributindex. Wenn Sie ausschließlich den regulären Attributindex verwenden, ist eine heterogene Containerumgebung trotzdem realisierbar.