Guten Tag allerseits,
in unserer Firma sind wir gerade dabei ein Datenbankmodell zu überarbeiten. Dabei ist es das Ziel von unseren vielen Tabellen und die dadurch entstandenen JOINs etwas runterzukommen. Das Ergebnis ist dann, dass man weniger Tabellen hat, dafür aber die Tabellen größer werden (mehr Felder).
Beim alten DB-Design wird eine Abfrage mit 21 JOINs benutzt. Beim neuen Design hingegen nur 8. Es werden 21 Felder ausgelesen.
Bei einem Test mit einer Kundendatenbank bin ich zu dem Ergebnis gekommen, dass das neue Datenbank-Design maximal 20% schneller ist. Die Werte schwanken aber derart stark und sind so abhängig von der SELECT-Anweisung, dass ich sehr verunsichert bin, ob die Leistung wirklich gesteigert wird. Fügt man an das SELECT noch eine WHERE-Klausel, ein ORDER BY, GROUP BY oder ähnliches an, dann kann das Ergebnis eventuell andersrum ausfallen und das alte Datenbankdesign mit den vielen JOINs ist schneller.
Folgende Faktoren beeinflussen meines Erachtens den Test:
-Rechner (Menge d. Arbeitsspeichers, Festplattengeschwindigkeit, Prozessor und Anzahl der Prozessoren).
-Welches Betriebssystem wird verwendet?
-Wann kommt der Cache zum Tragen?
-Wird die höhere Geschwindigkeit nur damit erkauft, dass der Query Analyzer stärker den PC belastet?
-Welche Datenbankversion wird benutzt?
-Welche Indizes werden benutzt?
-Wurde die Datenbankkonfiguration optimiert?
-Welche Daten liegen überhaupt vor (Wie sind die Datenmengen auf die Tabellen verteilt)?
-Sind die SELECTs vielleicht schneller, dafür aber INSERTs/DELETEs etc. langsamer?
-Spielt die Datenbankklasse (beim Test wurde PHP benutzt) eine Rolle? Hat die Klasse wieder einen eigenen Cache?
-Welche DBMS wird verwendet?
-Welcher Tabellentyp wird benutzt (bei MySQL)?
-Gibt es weitere Programme die nebenher laufen und die Datenbank stören?
-Wie verhält sich das Ganze, wenn mehrere Leute parallel darauf zugreifen?
-Was ist wartbarer? (Was neigt eher zu Anomalien?)
-usw. usw.
Naja, es gibt jedenfalls einen Rattenschwanz von Abhängigkeiten, sodass mir schlecht bei dem Gedanken wird, alle Permutationen durchzuspielen oder Dinge auf gut Glück ignorieren zu müssen.
Gibt es eine pauschale Regel, dass man sagen kann, dass viele JOINs mit vielen kleineren Tabellen langsamer sind, als wenige JOINs und stattdessen großen Tabellen? Ich habe nur mal gehört, dass eine zu starke Normalisierung leistungsmindernd sein kann und man daher eine gemäßige Denormalisierung nach der Normalisierung durchführen sollte. Dennoch bin ich mir angesichts von unklaren (und nur sehr begrenzt aussagekräftigen) Testwerten unsicher, ob diese Regel überhaupt gilt.
Wer hat Erfahrungswerte?
Mit freundlichen Grüßen
Dirk N.