Wenn ich mich in der Vergangenheit mit Problemen mit Plan-Caching/übermäßiger Neukompilierung von Abfragen befassen musste, habe ich die Anleitung im Microsoft-Whitepaper 'Planen von Caching in SQL Server 2008' und ich würde dringend empfehlen, dies zu lesen, da es das Caching von Plänen, die Wiederverwendung von Abfrageplänen, Ursachen für Neukompilierungen, das Identifizieren von Neukompilierungen und andere verwandte Themen behandelt.
Vor diesem Hintergrund zeigt SQL Server Profiler (sollte sich unter Microsoft SQL Server 2008 -> Leistungstools befinden, wenn Sie es als Teil Ihrer Client-Tool-Installation installiert haben) drei Ereignisse an, die direkt mit der Abfragekompilierung zusammenhängen und für Sie hilfreich sein können:
- Cursor
- CursorRecompile
- Leistung
- Showplan-XML zum Kompilieren von Abfragen
- Gespeicherte Prozedur
- SP:Neu kompilieren
Sie verwenden gespeicherte Prozeduren, sodass Sie sich wahrscheinlich nur um den SP:Neu kompilieren Veranstaltung. Dieses Ereignis wird jedes Mal ausgelöst, wenn eine gespeicherte Prozedur, ein Trigger oder eine benutzerdefinierte Funktion neu kompiliert wurde. Die TextData-Spalte zeigt den Text der tsql-Anweisung, die die Neukompilierung der Anweisung verursacht hat, und die EventSubClass-Spalte zeigt einen Code, der den Grund für die Neukompilierung angibt.
EventSubClass-Codes für SP:Recompile in SQL 2008
- 1 =Schema geändert
- 2 =Statistiken geändert
- 3 =DNR neu kompilieren
- 4 =Einstellungsoption geändert
- 5 =Temp-Tabelle geändert
- 6 =Remote-Rowset geändert
- 7 =Für Browse Perms geändert
- 8 =Abfragebenachrichtigungsumgebung geändert
- 9 =MPI-Ansicht geändert
- 10 =Cursoroptionen geändert
- 11 =Mit Neukompilierungsoption
Wenn Sie die folgenden 5 Ereignisse überwachen, können Sie sehen, welche gespeicherten Prozeduren und Anweisungen auf dem SQL Server aufgerufen werden und welche Neukompilierungen auslösen:
- Store-Prozeduren
- SP:Start
- SP:StmtStarting
- SP:Neu kompilieren
- SP:Abgeschlossen
- Leistung
- Automatische Statistiken
Normalerweise richte ich auch die Profiler-Ablaufverfolgung ein, um alle Spalten für diese Ereignisse zu erfassen. Ich würde sagen, richten Sie eine Ablaufverfolgung mit diesen 5 Ereignissen ein, führen Sie eine Ablaufverfolgung für 30 bis 60 Sekunden aus und halten Sie sie dann an, und dann sollten Sie eine gute Momentaufnahme dessen haben, was die Neukompilierungen verursacht.
Wenn zu viel Rauschen vorhanden ist, können Sie damit beginnen, Spaltenfilter zu den Ablaufverfolgungseigenschaften hinzuzufügen, um Ereignisse ein-/auszufiltern. Wenn Sie beispielsweise feststellen, dass die meisten Ihrer Neukompilierungen auf nur einer Datenbank stattfinden, richten Sie einen Spaltenfilter für die Spalte databaseID oder databaseName ein, sodass nur Abfragen, die für diese Datenbank ausgeführt werden, in Ihre Ablaufverfolgung aufgenommen werden.
Beginnen Sie dann mit der Suche nach Mustern, in denen Abfragen neu kompiliert werden, und verwenden Sie das Whitepaper von Microsoft als Leitfaden, warum sie möglicherweise die Neukompilierung auslösen.