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_address 和 dm_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。這種狀態通常是因為使用者程式碼中有 ThreadAbort、OutOfMemory 或未處理的例外狀況而產生擴大程序的結果。 |
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)