共用方式為


sys.dm_clr_appdomains (Transact-SQL)

針對伺服器中每一個應用程式網域,各傳回一個資料列。應用程式網域 (AppDomain) 是 Microsoft.NET Framework Common Language Runtime (CLR) 中的一個建構,這是應用程式的隔離單元。您可以利用此檢視來了解在 MicrosoftSQL Server 中執行的 CLR 整合物件,並對其進行疑難排解。

CLR 整合 Managed 資料庫物件有多種類型。如需有關這些物件的一般資訊,請參閱<使用 Common Language Runtime (CLR) 整合建立資料庫物件>。每次執行這些物件時,SQL Server 都會建立 AppDomain,供其用來載入及執行必要的程式碼。AppDomain 的隔離等級是每個擁有者每個資料庫各一個 AppDomain。也就是說,使用者擁有的所有 CLR 物件永遠都會在相同的 AppDomain 中執行。程式碼執行完成之後,並不會終結 AppDomain,而會將它快取到記憶體中,以供日後執行使用。這樣可以提高執行效能。

如需詳細資訊,請參閱<應用程式網域>(英文)。

資料行名稱

資料類型

描述

appdomain_address

varbinary(8)

AppDomain 的位址。使用者擁有的所有 Managed 資料庫物件永遠都會載入相同的 AppDomain 中。您可以使用這個資料行,在 sys.dm_clr_loaded_assemblies 中查閱目前已載入此 AppDomain 中的所有組件。

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 的目前狀態。請參閱本主題的<備註>一節,以取得詳細資訊。

strong_refcount

int

這個 AppDomain 的強式參考數目。此數目反映目前正在使用此 AppDomain 執行的批次數目。請注意,執行此檢視時會建立 strong refcount;即使目前並無正在執行的程式碼,strong_refcount 也會有 1 的值。

weak_refcount

int

這個 AppDomain 的弱式參考數目。此數目指出 AppDomain 內快取的物件數目。當您執行 Managed 資料庫物件時,SQL Server 會將物件快取到 AppDomain 內,以供日後使用。這樣可以提高執行效能。

cost

int

AppDomain 的成本。成本愈高,愈有可能因為記憶體壓力而卸載 AppDomain。成本的高低通常需視重新建立此 AppDomain 所需的記憶體容量而定。

value

int

AppDomain 的值。值愈低,愈有可能因為記憶體壓力而卸載此 AppDomain。值的高低通常需視正在使用此 AppDomain 的連接或批次數目而定。

備註

dm_clr_appdomains.appdomain_addressdm_clr_loaded_assemblies.appdomain_address 之間具有一對多關聯性。

下表列出可能的**「狀態」**值、它們的描述,以及在 AppDomain 週期中出現的時機。您可以使用這些資訊來追蹤 AppDomain 的週期,以及監看可疑或重複的 AppDomain 執行個體卸載,而無需剖析 Windows 事件記錄檔。

AppDomain 初始化

狀態

描述

E_APPDOMAIN_CREATING

正在建立 AppDomain

AppDomain 使用方式

狀態

描述

E_APPDOMAIN_SHARED

執行階段 AppDomain 已備妥,可供多位使用者使用。

E_APPDOMAIN_SINGLEUSER

AppDomain 已備妥,可供單一使用者用來執行 DDL 作業。

E_APPDOMAIN_DOOMED

AppDomain 已排定卸載時程,但是其中目前有執行緒正在執行。

AppDomain 清除

狀態

描述

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

SQL Server 正在進行 AppDomain 的終結程序。

E_APPDOMAIN_ZOMBIE

SQL Server 已終結 AppDomain,但尚未清除所有的 AppDomain 參考。

權限

需要資料庫的 VIEW SERVER 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)