Condividi tramite


sys.dm_clr_appdomains (Transact-SQL)

Si applica a: SQL Server

Restituisce una riga per ogni dominio dell'applicazione nel server. Il dominio applicazione (AppDomain) è un costrutto in Microsoft .NET Framework Common Language Runtime (CLR) che è l'unità di isolamento per un'applicazione. È possibile usare questa vista per comprendere e risolvere i problemi relativi agli oggetti di integrazione CLR in esecuzione in Microsoft SQL Server.

Esistono diversi tipi di oggetti di database gestito dell'integrazione con CLR. Per informazioni generali su questi oggetti, vedere Compilazione di oggetti di database con l'integrazione CLR (Common Language Runtime). Ogni volta che questi oggetti vengono eseguiti, SQL Server crea un AppDomain in cui può caricare ed eseguire il codice richiesto. Il livello di isolamento per un AppDomain è un AppDomain per ogni database per proprietario. Ovvero, tutti gli oggetti CLR di proprietà di un utente vengono sempre eseguiti nello stesso AppDomain per ogni database (se un utente registra oggetti di database CLR in database diversi, gli oggetti di database CLR verranno eseguiti in domini applicazione diversi). Un AppDomain non viene eliminato definitivamente al termine dell'esecuzione del codice. Viene invece memorizzato nella cache in memoria per le esecuzioni future. Ciò migliora le prestazioni.

Per altre informazioni, vedere Domini applicazione.

Nome colonna Tipo di dati Descrizione
appdomain_address varbinary(8) Indirizzo dell'AppDomain. Tutti gli oggetti di database gestiti di proprietà di un utente vengono sempre caricati nello stesso AppDomain. È possibile usare questa colonna per cercare tutti gli assembly attualmente caricati in questo AppDomain in sys.dm_clr_loaded_assemblies.
appdomain_id int ID dell'AppDomain. Ogni AppDomain ha un ID univoco .
appdomain_name varchar(386) Nome dell'AppDomain assegnato da SQL Server.
creation_time datetime Ora di creazione dell'AppDomain. Poiché i Domini app vengono memorizzati nella cache e riutilizzati per ottenere prestazioni migliori, creation_time non è necessariamente il momento in cui è stato eseguito il codice.
db_id int ID del database in cui è stato creato questo AppDomain . Il codice archiviato in due database diversi non può condividere un AppDomain.
user_id int ID dell'utente i cui oggetti possono essere eseguiti in questo AppDomain.
state nvarchar(128) Descrittore per lo stato corrente di AppDomain. Un AppDomain può trovarsi in stati diversi dalla creazione all'eliminazione. Per altre informazioni, vedere la sezione Osservazioni di questo articolo.
strong_refcount int Numero di riferimenti sicuri a questo AppDomain. Ciò riflette il numero di batch attualmente in esecuzione che usano questo AppDomain. L'esecuzione di questa vista creerà un conteggio dei riferimenti sicuro; anche se non è in esecuzione alcun codice, strong_refcount avrà un valore pari a 1.
weak_refcount int Numero di riferimenti deboli a questo AppDomain. Indica il numero di oggetti all'interno dell'AppDomain memorizzati nella cache. Quando si esegue un oggetto di database gestito, SQL Server lo memorizza nella cache all'interno di AppDomain per un riutilizzo futuro. Ciò migliora le prestazioni.
cost int Costo dell'AppDomain. Maggiore è il costo, maggiore è la probabilità che questo AppDomain venga scaricato sotto pressione di memoria. Il costo dipende in genere dalla quantità di memoria necessaria per ricreare questo AppDomain.
value int Valore di AppDomain. Minore è il valore, maggiore è la probabilità che questo AppDomain venga scaricato sotto pressione di memoria. Il valore dipende in genere dal numero di connessioni o batch che usano questo AppDomain.
total_processor_time_ms bigint Tempo totale del processore, in millisecondi, utilizzato da tutti i thread durante l'esecuzione nel dominio dell'applicazione corrente dall'avvio del processo. Equivale a System.AppDomain.MonitoringTotalProcessorTime.
total_allocated_memory_kb bigint Dimensioni totali, in kilobyte, di tutte le allocazioni di memoria eseguite dal dominio dell'applicazione dalla sua creazione, senza sottrarre la memoria raccolta. Equivale a System.AppDomain.MonitoringTotalAllocatedMemorySize.
survived_memory_kb bigint Numero di kilobyte rimanenti dall'ultima raccolta di blocco completa e a cui fa riferimento il dominio dell'applicazione corrente. Equivale a System.AppDomain.MonitoringSurvivedMemorySize.

Osservazioni:

Esiste una relazione uno-a-molti tra dm_clr_appdomains.appdomain_address e dm_clr_loaded_assemblies.appdomain_address.

Le tabelle seguenti elencano i valori di stato possibili, le relative descrizioni e quando si verificano nel ciclo di vita di AppDomain. È possibile usare queste informazioni per seguire il ciclo di vita di un AppDomain e per controllare lo scaricamento di istanze di AppDomain sospette o ripetitive, senza dover analizzare il registro eventi di Windows.

Inizializzazione di AppDomain

Stato Descrizione
E_APPDOMAIN_CREATING AppDomain in fase di creazione.

Utilizzo di AppDomain

Stato Descrizione
E_APPDOMAIN_SHARED AppDomain di runtime è pronto per l'uso da parte di più utenti.
E_APPDOMAIN_SINGLEUSER AppDomain è pronto per l'uso nelle operazioni DDL. Queste ultime differiscono da E_APPDOMAIN_SHARED per il fatto che gli AppDomain condivisi vengono utilizzati per le esecuzioni di integrazione di CLR e non per operazioni DDL. Tali AppDomain sono isolati da altre operazioni simultanee.
E_APPDOMAIN_DOOMED AppDomain è pianificato per essere scaricato, ma attualmente sono in esecuzione thread.

Eliminazione di AppDomain

Stato Descrizione
E_APPDOMAIN_UNLOADING SQL Server ha richiesto che CLR scarica l'AppDomain, in genere perché l'assembly che contiene gli oggetti di database gestiti è stato modificato o eliminato.
E_APPDOMAIN_UNLOADED CLR ha scaricato AppDomain. Questo è in genere il risultato di una procedura di escalation a causa di ThreadAbort, OutOfMemory o di un'eccezione non gestita nel codice utente.
E_APPDOMAIN_ENQUEUE_DESTROY AppDomain è stato scaricato in CLR e impostato per essere eliminato definitivamente da SQL Server.
E_APPDOMAIN_DESTROY AppDomain è in corso di eliminazione definitiva da SQL Server.
E_APPDOMAIN_ZOMBIE AppDomain è stato eliminato definitivamente da SQL Server. Tuttavia, non tutti i riferimenti a AppDomain sono stati puliti.

Autorizzazioni

È richiesta l'autorizzazione VIEW SERVER STATE nel database.

Autorizzazioni per SQL Server 2022 e versioni successive

È richiesta l'autorizzazione VIEW SERVER PERFORMANCE STATE per il server.

Esempi

L'esempio seguente illustra come visualizzare i dettagli di un AppDomain per un determinato assembly:

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

Nell'esempio seguente viene illustrato come visualizzare tutti gli assembly in un determinato AppDomain:

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

Vedi anche

sys.dm_clr_loaded_assemblies (Transact-SQL)
Viste a gestione dinamica correlate a Common Language Runtime (Transact-SQL)