sys.dm_clr_appdomains (Transact-SQL)
適用対象: SQL サーバー
サーバー内の各アプリケーション ドメインの行を返します。 アプリケーション ドメイン (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_address と dm_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 がアンロードされました。 これは通常、 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)
共通言語ランタイム関連の動的管理ビュー (Transact-SQL)