sys.dm_clr_appdomains (Transact-SQL)

適用対象:SQL Server

サーバー内の各アプリケーション ドメインの行を返します。 アプリケーション ドメイン (AppDomain) は、アプリケーションの分離の単位である Microsoft .NET Framework共通言語ランタイム (CLR) のコンストラクトです。 このビューを使用すると、Microsoft SQL Serverで実行されている CLR 統合オブジェクトを理解し、トラブルシューティングできます。

CLR 統合マネージド データベース オブジェクトにはいくつかの種類があります。 これらのオブジェクトの一般的な情報については、「 共通言語ランタイム (CLR) 統合を使用したデータベース オブジェクトの構築」を参照してください。 これらのオブジェクトが実行されるたびに、SQL Serverは必要なコードを読み込んで実行できる AppDomain を作成します。 AppDomain の分離レベルは、所有者ごとにデータベースごとに 1 つの AppDomain です。 つまり、ユーザーが所有するすべての CLR オブジェクトは、常にデータベースごとに同じ AppDomain で実行されます (ユーザーが異なるデータベースに CLR データベース オブジェクトを登録すると、CLR データベース オブジェクトは異なるアプリケーション ドメインで実行されます)。 AppDomain は、コードの実行が完了した後は破棄されません。 代わりに、今後の実行のためにメモリにキャッシュされます。 これによってパフォーマンスも向上します。

詳細については、「 アプリケーション ドメイン」を参照してください。

列名 データ型 説明
appdomain_address varbinary(8) AppDomain のアドレス。 ユーザーが所有するすべてのマネージド データベース オブジェクトは、常に同じ AppDomain に読み込まれます。 この列を使用すると、この AppDomain に現在読み込まれているすべてのアセンブリを sys.dm_clr_loaded_assembliesで検索できます。
appdomain_id int AppDomain の ID。 各 AppDomain には一意の ID があります。
appdomain_name varchar(386) SQL Serverによって割り当てられた AppDomain の名前。
creation_time datetime AppDomain が作成された時刻。 AppDomains はキャッシュされ、パフォーマンスを向上させるために再利用されるため、creation_timeは必ずしもコードが実行された時間ではありません。
db_id int この AppDomain が作成されたデータベースの ID。 2 つの異なるデータベースに格納されているコードは、1 つの AppDomain を共有できません。
user_id int この AppDomain でオブジェクトを実行できるユーザーの ID。
状態 nvarchar(128) AppDomain の現在の状態の記述子。 AppDomain の状態は、作成から削除までさまざまです。 詳細については、この記事の「解説」セクションを参照してください。
strong_refcount int この AppDomain への厳密な参照の数。 これは、この AppDomain を使用する現在実行中のバッチの数を反映しています。 このビューを実行すると、 厳密な参照カウントが作成されます。が現在実行中のコードがない場合でも、 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 現在のアプリケーション ドメインによって参照されていることがわかっている、最後の完全なブロックコレクションから存続したキロバイト数。 これは System.AppDomain.MonitoringSurvivedMemorySize と同じです。

注釈

dm_clr_appdomains.appdomain_address と dm_clr_loaded_assemblies.appdomain_address の間には、一対多のリレーションシップがあります

次の表に、使用可能な 状態 値、その説明、および AppDomain ライフサイクルで発生するタイミングを示します。 この情報を使用すると、 AppDomain のライフサイクルに従い、Windows イベント ログを解析することなく、疑わしいまたは反復的な AppDomain インスタンスのアンロードを監視できます。

AppDomain の初期化

State 説明
E_APPDOMAIN_CREATING AppDomain が作成されています。

AppDomain の使用状況

State 説明
E_APPDOMAIN_SHARED ランタイム AppDomain は、複数のユーザーが使用できる状態です。
E_APPDOMAIN_SINGLEUSER AppDomain は DDL 操作で使用できる状態です。 これらは E_APPDOMAIN_SHARED とは異なり、CLR 統合の実行に DDL 操作ではなく共有 AppDomain が使用されます。 このような AppDomain は、他の同時実行操作から分離されます。
E_APPDOMAIN_DOOMED AppDomain はアンロードされる予定ですが、現在実行中のスレッドがあります。

AppDomain のクリーンアップ

State 説明
E_APPDOMAIN_UNLOADING SQL Serverは、通常、マネージド データベース オブジェクトを含むアセンブリが変更または削除されたために、CLR が AppDomain をアンロードすることを要求しました。
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)
共通言語ランタイム関連の動的管理ビュー (Transact-SQL)