Ich möchte herausfinden, was die hohen SQL-Kompilierungen (keine Neukompilierungen) verursacht, die ich in Leistungsüberwachungszählern sehe.
Hier ist meine Meinung dazu: Wenn ich viele SQl-Kompilierungen sehe, bedeutet dies, dass die Abfragen auf unserem System aus folgenden Gründen nicht zwischengespeichert werden:
- Viele Ad-hoc-Anfragen
Ausführen von Abfragen, die von SQl nicht zwischengespeichert werden, z.
UPDATE table1 SET col1 = 'Zeichenfolge länger als 8000 Zeichen .....' WHERE key_column = some int
Pläne laufen ab und werden aus dem Cache entfernt, weil: Der Cache nicht genügend Speicherplatz hat oder Pläne nicht lange genug verwendet werden.
Das einzige, was der Erfassung von Cache-Einfügungen im Profiler nahe kommt, ist Gespeicherte Prozeduren-> SP: CacheInserts, aber es kümmert sich nur um den Cache für gespeicherte Prozeduren.
Also habe ich Folgendes versucht, um Ad-hoc-Anfragen zu erhalten:
SELECT [cp].[refcounts] -- when Refcounts becomes 0, plan is excluded from cache.
, [cp].[usecounts]
, [cp].[objtype]
, st.[dbid]
, st.[objectid]
, st.[text]
, [qp].[query_plan]
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;
Ich dachte, Abfragen, die die Kompilierungen verursacht haben, sollten solche mit objtype = Adhoc sein, aber dies könnte sich auch auf Neukompilierungen beziehen. Jetzt muss ich den Profiler ausführen, Abfragen erfassen, die zu Neukompilierungen führen, und ihn dann aus der obigen Liste entfernen.
Gehe ich in die richtige richtung
Gibt es eine einzige Abfrage, mit der ich nur SQL-Kompilierungen ohne zu viel Arbeit erstellen kann?
Ressourcen, die mir geholfen haben, das oben genannte Wissen zu erlangen:
http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/954b4fba-3774-42e3-86e7-e5172abe0c83
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=143946
http: //technet.microsoft.com/en-nz/library/cc966425(en-us).aspx
http://www.sqlservercentral.com/Forums/Topic914951-360-1.aspx
Jede Hilfe wird sehr geschätzt.
quelle
Haben Sie viele häufig ausgeführte SQL Server-Jobs in dieser Box? Beachten Sie, dass im Jahr 2005 die Agent-Jobabfragen NICHT zwischengespeichert werden und auch dazu führen können, dass der Cache aufgebläht und SQL kompiliert wird.
Sehen Sie sich die Anzahl der Pläne mit geringen Wiederverwendungszahlen an. Das sind deine Schuldigen.
Einige verwandte Hinweise zum Plan-Caching finden Sie weiter unten.
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat.aspx
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Clearing-the-cache-are-there-other-options.aspx
quelle
Dieser Effekt wird als "Abfrageplanverschmutzung" bezeichnet, bei der viele ähnliche SQL-Abfragen separate, aber gleichwertige Ausführungspläne generieren.
Ad-hoc-Abfragen verursachen Overhead durch individuelles Parsen, fragen jedoch normalerweise keine Planverschmutzung ab, da ihre Pläne nicht gespeichert werden. Dies ist anders bei Abfragen mit nur einem Parameter (unter MS SQL Server). Diese werden wie eine parametrisierte Abfrage behandelt.
Es gibt einige typische Fälle für die Verschmutzung des Abfrageplans:
quelle