Verwenden Sie zum Optimieren der Leistung Ihrer Abfragen die folgenden Techniken und Tipps.
Wennn eine Abfrage ausgeführt wird, muss die Abfragezeichenfolge syntaktisch analysiert und ein Plan für die Abfrage entwickelt werden, was beides kostenintensiv sein kann. WebSphere eXtreme Scale führt die Zwischenspeicherung von Abfrageplänen über die Abfragezeichenfolge durch. Da der Cache eine begrenzte Größe hat, ist es wichtig, Abfragezeichenfolgen nach Möglichkeit wiederzuverwenden. Die Verwendung benannter Parameter und positionsgebundener Parameter kann durch die Förderung der Wiederverwendung von Abfrageplänen ebenfalls zu einer Leistungsverbesserung beitragen.
Beispiel für positionsgebundene Parameter: Query q = em.createQuery("select c from Customer c where c.surname=?1"); q.setParameter(1, "Claus");Eine ordnungsgemäße Indexierung in einer Map kann erhebliche Auswirkungen auf die Abfrageleistung haben, auch wenn die Indexierung einen gewissen Einfluss auf die Gesamtleistung der Map hat. Ohne Indexierung der an Abfragen beteiligten Objektattribute führt die Abfragesteuerkomponente eine Tabellensuche für jedes Attribut durch. Die Tabellensuche ist die kostenintensivste Operation während eines Abfragelaufs. Die Indexierung der an Abfragen beteiligten Objektattribute ermöglicht der Abfragesteuerkomponente, unnötige Tabellensuchen zu vermeiden, was die Gesamtabfrageleistung verbessert. Wenn die Anwendung so konzipiert ist, dass sie häufig Abfragen in Maps durchführt, in denen hauptsächlich Leseoperationen durchgeführt werden, konfigurieren Sie Indizes für die an der Abfrage beteiligten Objektattribute. Wenn die Map hauptsächlich aktualisiert wird, müssen Sie einen Kompromiss zwischen Verbesserung der Abfrageleistung und Indexierungsaufwand finden.
Wenn POJOs (Plain Old Java Objects) in einer Map gespeichert werden, kann durch eine ordnungsgemäße Indexierung eine Java-Reflexion vermieden werden. Im folgenden Beispiel ersetzt die Abfrage die WHERE-Klausel mit Bereichsindexsuche, wenn für das Feld "budget" ein Index erstellt wurde. Andernfalls scannt die Abfrage die gesamte Map und wertet die WHERE-Klausel aus, indem sie zuerst das Budget durch Java-Reflexion abruft und anschließend das Budget mit dem Wert 50000 vergleicht:
SELECT d FROM DeptBean d WHERE d.budget=50000
Im Abschnitt Abfrageplan wird ausführlich beschrieben, wie Sie einzelne Abfragen am besten optimieren und wie sich verschiedene Syntax, Objektmodelle und Indizes auf die Abfrageleistung auswirken können.
In Client/Server-Umgebungen überträgt die Abfragesteuerkomponente die vollständige Ergebnis-Map an den Client. Die zurückgegebenen Daten müssen in angemessene Blöcke unterteilt werden. Die Schnittstellen "EntityManager Query" und "ObjectMap ObjectQuery" unterstützen beide die Methoden "setFirstResult" und "setMaxResults", mit denen der Abfrage ermöglicht wird, einen Teil der Ergebnisse zurückzugeben.
Mit der API "EntityManager Query" werden Entitäten als Abfrageparameter zurückgegeben. Die Abfragesteuerkomponente gibt die Schlüssel für diese Entitäten an den Client zurück. Wenn der Client mit dem Iterator aus der Methode "getResultIterator" über diese Entitäten iteriert, wird jede Entität automatisch dekomprimiert und so verwaltet, als wäre sie mit der Methode "find" der Schnittstelle "EntityManager" erstellt worden. Der vollständige Entitäts-Graph wird aus der Entitäts-ObjectMap im Client erstellt. Die Wertattribute der Entität und alle zugehörigen Entitäten werden aufgelöst.
Um die Erstellung dieses kostenintensiven Graphen zu vermeiden, ändern Sie die Abfrage so, dass sie die einzelnen Attribute mit Pfadnavigation zurückgibt.
Beispiel:
// Gibt eine Entität zurück.
SELECT p FROM Person p
// Gibt die Attribute SELECT p.name, p.address.street, p.address.city, p.gender FROM Person p zurück.