sys.dm_clr_appdomains (Transact-SQL)

Se aplica a:SQL Server

Devuelve una fila por cada dominio de aplicación en el servidor. El dominio de aplicación (AppDomain) es una construcción en Common Language Runtime (CLR) de Microsoft .NET Framework que es la unidad de aislamiento de una aplicación. Puede usar esta vista para comprender y solucionar problemas de objetos de integración clR que se ejecutan en Microsoft SQL Server.

Existen varios tipos de objetos de base de datos administrados de integración CLR. Para obtener información general acerca de estos objetos, vea Building Database Objects with Common Language Runtime (CLR) Integration. Cada vez que se ejecutan estos objetos, SQL Server crea un AppDomain en el que puede cargar y ejecutar el código necesario. El nivel de aislamiento de un AppDomain es un AppDomain por base de datos por propietario. Es decir, todos los objetos CLR propiedad de un usuario siempre se ejecutan en el mismo AppDomain por base de datos (si un usuario registra objetos de base de datos CLR en bases de datos diferentes, los objetos de base de datos CLR se ejecutarán en dominios de aplicación diferentes). Un appDomain no se destruye después de que el código finalice la ejecución. En su lugar, se almacena en caché en memoria para futuras ejecuciones. De este modo se aumenta el rendimiento.

Para obtener más información, consulte Dominios de aplicación.

Nombre de la columna Tipo de datos Descripción
appdomain_address varbinary(8) Dirección de AppDomain. Todos los objetos de base de datos administrados que pertenecen a un usuario siempre se cargan en el mismo AppDomain. Puede usar esta columna para buscar todos los ensamblados cargados actualmente en este AppDomain en sys.dm_clr_loaded_assemblies.
appdomain_id int Id. de AppDomain. Cada AppDomain tiene un identificador único.
appdomain_name varchar(386) Nombre de AppDomain asignado por SQL Server.
creation_time datetime Hora a la que se creó el appDomain . Dado que appDomains se almacenan en caché y se reutilizan para mejorar el rendimiento, creation_time no es necesariamente el momento en que se ejecutó el código.
db_id int Identificador de la base de datos en la que se creó este AppDomain . El código almacenado en dos bases de datos diferentes no puede compartir un appDomain.
user_id int Identificador del usuario cuyos objetos se pueden ejecutar en este AppDomain.
state nvarchar(128) Descriptor del estado actual de AppDomain. Un AppDomain puede encontrarse en estados diferentes desde la creación a la eliminación. Consulte la sección Comentarios de este artículo para obtener más información.
strong_refcount int Número de referencias seguras a este AppDomain. Esto refleja el número de lotes que se están ejecutando actualmente que usan este AppDomain. La ejecución de esta vista creará un recuento de referencias seguro; incluso si no se está ejecutando código actualmente, strong_refcount tendrá un valor de 1.
weak_refcount int Número de referencias débiles a este AppDomain. Esto indica cuántos objetos dentro de AppDomain se almacenan en caché. Al ejecutar un objeto de base de datos administrado, SQL Server lo almacena en caché dentro de AppDomain para su reutilización futura. De este modo se aumenta el rendimiento.
cost int Costo de AppDomain. Cuanto mayor sea el costo, más probable es que este AppDomain se descargue bajo presión de memoria. El costo normalmente depende de la cantidad de memoria necesaria para volver a crear este AppDomain.
value int Valor de AppDomain. Cuanto menor sea el valor, más probable es que este AppDomain se descargue bajo presión de memoria. El valor normalmente depende del número de conexiones o lotes que usan este appDomain.
total_processor_time_ms bigint Tiempo total del procesador, en milisegundos, consumido por todos los subprocesos durante la ejecución en el dominio de aplicación actual desde que se inició el proceso. Esto equivale a System.AppDomain.MonitoringTotalProcessorTime.
total_allocated_memory_kb bigint Tamaño total, en kilobytes, de todas las asignaciones de memoria realizadas por el dominio de aplicación desde que se creó, sin restar memoria recopilada. Esto equivale a System.AppDomain.MonitoringTotalAllocatedMemorySize.
survived_memory_kb bigint Número de kilobytes que sobrevivieron a la última colección de bloqueo completa a que debe hacer referencia el dominio de aplicación actual. Esto equivale a System.AppDomain.MonitoringSurvivedMemorySize.

Observaciones

Hay una relación uno a varios entre dm_clr_appdomains.appdomain_address y dm_clr_loaded_assemblies.appdomain_address.

En las tablas siguientes se enumeran los valores de estado posibles, sus descripciones y cuándo se producen en el ciclo de vida de AppDomain . Puedes usar esta información para seguir el ciclo de vida de un AppDomain y para observar si se descargan instancias de AppDomain sospechosas o repetitivas, sin tener que analizar el registro de eventos de Windows.

Inicialización de AppDomain

State Descripción
E_APPDOMAIN_CREATING Se está creando el appDomain .

Uso de AppDomain

State Descripción
E_APPDOMAIN_SHARED AppDomain en tiempo de ejecución está listo para su uso por varios usuarios.
E_APPDOMAIN_SINGLEUSER AppDomain está listo para su uso en operaciones DDL. Se diferencian de E_APPDOMAIN_SHARED en que AppDomains compartidos se usan para ejecuciones de integración CLR en contraposición con operaciones de DDL. Dichos AppDomains están aislados de las operaciones simultáneas.
E_APPDOMAIN_DOOMED AppDomain está programado para descargarse, pero actualmente hay subprocesos que se ejecutan en él.

Limpieza de AppDomain

State Descripción
E_APPDOMAIN_UNLOADING SQL Server ha solicitado que CLR descargue appDomain, normalmente porque el ensamblado que contiene los objetos de base de datos administrados se ha modificado o quitado.
E_APPDOMAIN_UNLOADED CLR ha descargado appDomain. Esto suele ser el resultado de un procedimiento de escalación debido a ThreadAbort, OutOfMemory o a una excepción no controlada en el código de usuario.
E_APPDOMAIN_ENQUEUE_DESTROY AppDomain se ha descargado en CLR y se ha establecido como destruido por SQL Server.
E_APPDOMAIN_DESTROY AppDomain está en proceso de destrucción por SQL Server.
E_APPDOMAIN_ZOMBIE AppDomain ha sido destruido por SQL Server; sin embargo, no todas las referencias a AppDomain se han limpiado.

Permisos

Requiere el permiso VIEW SERVER STATE en la base de datos.

Permisos para SQL Server 2022 y versiones posteriores

Requiere el permiso VIEW SERVER PERFORMANCE STATE en el servidor.

Ejemplos

En el ejemplo siguiente se muestra cómo ver los detalles de un AppDomain para un ensamblado determinado:

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);  

En el ejemplo siguiente se muestra cómo ver todos los ensamblados de un appDomain determinado:

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);  

Consulte también

sys.dm_clr_loaded_assemblies (Transact-SQL)
Vistas de administración dinámica relacionadas con Common Language Runtime (Transact-SQL)