次の方法で共有


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 に読み込まれます。 この列を使用すると、sys.dm_clr_loaded_assembliesのこの AppDomain に現在読み込まれているすべてのアセンブリを検索できます。
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。
state nvarchar(128) AppDomainの現在の状態の記述子。 AppDomain は、作成から削除まで、異なる状態にすることができます。 詳細については、この記事の「解説」セクションを参照してください。
strong_refcount int この AppDomain への厳密な参照の数。 これは、この AppDomain を使用する現在実行中のバッチの数を反映します。 このビューを実行すると、 strong 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 数。 これは、 System.AppDomain.MonitoringSurvivedMemorySize と同じです。

解説

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

次の表は、 state 値とその説明、および 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)