sys.dm_clr_appdomains (Transact-SQL)
S'applique à : SQL Server
Renvoie une ligne pour chaque domaine d'application du serveur. Le domaine d’application (AppDomain) est une construction dans le Common Language Runtime (CLR) de Microsoft .NET Framework, qui est l’unité d’isolation pour une application. Vous pouvez utiliser cette vue pour comprendre et résoudre les problèmes liés aux objets d’intégration CLR qui s’exécutent dans Microsoft SQL Server.
Il existe plusieurs types d'objets de base de données managés d'intégration CLR. Pour obtenir des informations générales sur ces objets, consultez Génération d’objets de base de données avec l’intégration clR (Common Language Runtime). Chaque fois que ces objets sont exécutés, SQL Server crée un AppDomain sous lequel il peut charger et exécuter le code requis. Le niveau d’isolation d’un AppDomain est un AppDomain par base de données par propriétaire. Autrement dit, tous les objets CLR appartenant à un utilisateur sont toujours exécutés dans le même AppDomain par base de données (si un utilisateur inscrit des objets de base de données CLR dans différentes bases de données, les objets de base de données CLR s’exécutent dans différents domaines d’application). Un AppDomain n’est pas détruit une fois l’exécution du code terminée. Au lieu de cela, il est mis en cache en mémoire pour les prochaines exécutions. Les performances en sont alors améliorées.
Pour plus d’informations, consultez Domaines d’application.
Nom de la colonne | Type de données | Description |
---|---|---|
appdomain_address | varbinary(8) | Adresse du Domaine d’application. Tous les objets de base de données managés appartenant à un utilisateur sont toujours chargés dans le même AppDomain. Vous pouvez utiliser cette colonne pour rechercher tous les assemblys actuellement chargés dans cet AppDomain dans sys.dm_clr_loaded_assemblies. |
appdomain_id | int | ID du Domaine d’application. Chaque AppDomain a un ID unique. |
appdomain_name | varchar(386) | Nom du Domaine d’application attribué par SQL Server. |
creation_time | datetime | Heure de création de l’AppDomain. Étant donné que les AppDomains sont mis en cache et réutilisés pour de meilleures performances, creation_time n’est pas nécessairement le moment où le code a été exécuté. |
db_id | int | ID de la base de données dans laquelle cet AppDomain a été créé. Le code stocké dans deux bases de données différentes ne peut pas partager un AppDomain. |
user_id | int | ID de l’utilisateur dont les objets peuvent s’exécuter dans ce AppDomain. |
state | nvarchar(128) | Descripteur pour l’état actuel du Domaine d’application. Un domaine d'application AppDomain peut être dans différents états de sa création à sa suppression. Pour plus d’informations, consultez la section Remarques de cet article. |
strong_refcount | int | Nombre de références fortes à ce AppDomain. Cela reflète le nombre de lots en cours d’exécution qui utilisent ce AppDomain. L’exécution de cette vue crée un refcount fort ; même si aucun code n’est en cours d’exécution, strong_refcount aura la valeur 1. |
weak_refcount | int | Nombre de références faibles à ce AppDomain. Cela indique le nombre d’objets à l’intérieur de l’AppDomain mis en cache. Lorsque vous exécutez un objet de base de données managé, SQL Server le met en cache à l’intérieur de l’AppDomain pour une réutilisation ultérieure. Les performances en sont alors améliorées. |
cost | int | Coût de l’AppDomain. Plus le coût est élevé, plus ce AppDomain est susceptible d’être déchargé sous pression mémoire. Le coût dépend généralement de la quantité de mémoire nécessaire pour recréer ce AppDomain. |
value | int | Valeur du Domaine d’application. Plus la valeur est faible, plus ce AppDomain doit être déchargé sous pression mémoire. La valeur dépend généralement du nombre de connexions ou de lots qui utilisent ce AppDomain. |
total_processor_time_ms | bigint | Temps processeur total, en millisecondes, utilisé par tous les threads lors de l'exécution dans le domaine d'application actuel depuis le démarrage du processus. Cela équivaut à System.AppDomain.MonitoringTotalProcessorTime. |
total_allocated_memory_kb | bigint | Taille totale, en kilo-octets, de toutes les allocations mémoire faites par le domaine d'application depuis sa création, sans soustraction de la mémoire recueillie. Cela équivaut à System.AppDomain.MonitoringTotalAllocatedMemorySize. |
survived_memory_kb | bigint | Nombre de kilo-octets qui ont survécu à la dernière collection bloquante complète et connus pour être référencés par le domaine d'application actuel. Cela équivaut à System.AppDomain.MonitoringSurvivedMemorySize. |
Notes
Il existe une relation un-à-plusieurs entre dm_clr_appdomains.appdomain_address et dm_clr_loaded_assemblies.appdomain_address.
Les tableaux suivants répertorient les valeurs d’état possibles, leurs descriptions et quand elles se produisent dans le cycle de vie AppDomain. Vous pouvez utiliser ces informations pour suivre le cycle de vie d’un AppDomain et surveiller le déchargement d’instances AppDomain suspectes ou répétitives, sans avoir à analyser le journal des événements Windows.
Initialisation du domaine d'application AppDomain
State | Description |
---|---|
E_APPDOMAIN_CREATING | AppDomain est en cours de création. |
Utilisation du domaine d'application AppDomain
State | Description |
---|---|
E_APPDOMAIN_SHARED | Le runtime AppDomain est prêt à être utilisé par plusieurs utilisateurs. |
E_APPDOMAIN_SINGLEUSER | AppDomain est prêt à être utilisé dans les opérations DDL. Ceux-ci diffèrent d'E_APPDOMAIN_SHARED en ceci que les domaines d'application AppDomains partagés sont utilisés pour les exécutions d'intégration du CLR par opposition aux opérations DDL. Ces domaines d'application AppDomains sont isolés d'autres opérations simultanées. |
E_APPDOMAIN_DOOMED | AppDomain est planifié pour être déchargé, mais il existe actuellement des threads en cours d’exécution. |
Suppression du domaine d'application AppDomain
State | Description |
---|---|
E_APPDOMAIN_UNLOADING | SQL Server a demandé que le CLR décharge l’AppDomain, généralement parce que l’assembly qui contient les objets de base de données managés a été modifié ou supprimé. |
E_APPDOMAIN_UNLOADED | Le CLR a déchargé l’AppDomain. Il s’agit généralement du résultat d’une procédure d’escalade en raison de ThreadAbort, OutOfMemory ou d’une exception non gérée dans le code utilisateur. |
E_APPDOMAIN_ENQUEUE_DESTROY | AppDomain a été déchargé dans CLR et défini pour être détruit par SQL Server. |
E_APPDOMAIN_DESTROY | AppDomain est en cours de destruction par SQL Server. |
E_APPDOMAIN_ZOMBIE | L’AppDomain a été détruit par SQL Server . Toutefois, toutes les références à AppDomain n’ont pas été nettoyées. |
autorisations
Nécessite l'autorisation VIEW SERVER STATE sur la base de données.
Autorisations pour SQL Server 2022 (et versions plus récentes)
Nécessite l’autorisation VIEW SERVER PERFORMANCE STATE sur le serveur.
Exemples
L’exemple suivant montre comment afficher les détails d’un AppDomain pour un assembly donné :
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);
L’exemple suivant montre comment afficher tous les assemblys dans un AppDomain donné :
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);
Voir aussi
sys.dm_clr_loaded_assemblies (Transact-SQL)
Vues de gestion dynamique liées au Common Language Runtime (Transact-SQL)