Performanz von OCL Abfragen

Wie OCL Expressions formuliert werden, um performante Abfragen zu erhalten.

OCL ist ein sehr mächtiges Tool in Vertec - man kann Anfragen stellen an das gesamte Objektmodell, ohne sich zu viel um technische Details zu kümmern (z.B. von Associations oder der Berechnung von derived Attributen wie etwa dem MwSt-Betrag auf einer Rechnung).

Es gibt aber auch einen gewichtigen Nachteil: OCL wird direkt auf den Vertec Objekten angewandt, und damit das geht, müssen diese zuerst ins Memory der Session geladen werden. Je mehr Objekte und je komplexer die Abfrage, desto mehr Performance kostet es. 

Deshalb sollte man sich bei jeder OCL Expression überlegen:

  1. Ist OCL die richtige Art für diese Abfrage? Um diese Frage zu klären, sollte man sich mit dem Artikel Performanceoptimierter Zugriff auf Vertec Objekte auseinandersetzen. 
  2. Wenn ja: Kann ich die OCL Expression umformulieren, um zum gleichen Resultat zu kommen mit weniger benötigten Objekten im Memory?

Der OCL Grundsatz lautet:

Auf einer möglichst kleinen Menge selektieren und erst dann auf die grössere Menge navigieren.

Als Beispiel nehmen wir folgende OCL Expression:

offeneLeistung->select(projekt.typ.bezeichnung='Intern')

Diese Expression ist korrekt, und wird sie global ausgeführt, liefert sie alle offenen Leistungen auf Projekten mit Projekttyp "Intern".

Sie ist jedoch höchst ineffizient, weil sie zuerst alle offenen Leistungen im System ins Memory lädt (also auch diejenigen, die nicht auf internen Projekten sind) und erst nachher filtert nach denjenigen auf internen Projekten.

An den Leistungen auf den Projekten, die nicht intern sind, ist man aber eigentlich gar nicht interessiert. Wie könnte man auf das gleiche Resultat kommen, ohne all die Leistungen zu laden, die man nicht braucht?

Wichtig ist, immer am kleinsten Ort anzufangen, also dort, wo es am wenigsten Objekte gibt. In diesem Fall sind das die Projekttypen. Nimmt man davon den mit der Bezeichnung "Intern" und lädt von da aus die damit verbundenen Einträge, ist am Schluss wirklich nur das geladen, was wirklich gebraucht wird, mit dem gleichen Resultat:

projekttyp->select(bezeichnung='Intern').projekte.offeneleistungen

Das Schöne an OCL ist, dass man in alle Richtungen durch das Modell navigieren kann. Man sollte also wenn möglich immer durch das Objektsystem navigieren, statt Listen zu filtern. Nicht viele Objekte laden und dann eingrenzen, sondern von der anderen Richtung her kommen und nur die Objekte laden, die man braucht. 

Weitere Performancetricks rund um OCL finden Sie im Artikel Performanceoptimierter Zugriff auf Vertec Objekte.

Netherlands

United Kingdom