Datenbanken und mehr

26. April 2007

Query Tuning – die Vorbereitung

Filed under: Performance — Urs Gehrig @ 22:17

„Der völlig entnervte Programmierer sitzt vor seinem Rechner und versucht verzweifelt seine T-SQL Queries umzuschreiben; solange bis die Performance endlich seinen Vorstellungen entspricht. Dann plötzlich der erleichterte Aufschrei – Geschafft! Feierabend! Am nächsten Morgen ist die Welt aber wieder gleich brutal wie am Vorabend; von performanten Queries ist weit und breit nichts zu sehen.“ Kommt dir diese Situation irgendwie bekannt vor? Wer hatte hier wohl seine Finger im Spiel?

Genau. Mit grosser Wahrscheinlichkeit hat dir hier das ausgeklügelte Caching Verhalten des SQL Servers einen Streich gespielt. Jeder von der Harddisk gelesener Datenblock kommt in einen Cache, genau so wie jedes kompilierte Query. Künftige Queries können von diesem Cache profitiere. Alles was der SQL Server aus dem Cache gebrauchen kann, wird er von dort holen. Lesen vom Cache (RAM) ist selbstverständlich um Faktoren schneller als lesen von der Disk oder gar das erneute kompilieren eines Queries.

Wenn du nun bei deinem Query Tuning immer wieder und wieder dasselbe Query – wenn auch leicht abgeändert – ausführst, wir der SQL Server schon bald einmal das Query alleine mit Hilfe des Caches ausführen können. Das Query wird scheinbar performanter. Darum: Vor jeder Tuning Iteration musst du unbedingt den Cache des SQL Servers leeren. Und so machst du dies:

CHECKPOINT
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS
DBCC FREEPROCCACHE WITH NO_INFOMSGS

DROPCLEANBUFFERS löscht die bereits gelesenen Harddiskblöcke aus dem Cache. Genau wie eine moderne Harddisk, schreibt auch der SQL Server nicht jeden modifizierten Datenblock augenblicklich auf die Disk. Vielmehr sammelt er weitere modifizierte Datenblöcke und schreibt dann zu gegebener Zeit alle Blöcke gemeinsam auf die Disk. Dies ergibt ein zusätzlicher Performance Boost. CHECKPOINT zwingt den SQL Server, diese Blöcke nun endlich auf Disk zu schreiben. So kann auch dieser Teil des Cache mit dem nachfolgenden DOPCLEANBUFFERS geleert werden. FREEPROCCACHE gibt die kompilierten Querypläne wieder frei. Jetzt ist der SQL Server wieder in einem definierten Zustand und du kannst mit der nächsten Tuning Iteration beginnen. Viel Erfolg!

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

Bloggen auf WordPress.com.

%d Bloggern gefällt das: