分享方式:


sys.dm_clr_appdomains (Transact-SQL)

適用於:SQL Server

傳回伺服器中每個應用程式域的數據列。 應用程式域 (AppDomain) 是 .NET Framework Common Language Runtime (CLR) 中Microsoft建構,這是應用程式的隔離單位。 您可以使用此檢視來瞭解並針對在 SQL Server Microsoft 中執行的 CLR 整合物件進行疑難解答。

CLR 整合受控資料庫物件有數種類型。 如需這些物件的一般資訊,請參閱 使用 Common Language Runtime (CLR) 整合建置資料庫物件。 每當執行這些物件時,SQL Server 就會建立 AppDomain ,以便載入並執行所需的程式代碼。 AppDomain 的隔離等級是每個擁有者每個資料庫的一個 AppDomain。 也就是說,使用者所擁有的所有CLR物件一律會在相同的 AppDomain 每一資料庫中執行(如果使用者在不同的資料庫中註冊CLR資料庫物件,CLR資料庫物件將會在不同的應用程式域中執行)。 在 程式代碼完成執行之後,AppDomain 不會終結。 相反地,它會在記憶體中快取以供日後執行。 這改善效能。

如需詳細資訊,請參閱 應用程式域

資料行名稱 資料類型 描述
appdomain_address varbinary(8) AppDomain位址。 用戶所擁有的所有受控資料庫物件一律會載入相同的 AppDomain。 您可以使用此數據行來查閱目前在此 AppDomain 載入的所有元件,sys.dm_clr_loaded_assemblies
appdomain_id int AppDomain標識碼。 每個 AppDomain 都有唯一標識碼。
appdomain_name varchar(386) 由 SQL Server 指派的 AppDomain 名稱。
creation_time datetime 建立 AppDomain 的時間。 因為 AppDomains 會快取並重複使用以提升效能, 因此creation_time 不一定是執行程式代碼的時間。
db_id int 建立此 AppDomain 之資料庫的標識碼。 儲存在兩個不同資料庫中的程式碼無法共用一個 AppDomain
user_id int 物件可以在這個 AppDomain 中執行之使用者的識別碼。
state nvarchar(128) AppDomain 目前狀態的描述項。 AppDomain 可以處於從建立到刪除的不同狀態。 如需詳細資訊,請參閱本文的一節。
strong_refcount int 這個 AppDomain 的強式參考數目。 這會反映目前執行中的批次數目,這些批次會使用此 AppDomain。 執行此檢視將會建立 強式 refcount;即使目前未執行任何程式代碼, strong_refcount 的值會是 1。
weak_refcount int 這個 AppDomain 的弱式參考數目。 這表示 AppDomain 內的物件快取數目。 當您執行受控資料庫物件時,SQL Server 會在 AppDomain快取它,以供日後重複使用。 這改善效能。
cost int AppDomain 的成本。 成本越高,在記憶體壓力下卸除此 AppDomain 的可能性就越大。 成本通常取決於重新建立此 AppDomain 所需的內存量。
value int AppDomain 的值。 值越低,這個 AppDomain 越有可能在記憶體壓力下卸除。 值通常取決於使用此 AppDomain 的連線或批次數目。
total_processor_time_ms bigint 自進程啟動以來,所有線程在目前應用程式域中執行時所使用的處理器時間總計,以毫秒為單位。 這相當於 System.AppDomain.MonitoringTotalProcessorTime
total_allocated_memory_kb bigint 應用程式域自建立後所建立之所有記憶體配置的大小總計,以 KB 為單位,而不會減去已收集的記憶體。 這相當於 System.AppDomain.MonitoringTotalAllocatedMemorySize
survived_memory_kb bigint 在最後一個完整封鎖集合中倖存下來的 KB 數,以及目前應用程式域已知參考的 KB 數。 這相當於 System.AppDomain.MonitoringSurvivedMemorySize

備註

dm_clr_appdomains.appdomain_address 與 dm_clr_loaded_assemblies.appdomain_address 之間有一對多關聯性。

下表列出可能的狀態值、其描述,以及在AppDomain生命週期中發生時。 您可以使用這項資訊來追蹤AppDomain生命週期,並監看可疑或重複的AppDomain實例卸除,而不需要剖析 Windows 事件記錄檔。

AppDomain 初始化

State 描述
E_APPDOMAIN_CREATING 正在 建立AppDomain

AppDomain 使用方式

State 描述
E_APPDOMAIN_SHARED 運行時間 AppDomain 已可供多個使用者使用。
E_APPDOMAIN_SINGLEUSER AppDomain 已準備好用於 DDL 作業。 這些與E_APPDOMAIN_SHARED不同,因為共用的 AppDomains 會用於 CLR 整合執行,而不是 DDL 作業。 這類 AppDomain 會與其他並行作業隔離。
E_APPDOMAIN_DOOMED AppDomain 已排定要卸除,但目前有線程正在其中執行。

AppDomain 清除

State 描述
E_APPDOMAIN_UNLOADING SQL Server 已要求 CLR 卸除 AppDomain,通常是因為包含 Managed 資料庫物件的元件已經改變或卸載。
E_APPDOMAIN_UNLOADED CLR 已卸除 AppDomain。 這通常是因為 ThreadAbortOutOfMemory 或使用者程式代碼中未處理的例外狀況而導致呈報程序的結果。
E_APPDOMAIN_ENQUEUE_DESTROY AppDomain 已在 CLR 中卸除,並設定為由 SQL Server 終結。
E_APPDOMAIN_DESTROY AppDomain 正在由 SQL Server 終結。
E_APPDOMAIN_ZOMBIE AppDomain 已由 SQL Server 終結;不過,尚未清除 AppDomain 的所有參考

權限

需要資料庫的 VIEW SERVER STATE 許可權。

SQL Server 2022 和更新版本的權限

需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限。

範例

下列範例示範如何檢視指定元件的 AppDomain 詳細資料:

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

下列範例示範如何檢視指定 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);  

另請參閱

sys.dm_clr_loaded_assemblies (Transact-SQL)
Common Language Runtime 相關動態管理檢視 (Transact-SQL)