sys.dm_clr_appdomains (Transact-SQL)
適用於:SQL Server
傳回伺服器中每個應用程式域的資料列。 應用程式域 ( AppDomain ) 是 Microsoft .NET Framework Common Language Runtime (CLR) 中的建構,它是應用程式的隔離單位。 您可以使用此檢視來瞭解並針對在 Microsoft SQL Server 中執行的 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 。 這通常是因為 ThreadAbort 、 OutOfMemory 或使用者程式碼中未處理的例外狀況而導致呈報程式的結果。 |
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)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應