Moin!
ich habe mich gerade gefragt, wie Datenbankmanagementsysteme eigentlich die Zugriffe auf die Daten optimieren.
Unterschiedlich, würde ich meinen. :)
Nehmen wir an, wir haben 1.000.000 Datensätze mit einem Datumsfeld. Diese werden per SQL abgefragt nach einem Datum zwischen 1.1.2004 und 7.1.2004.
Was passiert jetzt im DMS? Schaut das DMS das Feld in jeder Zeile nach und checkt auf die Bedingung? Wie optimieren die solche Prozesse? Und: Inwiefern spielt die Hardware bei der Abfragezeit eine Rolle?
Der Programmierer der Datenbank ist für die Optimierungen mit verantwortlich. Wenn das Datum des Datensatzes wichtig für diverse SELECT-Operationen ist, empfiehlt es sich, auf diese Spalte einen Index zu setzen. Dann kann die Datenbank sehr schnell mithilfe dieses Indexes die relevanten Datensätze herausfinden und muß dann nur noch diese von der Festplatte einlesen.
Wenn die Datumsspalte aber keinen Index hat, dann wird tatsächlich die gesamte Datenbank Datensatz für Datensatz durchgelesen und auf Übereinstimmung mit dem gewünschten Kriterium geprüft - und daran gibt es auch nur recht wenig zu optimieren, das dauert eben einfach so lange, wie es dauert.
Andererseits bringt es nichts, einfach auf alle möglichen Spalten einen Index zu setzen. Denn die Pflege dieses Indexes ist auf Aufwand. Zum einen verbraucht ein Index seinerseits doch erheblich Speicher, zum anderen wird der eben auch nicht zum Nulltarif aktualisiert, sondern das benötigt ebenfalls Zeit. Eine Datenbank mit vielen Indizes in einer Tabelle ist also sehr schnell bei jeglichem Lesezugriff, weil vermutlich immer ein Index für die WHERE-Bedingung zur Verfügung steht, aber sie ist sehr langsam bei UPDATE oder INSERT, weil sehr viele Indizes aktualisiert werden müssen.
Deshalb ist es nicht in jedem Fall sinnvoll, wie wild Indices auf eine Tabelle zu verteilen.
Ebenfalls ist entscheidend, welche Art von Daten denn in der Spalte stehen. Ein Index auf eine Spalte, die nur die Werte "ja" oder "nein" annehmen kann, ist relativ sinnlos, denn die Datenbank erhält hier fast keinerlei Vorteil durch einen Index, weil die möglichen Werte in der Spalte nicht sehr unterschiedlich sind. Ein Index z.B. auf einen Namen hingegen ist absolut sinnvoll, denn das Alphabet hat je Stelle ja mindestens mal 26 verschiedene Buchstabenmöglichkeiten - das potenziert sich mit der Stringlänge, so dass ein Index hier sehr hilfreich wirken kann.
- Sven Rautenberg