sys.dm_clr_appdomains(Transact-SQL)
서버의 각 응용 프로그램 도메인에 대해 행을 반환합니다. 응용 프로그램 도메인인 AppDomain은 Microsoft .NET Framework CLR(공용 언어 런타임)의 구조이며 응용 프로그램의 격리 단위입니다. 이 뷰를 사용하여 Microsoft SQL Server에서 실행하는 CLR 통합 개체를 이해하고 관련 문제를 해결할 수 있습니다.
CLR 통합의 관리되는 데이터베이스 개체 유형은 다양합니다. 이러한 개체에 대한 일반적인 내용은 CLR(공용 언어 런타임) 통합을 사용하여 데이터베이스 개체 작성을 참조하십시오. 이러한 개체가 실행될 때마다 SQL Server에서는 필요한 코드를 로드 및 실행할 수 있는 AppDomain을 만듭니다. AppDomain에 대한 격리 수준은 소유자마다 데이터베이스당 하나의 AppDomain입니다. 즉, 사용자가 소유한 모든 CLR 개체는 항상 동일한 AppDomain에서 실행됩니다. AppDomain은 코드에서 실행을 완료한 후 소멸되지 않고 나중에 실행하도록 메모리에 캐시됩니다. 이렇게 하면 성능이 향상됩니다.
자세한 내용은 응용 프로그램 도메인(Application Domains)을 참조하십시오.
열 이름 |
데이터 형식 |
설명 |
---|---|---|
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입니다. 서로 다른 두 개의 데이터베이스에 저장된 코드가 하나의 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을 사용하는 연결 수나 일괄 처리 수에 따라 달라집니다. |
주의
dm_clr_appdomains.appdomain_address와 dm_clr_loaded_assemblies.appdomain_address 간의 일 대 다 관계가 있습니다.
다음 표에서는 가능한 state 값, 해당 설명, AppDomain 수명 주기에서 이러한 상태가 발생하는 경우를 보여 줍니다. 이 정보를 사용하면 Windows 이벤트 로그를 구문 분석할 필요 없이 AppDomain의 수명 주기에 걸쳐 의심스럽거나 반복적인 AppDomain 인스턴스 언로드를 감시할 수 있습니다.
AppDomain 초기화
State |
설명 |
---|---|
E_APPDOMAIN_CREATING |
AppDomain이 생성되고 있습니다. |
AppDomain 사용
State |
설명 |
---|---|
E_APPDOMAIN_SHARED |
여러 사용자가 런타임 AppDomain을 사용할 준비가 되었습니다. |
E_APPDOMAIN_SINGLEUSER |
AppDomain을 DDL 작업에 사용할 수 있습니다. 공유된 AppDomain이 DDL 작업이 아닌 CLR 통합 실행에 사용된다는 점에서 E_APPDOMAIN_SHARED와 다릅니다. 이러한 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 권한이 필요합니다.
예
다음 예에서는 지정된 어셈블리에 대한 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)