다음을 통해 공유


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_addressdm_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)