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 du Common Language Runtime (CLR) microsoft .NET Framework qui est l’unité d’isolation d’une application. Vous pouvez utiliser cette vue pour comprendre et dépanner les 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 d’un AppDomain par base de données et 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 exécutions ultérieures. 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 de l’AppDomain. 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 ce Domaine d’application dans sys.dm_clr_loaded_assemblies.
appdomain_id int ID de l’AppDomain. Chaque AppDomain a un ID unique.
appdomain_name varchar(386) Nom de l’AppDomain 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 l’heure à laquelle le code a été exécuté.
db_id int ID de la base de données dans laquelle ce Domaine d’application 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 Domaine d’application.
state nvarchar(128) Descripteur pour l’état actuel de l’AppDomain. 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 à cet AppDomain. Cela reflète le nombre de lots en cours d’exécution qui utilisent ce Domaine d’application. L’exécution de cette vue crée un nombre de références 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 Domaine d’application. Cela indique le nombre d’objets mis en cache à l’intérieur de l’AppDomain . Lorsque vous exécutez un objet de base de données managée, 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 Domaine d’application est susceptible d’être déchargé sous la pression de la mémoire. Le coût dépend généralement de la quantité de mémoire nécessaire pour recréer ce Domaine d’application.
value int Valeur de l’AppDomain. Plus la valeur est faible, plus ce Domaine d’application est susceptible d’être déchargé sous la pression de la mémoire. La valeur dépend généralement du nombre de connexions ou de lots qui utilisent ce Domaine d’application.
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 le moment où elles se produisent dans le cycle de vie d’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 Le domaine d’application est planifié pour être déchargé, mais il existe actuellement des threads qui s’exécutent dans celui-ci.

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 d’une procédure d’escalade due à ThreadAbort, OutOfMemory ou une exception non gérée dans le code utilisateur.
E_APPDOMAIN_ENQUEUE_DESTROY L’AppDomain a été déchargé dans le 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 à l’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 ultérieures

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 CLR (Common Language Runtime) (Transact-SQL)