Datenbanken und mehr

18. Juli 2007

Mit aktuellen Statistiken zu mehr Performance

Filed under: Performance — Urs Gehrig @ 23:45

Nein, natürlich meine ich mit Statistiken nicht etwa das Statistische Jahrbuch der Schweiz, sondern viel mehr SQL Servers eigene Index Statistik. Index Statistiken beschreiben die Verteilung von Werten in einer Spalte. Der Query Optimizer nutzt diese statistischen Daten um den optimalen Query Plan zu bestimmen, in dem er die Zugriffskosten für die Benutzung eines bestimmten Index schätzt. Mit Hilfe von DBCC kannst du dir zum Beispiel das Histogramm der Verteilung der Werte anschauen:

DBCC SHOW_STATISTICS (‚Person.Address‘,‚IX_Address_AddressLine1_AddressLine2_City_StateProvinceID_PostalCode‘) WITH HISTOGRAM

Du kannst dir das Histogramm natürlich auch mit Excel grafisch darstellen lassen; das sieht dann so aus:

Wann immer du dir einen Index anlegst, legt SQL Server parallel dazu auch eine entsprechende Statistik an. Wenn sich die dem Index zugrunde liegende Daten ändern, kann sich natürlich auch das Histogramm dazu ändern. Dies kann dazu führen, dass der Query Optimizer lediglich einen Suboptimalen Query Plan erstellt, was selbstreden auf die Performance geht. SQL Server wird daher die Statistik automatisch updaten, d.h. neu berechnen, wann immer sich 20% der Zeilen – aber mindestens 500 Zeilen – der entsprechenden Tabelle geändert haben. Ob die Statistik noch aktuell ist, siehst du zum Beispiel im Actual Execution Plan: wenn Actual Number of Rows stark von Estimated Number of Rowas abweicht, dann dürfte die Statistik nicht mehr viel wert sein. In diesem Falle kannst du den Update der Statistik forcieren:

UPDATE STATISTICS Person.Address

Da der SQL Server die Statistiken sowohl selber anlegt als auch selber up-to-date hält, sollte in der Regel das Histogramm aber kaum je unbrauchbar sein – wenn da nicht noch all diese Optionen wären. Sowohl das automatische Anlegen als auch Updaten der Statistiken kannst du nämlich unterbinden. Das kann mal für grosse BULK Operationen interessant sein; sollte aber wirklich die ganz grosse Ausnahme sein. Mit folgenden Kommandos kannst du in das Verhalten der automatischen Statistik eingreifen:

  • sp_autostats: Tabllen und Index weites ein-/ausschalten von AUTO UPDATE
  • STATISTICS_NORECOMPUTE Klausel in einem CREATE INDEX Statement
  • NORECOMPUTE Klausel in einem UPDATE STATISTICS oder CREATE STATISTICS Statement
  • AUTO_CREATE_STATISTICS und AUTO_UPDATE_STATISTICS Datenbank Option (änderbar via ALTER DATABASE)

Nochmals: Überlege es dir gut, ob du wirklich einzelnen Statistiken nicht automatisch up-to-date halten willst oder für einzelne Indizes überhaupt gar keine Statistik willst. Was in Ausnahmefällen mal für eine Statistik gelten kann wird aber kaum je generell für alle Statistiken gelten. Also Hände weg von den Datenbank weiten Optionen zur Ausschaltung der automatischen Statistiken! Die Performance wird es dir danken!

Advertisements

Schreibe einen Kommentar »

Es gibt noch keine Kommentare.

RSS feed for comments on this post. TrackBack URI

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Erstelle eine kostenlose Website oder Blog – auf WordPress.com.

%d Bloggern gefällt das: