Share via


sys.dm_clr_appdomains(Transact-SQL)

적용 대상:SQL Server

서버의 각 애플리케이션 도메인에 대한 행을 반환합니다. 애플리케이션 도메인(AppDomain)은 애플리케이션에 대한 격리 단위인 Microsoft .NET Framework CLR(공용 언어 런타임)의 구문입니다. 이 보기를 사용하여 Microsoft SQL Server에서 실행되는 CLR 통합 개체를 이해하고 문제를 해결할 수 있습니다.

CLR 통합 관리형 데이터베이스 개체에는 여러 가지 유형이 있습니다. 이러한 개체에 대한 일반적인 내용은 CLR(공용 언어 런타임) 통합을 사용하여 데이터베이스 개체 빌드를 참조 하세요. 이러한 개체가 실행될 때마다 SQL Server는 필요한 코드를 로드하고 실행할 수 있는 AppDomain을 만듭니다. AppDomain격리 수준은 소유자당 데이터베이스당 하나의 AppDomain입니다. 즉, 사용자가 소유한 모든 CLR 개체는 항상 동일한 AppDomain 데이터베이스당 실행됩니다(사용자가 다른 데이터베이스에 CLR 데이터베이스 개체를 등록하는 경우 CLR 데이터베이스 개체는 다른 애플리케이션 도메인에서 실행됩니다). 코드 실행이 완료된 후에는 AppDomain이 제거되지 않습니다. 대신 이후 실행을 위해 메모리에 캐시됩니다. 이렇게 하면 성능을 향상 시킬 수 있습니다.

자세한 내용은 애플리케이션 도메인을 참조 하세요.

열 이름 데이터 형식 설명
appdomain_address varbinary(8) AppDomain의 주소입니다. 사용자가 소유한 모든 관리되는 데이터베이스 개체는 항상 동일한 AppDomain에 로드됩니다. 이 열을 사용하여 sys.dm_clr_loaded_assembliesAppDomain에 현재 로드된 모든 어셈블리를 조회할 수 있습니다.
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을 사용하는 현재 실행 중인 일괄 처리의 수를 반영합니다. 이 뷰를 실행하면 강력한 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 마지막 전체 차단 컬렉션에서 살아남았으며 현재 애플리케이션 도메인에서 참조하는 것으로 알려진 킬로바이트 수입니다. System.AppDomain.MonitoringSurvivedMemorySize와 동일합니다.

설명

dm_clr_appdomains.appdomain_address와 dm_clr_loaded_assemblies.appdomain_address 사이에는 일대다 관계가 있습니다.

다음 표에서는 가능한 상태 값, 해당 설명 및 AppDomain 수명 주기에서 발생하는 경우를 나열합니다. 이 정보를 사용하여 AppDomain수명 주기를 따르고 Windows 이벤트 로그를 구문 분석하지 않고도 의심스럽거나 반복적인 AppDomain 인스턴스 언로드를 감시할 수 있습니다.

AppDomain 초기화

설명
E_APPDOMAIN_CREATING AppDomain이 만들어지고 있습니다.

AppDomain 사용 현황

설명
E_APPDOMAIN_SHARED 런타임 AppDomain 은 여러 사용자가 사용할 준비가 된 것입니다.
E_APPDOMAIN_SINGLEUSER AppDomain은 DDL 작업에서 사용할 준비가 된 것입니다. 이는 공유 AppDomain이 DDL 작업이 아닌 CLR 통합 실행에 사용된다는 점에서 E_APPDOMAIN_SHARED 다릅니다. 이러한 AppDomain은 다른 동시 작업과 격리됩니다.
E_APPDOMAIN_DOOMED AppDomain은 언로드되도록 예약되어 있지만 현재 실행 중인 스레드가 있습니다.

AppDomain 정리

설명
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)