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)