sys.dm_clr_appdomains (Transact-SQL)
Gibt eine Zeile für jede Anwendungsdomäne auf dem Server zurück. Eine Anwendungsdomäne (AppDomain) ist ein Konstrukt in Microsoft .NET Framework-CLR (Common Language Runtime), das die Einheit der Isolation für eine Anwendung angibt. Mit dieser Sicht können Sie CLR-Integrationsobjekte, die in Microsoft SQL Server ausgeführt werden, verstehen und behandeln.
Es stehen mehrere Typen von CLR-Integrationsobjekten für verwaltete Datenbanken zur Verfügung. Allgemeine Informationen zu diesen Objekten finden Sie unter Erstellen von Datenbankobjekten mit CLR-Integration (Common Language Runtime) (in Englisch). Wenn diese Objekte ausgeführt werden, wird in SQL Server eine AppDomain erstellt, unter der der erforderliche Code geladen und ausgeführt werden kann. Die Isolationsstufe für eine AppDomain entspricht einer AppDomain pro Datenbank und Besitzer. Das heißt, dass alle CLR-Objekte, die sich im Besitz eines Benutzers befinden, stets in derselben AppDomain pro Datenbank ausgeführt werden (wenn ein Benutzer CLR-Datenbankobjekte in anderen Datenbanken registriert, werden die CLR-Datenbankobjekte in anderen Anwendungsdomänen ausgeführt). Eine AppDomain wird nicht zerstört, nachdem die Ausführung des Codes abgeschlossen ist. Stattdessen wird sie für die zukünftige Ausführung im Arbeitsspeicher zwischengespeichert. Dadurch wird die Leistung verbessert.
Weitere Informationen finden Sie unter Anwendungsdomänen.
Spaltenname |
Datentyp |
Beschreibung |
---|---|---|
appdomain_address |
varbinary(8) |
Adresse von AppDomain. Alle verwalteten Datenbankobjekte, die sich im Besitz eines Benutzers befinden, werden stets in derselben AppDomain geladen. Mit dieser Spalte können Sie nach allen Assemblys suchen, die derzeit in dieser AppDomain in sys.dm_clr_loaded_assemblies geladen sind. |
appdomain_id |
int |
ID von AppDomain. Jede AppDomain besitzt eine eindeutige ID. |
appdomain_name |
varchar(386) |
Name der AppDomain, die von SQL Server zugewiesen wurde. |
creation_time |
datetime |
Zeitpunkt, zu dem AppDomain erstellt wurde. Da AppDomains zwischengespeichert und zum Optimieren der Leistung wiederverwendet werden, entspricht creation_time nicht notwendigerweise dem Zeitpunkt, zu dem der Code ausgeführt wurde. |
db_id |
int |
ID der Datenbank, in der diese AppDomain erstellt wurde. Für Code, der in zwei unterschiedlichen Datenbanken gespeichert wird, kann keine gemeinsame AppDomain verwendet werden. |
user_id |
int |
ID des Benutzers, dessen Objekte in dieser AppDomain ausgeführt werden können. |
Status |
nvarchar(128) |
Ein Deskriptor für den aktuellen Status 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 Thema. |
strong_refcount |
int |
Anzahl der starken Verweise auf AppDomain. Hiermit wird die Anzahl der derzeit ausgeführten Batches angegeben, für die diese AppDomain verwendet wird. Beachten Sie, dass durch Ausführen dieser Sicht ein strong refcount erstellt wird; selbst wenn derzeit kein Code ausgeführt wird, weist strong_refcount den Wert 1 auf. |
weak_refcount |
int |
Anzahl der schwachen Verweise auf AppDomain. Hiermit wird angegeben, wie viele Objekte in der AppDomain zwischengespeichert werden. Wenn Sie ein verwaltetes Datenbankobjekt ausführen, wird es in SQL Server für die zukünftige Wiederverwendung in der AppDomain zwischengespeichert. Dadurch wird die Leistung verbessert. |
cost |
int |
Kosten von AppDomain. Je höher die Kosten sind, desto wahrscheinlicher ist es, dass diese AppDomain mit ungenügendem Arbeitsspeicher entladen wird. Die Kosten hängen normalerweise davon ab, wie viel Arbeitsspeicher erforderlich ist, um diese AppDomain neu zu erstellen. |
value |
int |
Wert von AppDomain. Je niedriger der Wert ist, desto wahrscheinlicher ist es, dass diese AppDomain mit ungenügendem Arbeitsspeicher entladen wird. Der Wert hängt gewöhnlich davon ab, für wie viele Verbindungen oder Batches diese AppDomain verwendet wird. |
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. Dieser Wert 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. Dieser Wert 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. Dieser Wert entspricht System.AppDomain.MonitoringSurvivedMemorySize. |
Hinweise
Zwischen dm_clr_appdomains.appdomain_address und dm_clr_loaded_assemblies.appdomain_address besteht eine 1:n-Beziehung.
In den folgenden Tabellen werden mögliche state-Werte aufgeführt, Beschreibungen der Werte und wann sie im AppDomain-Zyklus auftreten. Sie können diese Informationen verwenden, um dem Zyklus einer AppDomain zu folgen und auf Entladungen verdächtiger oder sich wiederholender AppDomain-Instanzen zu achten, ohne das Windows-Ereignisprotokoll analysieren zu müssen.
AppDomain-Initialisierung
Status |
Beschreibung |
---|---|
E_APPDOMAIN_CREATING |
Die AppDomain wird erstellt. |
AppDomain-Verwendung
Status |
Beschreibung |
---|---|
E_APPDOMAIN_SHARED |
Die Laufzeit-AppDomain kann von mehreren Benutzern verwendet werden. |
E_APPDOMAIN_SINGLEUSER |
Die AppDomain ist zur 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 |
Das Entladen der AppDomain wird geplant, es werden jedoch gegenwärtig Threads darin ausgeführt. |
AppDomain-Cleanup
Status |
Beschreibung |
---|---|
E_APPDOMAIN_UNLOADING |
Von SQL Server wurde angefordert, dass die AppDomain von der CLR entladen wird. Normalerweise ist dies darauf zurückzuführen, dass die Assembly, die die verwalteten Datenbankobjekte enthält, geändert oder gelöscht wurde. |
E_APPDOMAIN_UNLOADED |
Die AppDomain wurde von der CLR entladen. Dies ist gewöhnlich das Ergebnis einer Ausweitungsprozedur aufgrund von ThreadAbort, OutOfMemory oder einer unbehandelten 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 durch SQL Server zerstört. |
E_APPDOMAIN_ZOMBIE |
Die AppDomain wurde durch SQL Server zerstört; es wurden jedoch nicht alle Verweise auf die AppDomain gelöscht. |
Berechtigungen
Erfordert die VIEW SERVER STATE-Berechtigung in der Datenbank.
Beispiele
Im folgenden Beispiel wird veranschaulicht, wie die Details einer AppDomain für eine bestimmte Assembly angezeigt werden können:
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)
Im folgenden Beispiel wird veranschaulicht, wie alle Assemblys in einer bestimmten AppDomain angezeigt werden können:
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)
Siehe auch
Verweis
sys.dm_clr_loaded_assemblies (Transact-SQL)
Mit CRL (Common Language Runtime) verbundene dynamische Verwaltungssichten Transact-SQL)