|
Inhaltsverzeichnis |
6 |
|
|
Vorwort |
13 |
|
|
1 Einleitung |
14 |
|
|
1.1 Optimierungsmodell |
15 |
|
|
1.2 Was vermittelt dieses Buch? |
16 |
|
|
1.2.1 Tipps und Hinweise |
17 |
|
|
1.3 Wo finde ich was? |
17 |
|
|
1.4 Welche Voraussetzungen werden benötigt? |
19 |
|
|
1.5 Was ist auf der Begleit-CD? |
19 |
|
|
1.6 Danksagung |
20 |
|
|
1.7 Performanz oder Performance? |
20 |
|
|
Teil 1 Grundlagen |
22 |
|
|
2 Datenverwaltung durch SQL Server |
24 |
|
|
2.1 Datenbanken |
24 |
|
|
2.2 Daten lesen |
25 |
|
|
2.3 Daten schreiben |
26 |
|
|
2.3.1 Experiment: Transaktionsgröße |
27 |
|
|
2.4 Zusammenfassung |
30 |
|
|
3 Ausführung von Abfragen |
32 |
|
|
3.1 Logische Schritte bei der Abfrageausführung |
32 |
|
|
3.2 Physikalischer Ausführungsplan |
35 |
|
|
3.2.1 Parser |
35 |
|
|
3.2.2 Algebrizer |
36 |
|
|
3.2.3 Optimierer |
36 |
|
|
3.2.4 Anzeigen des Ausführungsplans |
40 |
|
|
3.3 Zusammenfassung |
44 |
|
|
4 Werkzeuge und Indikatoren zum Messen der Leistung |
46 |
|
|
4.1 Allgemeine Werkzeuge |
49 |
|
|
4.1.1 Messen mit der Stoppuhr |
49 |
|
|
4.1.2 Statistische Größen |
50 |
|
|
4.2 Der Aktivitätsmonitor |
51 |
|
|
4.2.1 Übersicht |
52 |
|
|
4.2.2 Aktuelle Prozesse |
52 |
|
|
4.2.3 Ressourcenwartevorgänge |
53 |
|
|
4.2.4 Datendatei E/A |
53 |
|
|
4.2.5 Aktuell wertvolle Abfragen |
53 |
|
|
4.3 Ablaufverfolgungen und der SQL Server Profiler |
54 |
|
|
4.3.1 Erstellen einer einfachen Ablaufverfolgung |
56 |
|
|
4.3.2 Ereignisse und Ereignisspalten |
60 |
|
|
4.3.3 Arbeiten mit Ablaufverfolgungen |
63 |
|
|
4.3.4 Serverseitige Ablaufverfolgungen |
64 |
|
|
4.3.5 Arbeiten mit Ablaufverfolgungsdateien |
67 |
|
|
4.4 Der Windows-Systemmonitor |
68 |
|
|
4.4.1 Wichtige Leistungsindikatoren |
69 |
|
|
4.5 Verbindung von Systemmonitor- Berichten mit Ablaufverfolgungen |
79 |
|
|
4.6 Dynamische Verwaltungssichten |
80 |
|
|
4.6.1 Abfrage der aktuellen Aktivität |
82 |
|
|
4.6.2 Abfrage der E/A- Vorgänge |
82 |
|
|
4.6.3 Abfrage der insgesamt aufgetretenen Wartezustände |
83 |
|
|
4.6.4 Abfrage der SQL Server-Leistungsindikatoren |
85 |
|
|
4.7 Statistische Systemfunktionen |
86 |
|
|
4.8 Gespeicherte Systemprozeduren |
88 |
|
|
4.9 DBCC |
90 |
|
|
4.10 SQLdiag |
91 |
|
|
4.11 Ausführungspläne |
94 |
|
|
4.11.1 Wichtige Operatoren in Ausführungsplänen |
95 |
|
|
4.11.2 Eigenschaften von Operatoren |
98 |
|
|
4.11.3 Analyse von Ausführungsplänen |
101 |
|
|
4.12 Datenauflistungen |
106 |
|
|
4.12.1 Konfiguration eines Verwaltungs-Data Warehouse |
107 |
|
|
4.12.2 Konfigurieren von Datenauflistungen |
109 |
|
|
4.13 Berichte |
113 |
|
|
4.13.1 Allgemeine Berichte |
114 |
|
|
4.13.2 Berichte der Datenauflistung |
119 |
|
|
4.14 Zusammenfassung |
123 |
|
|
Teil 2 Physische Aspekte des Datenbankentwurfs |
124 |
|
|
5 Verwenden von Indizes |
126 |
|
|
5.1 Der Heap: Eine Tabelle ohne Index |
126 |
|
|
5.2 Der gruppierte Index |
128 |
|
|
5.3 Der nichtgruppierte Index auf einem Heap |
131 |
|
|
5.4 Der nichtgruppierte Index auf einem gruppierten Index |
132 |
|
|
5.5 Eingeschlossene Spalten |
133 |
|
|
5.6 Gefilterte Indizes |
134 |
|
|
5.7 Indizierte Sichten |
135 |
|
|
5.8 Erstellen von Indizes |
136 |
|
|
5.8.1 Manuelles Erstellen von Indizes: CREATE INDEX |
137 |
|
|
5.8.2 Automatische Erstellung von Indizes |
138 |
|
|
5.8.3 Indizes auf Sichten |
138 |
|
|
5.8.4 Index-Füllfaktor |
139 |
|
|
5.8.5 Einen Index neu aufbauen |
141 |
|
|
5.8.6 Löschen von Indizes |
142 |
|
|
5.9 Zusammenfassung |
142 |
|
|
6 Verwalten von Indizes |
144 |
|
|
6.1 Fragmentierung und Reorganisation |
145 |
|
|
6.1.1 Einen Index reorganisieren |
148 |
|
|
6.1.2 Einen Index neu erstellen |
149 |
|
|
6.1.3 Strategie zur Indexprüfung und Indexdefragmentierung |
150 |
|
|
6.2 Fehlende Indizes |
152 |
|
|
6.2.1 Fehlende Indizes in gespeicherten Ausführungsplänen |
152 |
|
|
6.2.2 Die sys.dm_db_missing_index...-Systemsichten |
156 |
|
|
6.3 Überflüssige Indizes |
159 |
|
|
6.4 Zusammenfassung |
163 |
|
|
7 Partitionierung |
164 |
|
|
7.1 Horizontale Partitionierung |
165 |
|
|
7.1.1 Partitionierte Sichten |
166 |
|
|
7.2 Vertikale Partitionierung |
167 |
|
|
7.3 Zusammenfassung |
170 |
|
|
8 Komprimierung von Daten |
172 |
|
|
8.1 Allgemeines zur Komprimierung |
172 |
|
|
8.2 Vorteile einer Komprimierung |
173 |
|
|
8.3 Komprimierungsarten |
173 |
|
|
8.4 Beispiel: Auswirkung der Komprimierung auf die Abfrageleistung |
174 |
|
|
8.5 Komprimierten Speicherplatz berechnen |
176 |
|
|
8.6 Zusammenfassung |
178 |
|
|
Teil 3 Optimierung |
180 |
|
|
9 Analysieren und Optimieren von Abfragen |
182 |
|
|
9.1 Ausführungspläne und der Plancache |
182 |
|
|
9.1.1 Kompilierung und Re-Kompilierung von Ausführungsplänen |
185 |
|
|
9.1.2 Entfernen von Plänen aus dem Plancache |
185 |
|
|
9.1.3 Parametrisierte Abfragen |
186 |
|
|
9.1.4 Wiederverwendung von Abfrageplänen |
187 |
|
|
9.2 Die Rolle von Statistiken |
190 |
|
|
9.2.1 Erstellen und Aktualisieren von Statistiken |
198 |
|
|
9.2.2 Probleme mit Statistiken |
208 |
|
|
9.3 Parametrisierte Abfragen |
213 |
|
|
9.3.1 Positive Auswirkungen der Parametrisierung |
213 |
|
|
9.3.2 Probleme mit der Parametrisierung |
219 |
|
|
9.3.3 Erzwungene Parametrisierung |
220 |
|
|
9.4 Parameter Sniffing |
224 |
|
|
9.4.1 Probleme mit Parameter Sniffing |
224 |
|
|
9.4.2 Lösung von Parameter Sniffing-Problemen |
233 |
|
|
9.5 Physikalische JOIN-Operatoren |
243 |
|
|
9.5.1 MERGE JOIN |
245 |
|
|
9.5.2 HASH JOIN |
246 |
|
|
9.5.3 NESTED LOOPS |
248 |
|
|
9.6 Auffinden geeigneter Indizes |
249 |
|
|
9.6.1 Suchargumente (SARGs) |
250 |
|
|
9.6.2 Auswahl des gruppierten Index für eine Tabelle |
252 |
|
|
9.6.3 Selektivität und Sortierung |
254 |
|
|
9.6.4 Verknüpfungen und Fremdschlüssel (Foreign Keys) |
262 |
|
|
9.7 Zusammenfassung |
265 |
|
|
10 Auffinden problematischer Abfragen |
266 |
|
|
10.1 Überwachung durch dynamische Verwaltungssichten |
267 |
|
|
10.1.1 Auswertung der E/A-Operationen |
267 |
|
|
10.1.2 Ermitteln fehlender Indizes |
270 |
|
|
10.1.3 Auswerten der im Plancache gespeicherten Ausführungspläne |
270 |
|
|
10.1.4 Permanentes Speichern der Informationen aus dynamischen Verwaltungssichten |
273 |
|
|
10.1.5 Berichte |
277 |
|
|
10.2 Arbeiten mit dem Profiler |
278 |
|
|
10.3 Einsatz von Datenauflistungen |
281 |
|
|
10.3.1 Manuelle Abfragen des VDWH |
283 |
|
|
10.3.2 Erzeugen von Ablaufverfolgungen mit dem Datenauflister |
285 |
|
|
10.4 Zusammenfassung |
288 |
|
|
11 Optimierung des physischen Datenbankentwurfs |
290 |
|
|
11.1 Indexüberwachung mit Datenauflistungen |
290 |
|
|
11.1.1 Ein Auflistsatz für fehlende und überflüssige Indizes |
291 |
|
|
11.1.2 Ein Auflistelement für fehlende Indizes |
292 |
|
|
11.1.3 Ein Auflistelement für die Indexverwendung |
294 |
|
|
11.1.4 Daten sammeln und auswerten |
295 |
|
|
11.2 Partitionierung mit Indizes |
300 |
|
|
11.2.1 Horizontale Partitionierung |
301 |
|
|
11.2.2 Vertikale Partitionierung |
304 |
|
|
11.3 Arbeiten mit dem Datenbankoptimierungsratgeber |
304 |
|
|
11.3.1 Tipps zur Verwendung des Datenbankoptimierungsratgebers |
310 |
|
|
11.4 Zusammenfassung |
311 |
|
|
12 Kontrollieren von Ressourcen |
312 |
|
|
12.1 Funktionsweise der Ressourcenkontrolle |
313 |
|
|
12.2 Einrichten der Ressourcenkontrolle |
314 |
|
|
12.2.1 Erstellen von Ressourcenpools |
314 |
|
|
12.2.2 Einrichten von Arbeitsauslastungsgruppen |
315 |
|
|
12.2.3 Entwerfen einer Klassifizierungsfunktion |
316 |
|
|
12.2.4 Aktivieren der Ressourcenkontrolle |
317 |
|
|
12.3 Zusammenfassung |
318 |
|
|
13 Testen und Optimieren des E/ A- Systems |
320 |
|
|
13.1 Physikalisches Datenbanklayout |
321 |
|
|
13.2 Testen des E/A-Systems |
323 |
|
|
13.2.1 Testen auf Korrektheit von E/A-Operationen mit SQLIOSIM |
323 |
|
|
13.2.2 Messen des E/A-Durchsatzes mit SQLIO |
325 |
|
|
13.3 Zusammenfassung |
332 |
|
|
Teil 4 Anhänge |
334 |
|
|
A Fehler und Irrtümer |
336 |
|
|
A.1 Vertrauen auf RAID 5 |
336 |
|
|
A.2 Planung des E/A-Systems nach Kapazität |
336 |
|
|
A.3 Gruppierter Index für den Primärschlüssel |
336 |
|
|
A.4 Verwenden von GUIDs als Primärschlüssel |
337 |
|
|
A.5 Verwenden von Autogrow |
337 |
|
|
A.6 Verwenden von SHRINK DATABASE |
338 |
|
|
A.7 Aktualisieren der Statistiken nach dem Re- Index |
338 |
|
|
A.8 Optimierung = leistungsfähigere Hardware anschaffen |
338 |
|
|
A.9 Scans sind generell schlecht |
339 |
|
|
A.10 Dynamisches SQL ist »ungesund« |
339 |
|
|
A.11 Verwenden automatisch erstellter UNIQUE- Indizes |
339 |
|
|
A.12 Cursors sind in jedem Fall zu vermeiden |
340 |
|
|
A.13 Mehr Einschränkungen in der WHERE-Klausel senken die Abfragekosten |
342 |
|
|
A.14 Unzureichende Einschränkungen |
344 |
|
|
B Literatur |
346 |
|
|
Stichwortverzeichnis |
348 |
|