Partage via


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)