2024-07-31 22:12:53 +02:00
|
|
|
% !TeX root = ../../thesis.tex
|
2024-01-27 13:37:35 +01:00
|
|
|
|
|
|
|
\chapter{Evaluierung}
|
|
|
|
\label{ch:evaluation}
|
|
|
|
|
2024-09-13 13:21:22 +02:00
|
|
|
Nun werden die durchgeführten Anpassungen anhand ihre Effektivität betrachtet und unter welchen äußeren Einflüssen
|
|
|
|
diese eine Optimierung darstellen. Weiterhin werden die Nachteile der Anpassungen überprüft und und bei der Betrachtung
|
|
|
|
der Effektivität mit beachtet.
|
|
|
|
|
2024-09-15 00:47:49 +02:00
|
|
|
Es wurden die Konfigurationen der Caches von OpenJPA, JPA und EJB aktiviert und deren Auswirkung betrachtet. Bei den
|
|
|
|
Caches, bei denen eine Größe angebbar ist, wurde zusätzlich mit der Anzahl variiert, um zu ermitteln in welchen Umfang
|
|
|
|
sich diese auswirkt. Des Weiteren wird die Art der Programmierung für die Abfragen betrachtet, ob es signifikante
|
|
|
|
Unterschiede in der Performance und der Abarbeitung ergibt. Als weitere Punkt werden die Abfragen an die Datenbank
|
|
|
|
untersucht, um zu ermitteln ob diese durch Umstellung verbessert werden können. Als letzten werden die Materialisierten
|
|
|
|
Sichten verwendet, um zu ermitteln, ob durch einen vorverdichteten und aufbereiteten Datenbestand die Abfragen
|
|
|
|
beschleunigt werden können.
|
|
|
|
|
2024-06-02 15:43:11 +02:00
|
|
|
\mytodos{Zusätzlich beschreiben welche Möglichkeiten man genau genutzt hat und warum bzw. warum nicht}
|
2024-01-27 13:37:35 +01:00
|
|
|
|
2024-09-13 13:21:22 +02:00
|
|
|
\section{Nutzerumfrage}
|
2024-09-15 00:47:49 +02:00
|
|
|
\label{sec:evaluation:user-survey}
|
2024-09-13 13:21:22 +02:00
|
|
|
|
|
|
|
Zusätzlich war noch eine Befragung unter den Benutzer und den Entwicklern geplant. Da hierfür nur fünf Personen zur
|
|
|
|
Verfügung stehen, ist dies nicht zielführend. Daher ist die sinnvolle Alternative ein rein technischer Ansatz, der
|
|
|
|
gewählt wurde.
|
|
|
|
|
|
|
|
\section{Statische Webseiten}
|
|
|
|
\label{sec:evaluation:static-website}
|
|
|
|
|
|
|
|
Wenn man die Dokumentenliste als statische Webseiten ablegt, werden die Zugriffszeiten sehr kurz sein. Darüber hinaus
|
|
|
|
funktionieren in statische Webseiten aber keine Suche oder eine Sortierung. Die Sortierung könnte durch das erstellen
|
|
|
|
von statischen Seite aller Möglichkeiten der Sortierung emuliert werden, diese würde den notwendigen Speicherbedarf der
|
|
|
|
Webseite vervielfachen. Für die Suchanfragen ist dies nicht mehr möglich, da nicht alle Suchanfragen vorher definiert
|
|
|
|
werden können.
|
|
|
|
|
2024-09-15 00:47:49 +02:00
|
|
|
Die Umstellung der Suche auf Client"=Basis wäre noch eine Möglichkeit, dafür benötigen die Clients entsprechend
|
2024-09-13 13:21:22 +02:00
|
|
|
Leistung und es muss eine Referenzdatei erstellt werden, die alle Informationen über die Dokumente beinhaltet, nach der
|
|
|
|
gesucht werden kann.
|
|
|
|
|
|
|
|
Daher ist eine Umstellung auf statische Webseiten nicht sinnvoll.
|
|
|
|
|
|
|
|
\section{Client basierte Webseiten}
|
|
|
|
\label{sec:evaluation:client-side-rendering}
|
|
|
|
|
|
|
|
Als weitere Möglichkeit könnte man die Webseite so umbauen, dass die Daten erst im Nachgang über eine AJAX-Anfrage
|
|
|
|
ermittelt und die Sortierung und Aufteilung im Client durchgeführt wird. Hierbei wird aber je nach Datenmenge ein
|
|
|
|
großer Speicher am Client benötigt und die Rechenleistung wird auf den Client verschoben.
|
|
|
|
|
|
|
|
Dies wiederrum ist ein Vorteil für den Serverbetreiber, da durch die Verschiebung weniger Rechenleistung am Server
|
|
|
|
benötigt wird. Gleichzeitig würde man damit wiederrum schwächere Clients, wie Smartphones, aussperren, da bei diesem
|
|
|
|
die notwendige Rechenleistung fehlt, um die Webseite in annehmbarer Zeit darzustellen.
|
2024-01-27 13:37:35 +01:00
|
|
|
|
2024-09-15 00:47:49 +02:00
|
|
|
\section{Auswertung der Ergebnisse vor und nach der Optimierung}
|
|
|
|
\label{sec:evaluation:result-optimization}
|
2024-09-13 13:21:22 +02:00
|
|
|
|
|
|
|
\subsection{Caching im OpenJPA}
|
2024-09-15 00:47:49 +02:00
|
|
|
\label{sec:evaluation:result-optimization:caching-jpa}
|
2024-09-13 13:21:22 +02:00
|
|
|
|
|
|
|
Bei der Verwendung des OpenJPA"=Caches gibt es einige Verbesserungen in der Geschwindigkeit zu sehen. Die Höhe der
|
|
|
|
Optimierungen hängt stark von der gewählten Cache"=Größe und der aufgerufenen Webseiten ab. Solange die Anfragen sich
|
|
|
|
auf die gleichen Objekte beziehen und diese alle im Cache hinterlegt werden können, fällt die Optimierung entsprechend
|
|
|
|
hoch aus. Sobald bei den Anfragen aber häufig die zu ermittelnden Objekt sich unterscheiden und alte Objekte wieder
|
|
|
|
aus dem Cache entfernt werden, fällt die Performance"=Verbesserung immer geringer aus.
|
|
|
|
|
2024-09-15 00:47:49 +02:00
|
|
|
Das Entfernen der Objekte kann zwar umgangen werden, indem die häufig abgefragten Objekte gepinnt werden, was aber
|
2024-09-13 13:21:22 +02:00
|
|
|
den Speicherbedarf noch weiter erhöht, da diese Objekte nicht in die Zählung der Cache"=Objekte beachtet werden.
|
|
|
|
Was uns direkt zum größten Nachteil diese Caches kommen lässt, die notwendig Speichermenge die ständig zur Verfügung
|
|
|
|
gestellt werden muss. Damit ist immer ein gewisser Grundbedarf notwendig, da sich der Speicher bis zum eingestellten
|
|
|
|
Grenzwert aufbaut und dann nicht mehr entleeren wird. Gerade bei kleiner dimensionierten Servern stellt dies ein
|
|
|
|
größeres Problem dar, da dann weniger Speicher für die anderen laufenden Programme, wie dem Datenbankmanagementsystem,
|
|
|
|
zur Verfügung steht.
|
|
|
|
|
|
|
|
Hierbei ist aber noch zu beachten, dass die Optimierung durch den Cache nicht die Laufzeit der Abfragen in der Datenbank
|
|
|
|
enorm verringert hat, sondern die Laufzeit beim erstellen der Objekte im \textit{OpenJPA}"=Framework. Dies sieht man
|
2024-09-15 00:47:49 +02:00
|
|
|
sehr gut schon bei der ersten Messung, wie in \autoref{tbl:measure-ojpa-active}. Hierbei werden die Laufzeit in der
|
2024-09-13 13:21:22 +02:00
|
|
|
Datenbank im Schnitt um circa 5 ms reduziert, aber die komplette Webseite wird fast 100 ms schneller an den Client
|
|
|
|
ausgeliefert. Dies ist nur dadurch erklärbar, dass das erstellen und mit den Datenwerte zu befüllen mehr Zeit kostet,
|
|
|
|
als das Objekt aus dem Cache zu ermitteln und zurückzugeben.
|
|
|
|
|
|
|
|
Daher ist die Verwendung des OpenJPA"=Cache nur in Verbindung mit einem größer dimensionierten Server gut verwendbar,
|
|
|
|
wenn der Großteil der Objekte im Cache gehalten werden kann. Bei Bedarf sollten die häufig frequentierten Objekte
|
|
|
|
explizit im Cache aufgenommen und angepinnt werden.
|
|
|
|
|
|
|
|
\subsection{Cached Queries}
|
2024-09-15 00:47:49 +02:00
|
|
|
\label{sec:evaluation:result-optimization:cached-queries}
|
2024-09-13 13:21:22 +02:00
|
|
|
|
|
|
|
Die Optimierung über die gespeicherten Anfragen brachte keine Verbesserung hervor. Dies ist dadurch erklärbar, dass
|
|
|
|
für die diese Art nur Anfragen verwendet werden, die keinerlei Bedingungen besitzen. Da in diesem Fall in der Tabelle
|
|
|
|
auch noch nicht freigegebene und ungültige Datensätze gespeichert sind, müssen diese vor dem übertragen herausgefiltert
|
|
|
|
werden. Dies ist der Grund warum diese Anfragen in diesem Cache nicht gespeichert werden.
|
|
|
|
|
|
|
|
Dadurch ist dieser Cache für eine Performance"=Verbesserung in unseren Fall nicht verwendbar.
|
|
|
|
|
2024-09-21 15:05:19 +02:00
|
|
|
\subsection{Caching mit Ehcache}
|
|
|
|
\label{sec:evaluation:result-optimization:ehcache}
|
|
|
|
|
|
|
|
\mytodos{fehlt noch}
|
|
|
|
Mit dem Ehcache konnte eine Verbesserung in der Performance erzielt werden. Im Vergleich zum Cache von OpenJPA sind
|
|
|
|
die Verbesserung sehr ähnlich. Die Standardwerte dieses Caches sind gut vordefiniert, es wird für den aktuellen Fall
|
|
|
|
keine Anpassung benötigt um eine gute Performance zu bekommen. Hierbei ist natürlich das gleiche Problem wie in anderen
|
|
|
|
Caches, dass beim erreichen der Grenzen, alte Objekte entfernt werden müssen.
|
|
|
|
|
|
|
|
Nach aktueller Beobachtung scheint die Verwaltung im Ehcache effizienter gestaltet zu sein, als die des OpenJPA"=Caches.
|
|
|
|
Im Falle des Ehcache ist die interne Verwaltung auf mehrere Caches aufgebaut, dies ist daran zu sehen, dass in der
|
|
|
|
Standardkonfiguration jede Klasse ihren eigenen Cache besitzt. Diese können einzeln konfiguriert und diagnostiziert
|
|
|
|
werden, um diese genau auf die jeweiligen Bedürfnisse der Objekte anzupassen.
|
|
|
|
|
|
|
|
Im Falle der Verwendung des Caches, ist auch hier gut zu sehen, dass der Speicheranstieg bei der Verwendung des Caches
|
|
|
|
sehr gering ist, was den Schluss zu lässt, dass der Cache nur zu einem kleinen
|
|
|
|
|
|
|
|
Durch die effizienter Verwendung des Speichers, ist der Ehcache die bessere Alternative zum OpenJPA"=Cache. Dieser ist
|
|
|
|
auch schon für kleinere Serverkonfigurationen gut verwendbar. Hierbei ist nur abzuwägen, mit welcher Größe der Cache
|
|
|
|
bereitgestellt werden kann, was direkt am verfügbaren Arbeitsspeicher abhängt.
|
|
|
|
|
2024-09-13 13:21:22 +02:00
|
|
|
\subsection{Caching in EJB}
|
2024-09-18 00:19:25 +02:00
|
|
|
\label{sec:evaluation:result-optimization:ejb}
|
|
|
|
|
2024-09-21 15:05:19 +02:00
|
|
|
Bei der Erweiterung des EJB konnte keine Verbesserung in der Performance festgestellt werden. Dies liegt daran, dass
|
|
|
|
im EJB"=Cache die Provider beinhaltet, aber keine Daten"=Objekte. Dadurch kann der Cache das ermitteln der Objekte
|
|
|
|
nicht optimieren.
|
|
|
|
|
|
|
|
Aufgrund dessen ist der EJB"=Cache nicht für eine Performance"=Verbesserung nutzbar.
|
2024-09-13 13:21:22 +02:00
|
|
|
|
|
|
|
\subsection{Abfragen mit JPQL und Criteria API}
|
2024-09-15 00:47:49 +02:00
|
|
|
\label{sec:evaluation:result-optimization:jpal-capi}
|
2024-09-13 13:21:22 +02:00
|
|
|
|
2024-09-15 00:47:49 +02:00
|
|
|
Bei dem Vergleich zwischen den 2 Abfragemöglichkeiten der \ac{JPQL} und der Criteria API konnte in der Art der Abfragen
|
2024-09-13 13:21:22 +02:00
|
|
|
kein Unterschied dargestellt werden. Die Abfragen der beiden Systeme sind auf der Datenbankseite komplett identisch.
|
|
|
|
Auch in der Übertragung der Daten aus der Datenbank in die Java"=Objekte konnte keine Unterschied in der Art und
|
|
|
|
Geschwindigkeit festgestellt werden.
|
|
|
|
|
|
|
|
Ebenfalls sind die Möglichkeiten über der Optimierung über Hints identisch. In beiden Fällen, haben die meisten Hints
|
|
|
|
keine nennenswerten Einfluss auf die Laufzeit der Abfragen und Übertragung in die Java"=Objekte. Das sinnvolle setzen
|
|
|
|
von OptimizeResultCount, der FetchSize sowie der FetchBatchSize hilft dem Framework die Bearbeitung der Anfrage
|
|
|
|
effizient abzuarbeiten, konnte aber in den gemessenen Laufzeiten nicht verifiziert werden.
|
|
|
|
|
|
|
|
Anders ist dies mit dem Einstellungen für EagerFetchMode, welche definiert wie die Daten für abhängige Klasse ermittelt
|
|
|
|
werden. Bei Umstellung auf \textit{parallel} konnte für die Ermittlung der Dokumente einiges an Performance gewonnen
|
|
|
|
werden. Das liegt daran, dass nun für die abhängigen Objekte, wie den Koautoren, nicht pro Dokument eine Anfrage an die
|
|
|
|
Datenbank gestellt wird, sondern es werden alle Koautoren für die ermittelten Dokumente auf einmal ermittelt. Die
|
|
|
|
Zuordnung der Koautoren zu dem Dokument wird dann nun im Framework und nicht mehr durch die Datenbank durchgeführt.
|
|
|
|
Diese Abarbeitung spart viele einzelne Abfragen und somit auch den entsprechend Overhead im Framework.
|
|
|
|
|
|
|
|
Aufgrund dessen ist die Entscheidung der Technik für die Performance irrelevant und es kann das genutzt werden, was für
|
|
|
|
jeweiligen Einsatzzweck besser beziehungsweise einfacher zu programmieren ist. Das setzen der richtigen Hints wiederrum
|
|
|
|
ist in beiden Fällen äußerst wichtig. Explizit der EagerFetchMode muss vorher darüber nachgedacht werden, wie viele
|
|
|
|
abhängige Objekttypen es zu dieser Klasse gibt, welche dazu geladen werden sollen und von welcher Anzahl an Objekte
|
2024-09-15 00:47:49 +02:00
|
|
|
ausgegangen werden kann. Gerade bei ein größeren Anzahl lohnt es sich den Hint auf \textit{parallel} zu setzen.
|
2024-09-21 15:05:19 +02:00
|
|
|
Gleiches gilt den Hint SubclassFetchMode, dieser steuert dimensionierten Abfragen im falle von abgeleitet Klassen.
|
2024-09-13 13:21:22 +02:00
|
|
|
|
|
|
|
\subsection{Materialized View}
|
2024-09-21 15:05:19 +02:00
|
|
|
\label{sec:evaluation:result-optimization:materialized-view}
|
|
|
|
|
|
|
|
Die Idee der Materialisierten Sichten ist simple aber sehr effizient, gerade für einen Datenbestand der häufig gelesen
|
|
|
|
und selten verändert wird. Hierbei werden komplexe Abfragen einmalig ausgeführt und das Ergebnis intern
|
2024-09-22 00:51:24 +02:00
|
|
|
zwischengespeichert. Für alle weiteren Aufrufe, werden die Daten nun aus der Zwischenspeicher gelesen und dem Aufrufer
|
|
|
|
zurückgegeben. Bei einer Änderung an den Quelldaten muss die Sicht aktualisiert werden, was der größte Nachteil der
|
|
|
|
Materialisierten Sichten ist. Dieser Nachteil kommt in einer Briefedition nicht zum tragen, da in dieser nach dem die
|
|
|
|
Briefe einmalig eingepflegt wurde, noch selten Änderungen erfahren. Die Recherche über den Datenbestand die größte Zeit
|
|
|
|
gewidmet wird.
|
|
|
|
|
|
|
|
Ein weiterer Nachteil der Materialisierten Sichten ist die doppelte Speicherung der Daten, da die Daten für die Sicht
|
|
|
|
wie bei einer Tabelle auf der Festplatte gespeichert sind. Dieser Nachteil ist in der DOkumentliste vernachlässigbar,
|
|
|
|
da sich die Daten auf die Meta"=Daten der Dokumente, wie Namen, Datum und Autoren beschränkt. Der größte Datenbestand,
|
|
|
|
die Faksimile, sind nicht in dieser Sicht enthalten und werden erst beim Anzeigen einer Kommunikation ermittelt.
|
|
|
|
Zusätzlich ist zu beachten, dass bei der Verwendung eines Caches die Daten ebenfalls doppelt gehalten werden und in
|
|
|
|
den meisten Fällen im Arbeitsspeicher gehalten werden.
|
|
|
|
|
|
|
|
Eine zusätzliche Optimierung die durch die Materialisierte Sicht entstanden ist, ist die direkte integration der
|
|
|
|
Autoren, der Koautoren und der Adressen im \textit{Json}"=Format. Durch diesen aus dem Wedekind-Projekt übernommene Idee
|
|
|
|
konnten schon viele zusätzliche Abfragen eingespart werden, da diese nicht mehr durch OpenJPA nach der Hauptabfragen
|
|
|
|
für jede Datenzeile einzeln durchgeführt wird.
|
|
|
|
|
|
|
|
Zusätzlich konnte dies nochmal beschleunigt werden, in dem das parsen der \textit{Json}"=Daten vom Server auf den Client
|
|
|
|
verlagert wurde. Hiermit konnte zum einen Last vom Server genommen werden und die gesamte Ausführungszeit nochmals
|
|
|
|
optimieren. Die Wandlung der Daten in \textit{HTML}"=Objekte ist eine Kernkompetenz von JavaScript und damit auch auf
|
|
|
|
schwächeren Clients in kurzer zeit zu erledigen.
|
|
|
|
|
|
|
|
Zusammenfassend ist zu sagen, dass die Materialisierten Sichten eine gute Wahl sind, um die Listendarstellungen
|
|
|
|
zu optimieren. Mit dieser Technik können zum einen die Abfragezeiten optimiert werden, wodurch gleichzeit die
|
|
|
|
Ressourcennutzung verringert wird. Zum anderen wird die Ressourcennutzung des Servers noch weiter reduziert, wenn die
|
|
|
|
\textit{Json}"=Verarbeitung an den Client ausgelagert wird.
|
|
|
|
Durch die doppelte Datenhalten muss bei jeder Abfrage geprüft werden, ob der Nutzung der Materialisierte Sicht sinnvoll
|
|
|
|
ist oder direkt auf denormalisierte Daten umgestellt werden sollte, weil der zusätzliche benötigte Speicher größer als
|
|
|
|
die Quelle ist.
|
|
|
|
Im Gegensatz zu einer reinen Cache"=Lösung die die gleiche Optimierung besitzt, ist diese vorzuziehen, da in den
|
|
|
|
meisten Fällen der Festplattenspeicher kostengünstiger als der Arbeitsspeicher ist. Zusätzlich ist der Cache begrenzt
|
|
|
|
und wirft alte Objekte aus dem Cache, wenn dieser voll ist und dadurch wird ein Zugriff auf so ein Objekt wieder
|
|
|
|
langsamer. Somit ist die Optimierung über die Materialisierten Sichten auf langezeit gesehen kostengünstiger und
|
|
|
|
stabiler.
|
2024-09-21 15:05:19 +02:00
|
|
|
|
|
|
|
\subsection{Optimierung der Abfrage}
|
|
|
|
\label{sec:evaluation:result-optimization:optimize-query}
|
|
|
|
|
2024-09-22 00:51:24 +02:00
|
|
|
Die Abfragen die durch die OpenJPA an die Datenbank abgesetzt werden, sind meist durch ihre Einfachheit gut optimiert.
|
|
|
|
Nur durch Sortierung oder Bedingungen können die Abfragen langsam werden. Diese können durch entsprechende Indexe
|
|
|
|
gelöst werden. Bei größeren Abfragen mit mehreren Joins kann durch geschicktes umstellen die Performance verbessert
|
|
|
|
werden. Die Hauptabfrage der Dokumentenliste ist eine mit mehreren Joins, und diese wurde explizit untersucht.
|
|
|
|
|
|
|
|
Der Abfrageplan der Hauptabfrage wurde visuell untersucht und zeigt, dass das Hauptproblem die nicht eingeschränkte
|
|
|
|
Datenmenge der Haupttabelle \textit{document} ist. Dadurch werden zum einen die anderen Tabellen komplett dazu geladen
|
|
|
|
und es werden trotz direkter Primary Key Bedingungen keine Zugriffe über die Index durchgeführt. Für den PostgreSQL
|
|
|
|
ist es laut Berechnung kostengünstiger mit einem \textit{Seq Scan}, was einem Tabellenscan entspricht, zu arbeiten.
|
|
|
|
|
|
|
|
Um dies zu optimieren, wurde über eine \textit{Common Table Expression} zuerst die eingeschränkten Datenzeilen
|
|
|
|
ermittelt, dieser mit der Haupttabelle verknüpft und nun die anderen Tabellen dazugenommen. Hierdurch konnten die
|
|
|
|
Zeilenanzahl enorm verringert werden, wodurch einige der Verknüpfungen auf Indexzugriffe umgestellt wurden.
|
|
|
|
Durch die Umstellung konnte die Abfragezeit mehr als das dreifache reduziert wurde.
|
|
|
|
|
|
|
|
\mytodos{hier weiter...}
|