Support vertec.com

Datenbank Performance und Index Statistiken

Datenbank Performance und Index Statistiken beim Betrieb von Vertec On-Premises

Standard

|

Expert

CLOUD ABO

|

ON-PREMISES

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcen & Projektplanung

Business Intelligence

Erstellt: 23.12.2020
Aktualisiert: 09.04.2021 | Scheduling via ISQL für Firebird beschrieben.

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 (Ja/Nein) Feld 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 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.

Generell gilt:

  • Der Vertec DB Konvert versucht nach der Übertragung der Daten in die neue Datenbank die Indexstatistiken neu zu berechnen. Bei Firebird gelingt das immer, bei SQL Server nicht, siehe dazu den Artikel über den Konvert mit Microsoft SQL Server.
  • Bei einem Restore eines Backups berechnen beide Datenbanksysteme die Indexstatistiken neu.

Microsoft SQL Server

Der SQL Server berechnet die Indexstatistiken standardmässig selbständig neu, wenn sich eine Tabelle "wesentlich" ändert, also zu mindestens 10%.

Das genügt nicht immer. Wir empfehlen hier, die Indexstatistiken mit einem

Maintenance Job regelmässig nachzuführen. Dafür gibt es die Stored Procedure:

 

EXEC sp_updatestats;

die dabei gescheduled wird oder auch einfach von Hand angestossen werden kann.

Bei Migrationen - also wenn mit einer leeren Vertec Datenbank gestartet und viele Daten reinmigriert werden - berechnet der SQL Server aufgrund der 10% Regel die Indexstatistiken selbständig.

Firebird

Firebird hat keine Methode zur manuellen Neuberechnung der Indexstatistiken wie der Microsoft SQL Server (siehe oben).

Bei einem Vertec Datenbank Konvert werden die Statistiken neu berechnet. Das geschieht jeweils bei den Vertec Updates.

Bei Migrationen jedoch - also wenn mit einer leeren Vertec Datenbank gestartet und viele Daten reinmigriert werden - werden die Statistiken nicht berechnet. In diesem Fall muss die Indexstatistik noch erstellt werden. Es gibt folgende Möglichkeiten:

  • Backup - Restore mit gbak: Das gbak (siehe Artikel Backup der Vertec Daten) erstellt am Schluss, nachdem die Daten in der Datenbank sind, die Indizes.
  • Über eine Store Procedure: Im von Vertec mitgelieferten Firebird Manager Programm (IBQ.exe oder IBOConsole.exe) kann eine Stored Procedure gestartet werden:
    • Die Vertec Firebird Datenbanken enthalten eine Stored Procedure mit Namen SP_VTC_UPDATESTATS :

Starten mit

EXECUTE PROCEDURE sp_vtc_updatestats;

 

Und wichtig: Erst der Commit führt die eigentliche Aktion durch:

  • Die Prozedur kann auch wie folgt gescheduled werden:
"C:\Program Files\Firebird\isql.exe" -user sysdba -password xyz localhost:C:\Program Files\Vertec\DB\Vertec.FDB -input C:\Program Files\Vertec\DB\indexstats.txt

In der Datei Indexstats.txt selbst stehen folgende Zeilen:

EXECUTE PROCEDURE SP_VTC_UPDATESTATS;
COMMIT;
  • Ist die Store Procedure nicht da, so kann man sie wie folgt erstellen:
set term ^;

execute block
as
declare variable ix varchar(31);
begin
  for select rdb$indices.rdb$index_name
  from rdb$indices
  into ix
  do
  execute statement 'SET STATISTICS INDEX '||ix ;
end^

set term ;^

Der Code kann einfach in den SQL Editor kopiert und wie oben auf den Button

Execute und dann auf Commit geklickt werden:

 

Bitte wählen Sie Ihren Standort