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)