Warum Views böse sind…

Heute habe ich mich an ein Webprojekt gesetzt, das schon etwas älter ist. Was mich schon länger gestört hat, war die Performance der Datenbank-Anwendung. Bestimmte Abfragen aus der MySQL-Datenbank dauerten bis zu 4 Sekunden. Also genug Potential für Optimierungen.

Was mir als erstes auffiel, war der exzessive Gebrauch von Views. Ich erinnere mich noch an meine (sql-)Anfänge. Ich fand die Möglichkeiten von Views (Sichten) recht faszinierend, da man komplexe Abfragen auslagern und die zugrunde liegende Komplexität verstecken kann. Genau darin besteht aber auch die Gefahr! Über Performance habe ich mir damals ohnehin keine Gedanken gemacht. Ich war froh, dass das Teil so funktioniert hat, wie ich wollte. Das sollte sich nun also rächen (wie eigentlich immer).

In meinem konkreten Fall bestand die View aus zwei recht komplexen, über ein “UNION ALL” vereinigte SELECT-Anweisungen. Aus dieser View wurde dann wiederum kräftig “selected”, teilweise sogar “gejoined” über andere Tabellen und sogar auch über andere Views. Bei kleinen Datenmengen mag dieses Vorgehen noch vertretbar sein, in meinem Fall aber leider nicht.

Also habe ich mir die View näher angesehen und die zugrunde liegende SQL-Anweisung in die eigentliche Abfrage integriert. Das macht das Ganze natürlich etwas komplexer, der Performance-Gewinn war jedoch enorm: von 4 Sekunden auf wenige Millisekunden!!

Recherchen im Netz schienen meine anfängliche Vermutung zu bestätigten, dass bei Views die Indizes der zugrunde liegenden Tabellen nicht oder nur suboptimal verwendet werden. Das hat zur Folge, dass der jeweilige Index mehr oder weniger wirkungslos bleibt und ein kompletter Scan über die gesamten Tabellen erfolgt.

Mein persönliches Fazit: Views sind (häufig) überflüssig und vor allem unperformant!! Zumindest in diesem konkreten Beispiel. Ich werde zukünftig wo es geht die Finger davon lassen und lieber komplexere SQL-Anweisungen in Kauf nehmen. Bei Datenabfragen, bei denen ohnehin der Großteil der Tabellen gescannt werden muss, sind die Unterschiede wahrscheinlich nicht so gravierend. Ich kann aber jedem nur empfehlen, direkt bei der Entwicklung einer Datenbank-Anwendung auf die Performance zu achten und vor dem Einsatz von Views die Vor- und Nachteile gegeneinander abzuwägen.

verfasst von Michael am 26. August 2010 um 17:28

- noch keine Kommentare -

Kommentar abgeben

Blog Kategorien