DMV에서 SQL Server 리소스 데이터베이스 값
- Version : SQL Server 2005, 2008, 2008R2, 2012
DMV sys.dm_os_buffer_descriptors 통하여 시스템 데이터베이스 ID를 검색하여 보면 NULL 값이 나타난다. 어떻게 데이터베이스 이름이 NULL이 나타날 수 있을까?
SQL Server 2005부터 도입된 새로운 시스템 데이터베이스로 인해 시스템 DMV나 카탈로그 뷰 내에서 노출 할 때 데이터베이스는 항상 32767의 database_id 값을 표시한다. (그렇다고 모든 리소스 데이터베이스가 노출 되지는 않는다.) 이때 데이터베이스 이름을 NULL로 반환한다.
데이터 페이지를 디스크에서 읽으면 해당 페이지가 SQL Server 버퍼풀에 복사되며 다시 사용 할 수 있도록 캐시 된다. 각 캐시된 데이터페이지는 버퍼ID를 할당받게 되고 버퍼ID는 현재 SQL Server 인스턴스에 캐시된 각 데이터 페이지를 고유하게 식별한다.
Sys.dm_os_buffer_descriptors 는 SQL Server 버퍼풀에 있는 모든 데이터페이지에 대한 정보를 반환하는 동적관리 뷰 이다. 이때 Resource 데이터베이스와 연결된 페이지도 포함되어 나타난다.
NULL 데이터베이스 이름이 나타나는 것을 확인 할 수 있다.
SELECT DISTINCT DB_NAME(DATABASE_ID) FROM SYS.DM_OS_BUFFER_DESCRIPTORS WITH (NOLOCK) |
리소스 데이터베이스를 제외한 정보를 나타낼 때에는 sys.databases 과 조인하면 리소스 데이터베이스는 제외된다.
SELECT DISTINCT B.NAME FROM SYS.DM_OS_BUFFER_DESCRIPTORS AS A INNER JOIN SYS.DATABASES AS B ON A.DATABASE_ID = B.DATABASE_ID |
Sys.dm_os_buffer_descriptors를 사용할 때 NULL 값을 제거하기 위하여 database_id 의 값이 32767인 것을 case 구문을 이용하여 'resourceDB'라고 나타내었다.
SELECT DISTINCT CASE WHEN DATABASE_ID = 32767 THEN 'RESOURCEDB' ELSE DB_NAME(DATABASE_ID) END FROM SYS.DM_OS_BUFFER_DESCRIPTORS WITH (NOLOCK) GO
SELECT DISTINCT CASE WHEN A.DATABASE_ID = 32767 THEN 'RESOURCEDB' ELSE B.NAME END FROM SYS.DM_OS_BUFFER_DESCRIPTORS AS A INNER JOIN SYS.DATABASES AS B ON A.DATABASE_ID = B.DATABASE_ID GO |
- DMV를 사용하기 위해서는 서버에 대한 View Server State 권한이 필요하다.
- Sys,dm_os_buffer_descriptors는 리소스데이터베이스에서 사용되고 DT는 페이지를 반환하나 사용 가능한 페이지 또는 빼앗긴 페이지, 오류가 있었던 페이지에 대한 정보는 반환하지 않는다.
참고링크 : http://msdn.microsoft.com/ko-kr/library/ms173442.aspx
2013-0110 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
DMV - 데이터베이스 버퍼 메모리 사용량 확인 (0) | 2015.07.20 |
---|---|
Sys.dm_fts_parser을 이용한 문자열 구문 분석 (0) | 2015.07.20 |
키워드로 PROCEDURE, FUNCTION 찾기 (0) | 2015.07.20 |
BCP 사용 (0) | 2015.07.20 |
DATEADD를 사용한 날짜 추가 및 빼기 (0) | 2015.07.20 |