Datenbank Performance und Indexstatistiken

Aktualität der Indexstatistiken in der Datenbank und ihr Einfluss auf die Performance

Betriebsart

Cloud Abo

|

ON-PREMISES

Module

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erstellt: 23.12.2020
Aktualisiert: 07.05.2025 | Geplante Aufgabe und Python Funktion ab Vertec 6.8 eingefügt.

Eine SQL Datenbank braucht nicht nur Indizes auf wichtigen Feldern, damit eine SQL Query performant ablaufen kann, sondern auch eine Information, wie selektiv ein gewisser Index ist, damit vor der Ausführung eines SQL Statements die beste Taktik gewählt werden kann.

So ist zum Beispiel die Selektivität bei einem Boolean-Feld (Ja/Nein) und einer flachen Verteilung 50%. Bei einem Index auf der PLZ einer Adresse ist die viel höher. Fragt man also gleichzeitig ein Boolean-Feld und eine PLZ ab, so sagt die Selektivität dem Query Analyzer, dass er besser zuerst nach der PLZ sucht und erst nachher nach dem Boolean-Feld.

Dafür werden sogenannte Indexstatistiken angelegt, welche Informationen über die Werteverteilung der indizierten Spalten speichern. Indexstatistiken müssen – genau wie die Indizes selbst – regelmässig gewartet werden. Veraltete oder gar nicht erst erstellte Indexstatistiken können dazu führen, dass die dazu gehörenden Indizes gar nicht verwendet werden, was einen messbaren und zum Teil sehr grossen Effekt auf die Performance gewisser SQL Statements hat.

Neuberechnung von Indexstatistiken

Der Datenbank Konvert beim Update von Vertec berechnet nach der Übertragung der Daten in die neue Datenbank die Indexstatistiken neu. Auch beim Restore eines Backups berechnen beide Datenbanksysteme die Indexstatistiken automatisch neu. Für die restliche Zeit muss die Neuberechnung der Indexstatistiken regelmässig durchgeführt und am besten automatisiert werden.

Python Funktion für die Neuberechnung

Ab Vertec 6.8 steht dafür die Python Funktion vtcapp.renewdatabaseindexstatistics() zur Verfügung, welche die Indexstatistiken neu berechnet.

Geplante Aufgabe für die Neuberechnung

Ab Vertec 6.8 gibt es in Vertec eine geplante Aufgabe vom Typ Neuberechnung der Indexstatistiken.

Sie führt die oben genante Python Funktion aus und berechnet so die Indexstatistiken über Nacht automatisch neu.

  • Die geplante Aufgabe wird standardmässig mit der Ausführungszeit täglich 23:30 ausgeliefert. 
    • Der exakte Zeitpunkt wird dann gewürfelt, falls es noch andere geplante Aufgaben hat während des Zeitfensters, siehe Artikel Geplante Aufgaben.
  • Die geplante Aufgabe ist mit Firebird standardmässig aktiviert. On-Premises Kunden, welche den Microsoft SQL Server einsetzen, können die Aufgabe manuell aktivieren, falls nicht auf dem MS SQL Server bereits ein entsprechender Automatismus eingerichtet wurde.

Kundenspezifische Indizes (On-Premises)

In Vertec Datenbanken können nach sorgfältiger Analyse und Abwägung kundenspezifische Indizes angelegt werden. Damit Indizes nach einem Datenbank Konvert erhalten bleiben, müssen Sie mit dem Präfix CIX_beginnen. Sie werden wie folgt erstellt:

CREATE [UNIQUE] INDEX indexname ON tablename (column1, column2, column3)

Die Syntax für Firebird und SQL für die Erstellung einfacher Indizes ist ähnlich, wenn weitere Angaben hinzukommen gibt es jedoch Unterschiede.

Beispiel:

CREATE INDEX CIX_INVOICENUMBER ON RECHNUNG (NUMMER);

Das Erstellen von Indizes kann Performance-Verbesserungen bewirken, allerdings gibt es auch Risiken. So kostet das Einfügen oder Updaten eines Records mehr Zeit, wenn auch noch ein Index zusätzlich bearbeitet werden muss, und auch bei einem SELECT führt ein Index nicht immer zu einem besseren Resultat: so kann es sein, dass bei einem Feld mit eigentlich guter Selektivität aber gleichzeitig vielen Werten wie «» oder NULL die Performance sogar schlechter wird. Auch wirkt ein Index nur bei einem = Vergleich, nicht bei einem LIKE.

Vor dem Entscheid, einen neuen Index einzufügen, sollte man den Effekt auf die gesamte Applikation jedenfalls eingehend testen.

Netherlands

United Kingdom