sys.dm_clr_appdomains (Transact-SQL)
Gilt für: SQL Server
Gibt eine Zeile für jede Anwendungsdomäne auf dem Server zurück. Anwendungsdomäne (AppDomain) ist ein Konstrukt in der Common Language Runtime (CLR) von Microsoft .NET Framework, das die Isolationseinheit für eine Anwendung ist. Sie können diese Ansicht verwenden, um CLR-Integrationsobjekte zu verstehen und 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 sie den erforderlichen Code laden und ausführen kann. Die Isolationsstufe für eine AppDomain ist eine AppDomain pro Datenbank pro 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 nach Abschluss der Ausführung des Codes nicht zerstört. Stattdessen wird er im Arbeitsspeicher für zukünftige Ausführungen 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 derzeit in dieser AppDomain geladenen Assemblys in sys.dm_clr_loaded_assemblies nachzuschlagen. |
appdomain_id | int | ID der AppDomain. Jede AppDomain verfügt über eine eindeutige ID. |
appdomain_name | varchar(386) | Name der AppDomain , wie von SQL Server zugewiesen. |
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 freigeben. |
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" in diesem Artikel. |
strong_refcount | int | Anzahl der starken Verweise auf diese AppDomain. Dies entspricht der Anzahl der derzeit ausgeführten Batches, die diese AppDomain verwenden. Die Ausführung dieser Ansicht erstellt einen starken Verweis. Selbst 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 innerhalb der AppDomain für eine zukünftige Wiederverwendung zwischen. Dadurch wird die Leistung verbessert. |
cost | int | Kosten der AppDomain. Je höher die Kosten sind, desto wahrscheinlicher ist es, dass diese AppDomain unter Speicherdruck entladen wird. Die Kosten hängen in der Regel davon ab, wie viel Arbeitsspeicher erforderlich ist, um diese AppDomain neu zu erstellen. |
value | int | Wert der AppDomain. Je niedriger der Wert ist, desto wahrscheinlicher ist, dass diese AppDomain unter Speicherdruck 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. |
Hinweise
Es gibt eine 1:n-Beziehung zwischen dm_clr_appdomains.appdomain_address und dm_clr_loaded_assemblies.appdomain_address.
In den folgenden Tabellen sind mögliche Statuswerte, deren Beschreibungen und deren Auftreten im AppDomain-Lebenszyklus aufgeführt. Sie können diese Informationen verwenden, um dem Lebenszyklus einer AppDomain zu folgen und auf verdächtige oder sich wiederholende AppDomain-Instanzen zu achten, 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 Laufzeit-AppDomain kann von mehreren Benutzern verwendet werden. |
E_APPDOMAIN_SINGLEUSER | Die AppDomain ist für die Verwendung in DDL-Vorgängen bereit. 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 | Die AppDomain soll entladen werden, aber es werden derzeit Threads ausgeführt. |
AppDomain-Cleanup
State | Beschreibung |
---|---|
E_APPDOMAIN_UNLOADING | SQL Server hat angefordert, dass die CLR die AppDomain entladen hat, 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 einer Eskalationsprozedur aufgrund von ThreadAbort, OutOfMemory oder einer unbehandelten Ausnahme im Benutzercode. |
E_APPDOMAIN_ENQUEUE_DESTROY | Die AppDomain wurde in CLR entladen und festgelegt, dass sie von SQL Server zerstört wird. |
E_APPDOMAIN_DESTROY | Die AppDomain wird 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 Die Details einer AppDomain für eine bestimmte Assembly angezeigt werden:
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)
Common Language Runtime Related Dynamic Management Views (Transact-SQL)