sys.dm_clr_appdomains (Transact-SQL)
Gilt für:SQL Server
Gibt eine Zeile für jede Anwendungsdomäne auf dem Server zurück. Die Anwendungsdomäne (AppDomain) ist ein Konstrukt im Microsoft .NET Framework Common Language Runtime (CLR), das die Isolationseinheit für eine Anwendung darstellt. Sie können diese Ansicht verwenden, um CLR-Integrationsobjekte zu verstehen und probleme zu beheben, die in Microsoft SQL Server ausgeführt werden.
Es stehen mehrere Typen von CLR-Integrationsobjekten für verwaltete Datenbanken zur Verfügung. Allgemeine Informationen zu diesen Objekten finden Sie unter Building Database Objects with Common Language Runtime (CLR)-Integration. Wenn diese Objekte ausgeführt werden, erstellt SQL Server eine AppDomain, unter der der erforderliche Code geladen und ausgeführt werden kann. Die Isolationsstufe für eine AppDomain ist eine AppDomain pro Datenbank und Besitzer. Das heißt, alle CLR-Objekte, die einem Benutzer gehören, werden immer in derselben AppDomain pro Datenbank ausgeführt (wenn ein Benutzer CLR-Datenbankobjekte in verschiedenen Datenbanken registriert, werden die CLR-Datenbankobjekte in verschiedenen Anwendungsdomänen ausgeführt). Eine AppDomain wird nicht zerstört, nachdem der Code die Ausführung abgeschlossen hat. Stattdessen wird es für zukünftige Ausführungen im Arbeitsspeicher zwischengespeichert. Dadurch wird die Leistung verbessert.
Weitere Informationen finden Sie unter Anwendungsdomänen.
Spaltenname | Datentyp | BESCHREIBUNG |
---|---|---|
appdomain_address | varbinary(8) | Adresse der AppDomain. Alle verwalteten Datenbankobjekte, die einem Benutzer gehören, werden immer in derselben AppDomain geladen. Sie können diese Spalte verwenden, um alle Assemblys zu suchen, die derzeit in dieser AppDomain in sys.dm_clr_loaded_assemblies geladen sind. |
appdomain_id | int | ID der AppDomain. Jede AppDomain verfügt über eine eindeutige ID. |
appdomain_name | varchar(386) | Name der AppDomain, die von SQL Server zugewiesen wurde. |
creation_time | datetime | Zeitpunkt, zu dem die AppDomain erstellt wurde. Da AppDomains für eine bessere Leistung zwischengespeichert und wiederverwendet werden, ist creation_time nicht unbedingt der Zeitpunkt, zu dem der Code ausgeführt wurde. |
db_id | int | ID der Datenbank, in der diese AppDomain erstellt wurde. Code, der in zwei verschiedenen Datenbanken gespeichert ist, kann keine AppDomain gemeinsam nutzen. |
user_id | int | ID des Benutzers, dessen Objekte in dieser AppDomain ausgeführt werden können. |
state | nvarchar(128) | Ein Deskriptor für den aktuellen Zustand der AppDomain. Eine AppDomain kann sich in verschiedenen Zuständen befinden, von Erstellung bis Löschung. Weitere Informationen finden Sie im Abschnitt Hinweise dieses Artikels. |
strong_refcount | int | Anzahl der starken Verweise auf diese AppDomain. Dies gibt die Anzahl der derzeit ausgeführten Batches an, die diese AppDomain verwenden. Durch die Ausführung dieser Ansicht wird ein starker Refcount erstellt. auch wenn derzeit kein Code ausgeführt wird, weist strong_refcount den Wert 1 auf. |
weak_refcount | int | Anzahl der schwachen Verweise auf diese AppDomain. Dies gibt an, wie viele Objekte innerhalb der AppDomain zwischengespeichert werden. Wenn Sie ein verwaltetes Datenbankobjekt ausführen, speichert SQL Server es in der AppDomain für die zukünftige Wiederverwendung zwischen. Dadurch wird die Leistung verbessert. |
cost | int | Kosten für die AppDomain. Je höher die Kosten, desto wahrscheinlicher ist es, dass diese AppDomain unter Speicherdruck entladen wird. Die Kosten hängen in der Regel davon ab, wie viel Arbeitsspeicher zum erneuten Erstellen dieser AppDomain erforderlich ist. |
value | int | Wert der AppDomain. Je niedriger der Wert ist, desto wahrscheinlicher ist es, dass diese AppDomain unter Arbeitsspeicherdruck entladen wird. Der Wert hängt in der Regel davon ab, wie viele Verbindungen oder Batches diese AppDomain verwenden. |
total_processor_time_ms | bigint | Gesamtprozessorzeit in Millisekunden, die von allen Threads beim Ausführen in der aktuellen Anwendungsdomäne ab dem Start des Prozesses verwendet wird. Dies entspricht System.AppDomain.MonitoringTotalProcessorTime. |
total_allocated_memory_kb | bigint | Gesamtgröße, in Kilobyte, aller Speicherbelegungen durch die Anwendungsdomäne seit der Erstellung, ohne Abzug des bei Sammlungsvorgängen freigegebenen Speichers. Dies entspricht System.AppDomain.MonitoringTotalAllocatedMemorySize. |
survived_memory_kb | bigint | Menge der Daten in KB, die die letzte vollständige Sammlung mit exklusivem Zugriff überdauert haben, und von denen bekannt ist, dass sie von der aktuellen Anwendungsdomäne referenziert werden. Dies entspricht System.AppDomain.MonitoringSurvivedMemorySize. |
Bemerkungen
Zwischen dm_clr_appdomains.appdomain_address und dm_clr_loaded_assemblies.appdomain_address besteht eine 1:n-Beziehung.
In den folgenden Tabellen sind mögliche Zustandswerte , ihre Beschreibungen und deren Vorkommen im AppDomain-Lebenszyklus aufgeführt. Sie können diese Informationen verwenden, um den Lebenszyklus einer AppDomain zu verfolgen und nach verdächtigen oder sich wiederholenden AppDomain-Instanzen zu suchen, die entladen werden, ohne das Windows-Ereignisprotokoll analysieren zu müssen.
AppDomain-Initialisierung
State | BESCHREIBUNG |
---|---|
E_APPDOMAIN_CREATING | Die AppDomain wird erstellt. |
AppDomain-Verwendung
State | BESCHREIBUNG |
---|---|
E_APPDOMAIN_SHARED | Die Runtime-AppDomain kann von mehreren Benutzern verwendet werden. |
E_APPDOMAIN_SINGLEUSER | Die AppDomain kann in DDL-Vorgängen verwendet werden. Diese unterscheiden sich von E_APPDOMAIN_SHARED, indem im Gegensatz zu DDL-Vorgängen freigegebene AppDomains für die CLR-Integration verwendet werden, . Solche AppDomains werden von anderen gleichzeitigen Vorgängen isoliert. |
E_APPDOMAIN_DOOMED | Es ist geplant, dass die AppDomain entladen wird, aber es gibt derzeit Threads, die darin ausgeführt werden. |
AppDomain-Cleanup
State | BESCHREIBUNG |
---|---|
E_APPDOMAIN_UNLOADING | SQL Server hat angefordert, dass die CLR die AppDomain entladen, in der Regel, weil die Assembly, die die verwalteten Datenbankobjekte enthält, geändert oder gelöscht wurde. |
E_APPDOMAIN_UNLOADED | Die CLR hat die AppDomain entladen. Dies ist in der Regel das Ergebnis eines Eskalationsverfahrens aufgrund von ThreadAbort, OutOfMemory oder einer nicht behandelten Ausnahme im Benutzercode. |
E_APPDOMAIN_ENQUEUE_DESTROY | Die AppDomain wurde in CLR entladen und so festgelegt, dass sie von SQL Server zerstört wird. |
E_APPDOMAIN_DESTROY | Die AppDomain wird gerade von SQL Server zerstört. |
E_APPDOMAIN_ZOMBIE | Die AppDomain wurde von SQL Server zerstört. Allerdings wurden nicht alle Verweise auf die AppDomain bereinigt. |
Berechtigungen
Erfordert die VIEW SERVER STATE-Berechtigung in der Datenbank.
Berechtigungen für SQL Server 2022 und höher
Erfordert die VIEW SERVER PERFORMANCE STATE-Berechtigung auf dem Server.
Beispiele
Das folgende Beispiel zeigt, wie Sie die Details einer AppDomain für eine bestimmte Assembly anzeigen:
select appdomain_id, creation_time, db_id, user_id, state
from sys.dm_clr_appdomains a
where appdomain_address =
(select appdomain_address
from sys.dm_clr_loaded_assemblies
where assembly_id = 500);
Das folgende Beispiel zeigt, wie alle Assemblys in einer bestimmten AppDomain angezeigt werden:
select a.name, a.assembly_id, a.permission_set_desc, a.is_visible, a.create_date, l.load_time
from sys.dm_clr_loaded_assemblies as l
inner join sys.assemblies as a
on l.assembly_id = a.assembly_id
where l.appdomain_address =
(select appdomain_address
from sys.dm_clr_appdomains
where appdomain_id = 15);
Weitere Informationen
sys.dm_clr_loaded_assemblies (Transact-SQL)
Mit CRL (Common Language Runtime) verbundene dynamische Verwaltungssichten Transact-SQL)
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für