DBCC MEMORYSTATUS 명령을 사용하여 SQL Server 메모리 사용량 모니터링

이 문서에서는 명령을 사용하여 DBCC MEMORYSTATUS 메모리 사용량을 모니터링하는 방법을 설명합니다.

원래 제품 버전: SQL Server
원본 KB 번호: 907877

소개

명령은 DBCC MEMORYSTATUS Microsoft SQL Server 및 OS에 상태 현재 메모리의 스냅샷 제공합니다. SQL Server 메모리 배포 및 사용량의 가장 자세한 출력 중 하나를 제공합니다. 출력을 사용하여 SQL Server 메모리 사용 문제를 해결하거나 특정 메모리 부족 오류를 해결할 수 있습니다. 많은 메모리 부족 오류가 오류 로그에서 이 출력을 자동으로 생성합니다. 메모리 부족 조건과 관련된 오류가 발생하는 경우 명령을 실행하고 DBCC MEMORYSTATUS Microsoft 지원 연결할 때 출력을 제공할 수 있습니다.

명령의 DBCC MEMORYSTATUS 출력에는 메모리 관리, 메모리 사용량, 집계 메모리 정보, 버퍼 풀 정보 및 프로시저 캐시 정보에 대한 섹션이 포함됩니다. 또한 전역 메모리 개체, 쿼리 메모리 개체, 최적화 및 메모리 브로커의 출력에 대해서도 설명합니다.

참고

성능 모니터(PerfMon) 및 작업 관리자는 메모리의 잠긴 페이지 옵션을 사용하는 경우 전체 메모리 사용을 고려하지 않습니다. AWE(Address Windowing Extensions) API 메모리 사용량을 표시하는 성능 카운터가 없습니다.

중요

명령은 DBCC MEMORYSTATUS Microsoft 지원 위한 진단 도구가 될 수 있습니다. 출력 형식과 제공되는 세부 정보 수준은 서비스 팩과 제품 릴리스 간에 변경될 수 있습니다. 명령이 DBCC MEMORYSTATUS 제공하는 기능은 이후 제품 버전에서 다른 메커니즘으로 대체될 수 있습니다. 따라서 이후 제품 버전에서는 이 명령이 더 이상 작동하지 않을 수 있습니다. 이 명령을 변경하거나 제거하기 전에 추가 경고가 제공되지 않습니다. 따라서 이 명령을 사용하는 애플리케이션은 경고 없이 중단될 수 있습니다.

명령의 DBCC MEMORYSTATUS 출력이 SQL Server 이전 릴리스에서 변경되었습니다. 현재 이전 제품 버전에서 사용할 수 없었던 여러 테이블이 포함되어 있습니다.

DBCC MEMORYSTATUS를 사용하는 방법

DBCC MEMORYSTATUS는 일반적으로 SQL Server 보고되는 메모리 부족 문제를 조사하는 데 사용됩니다. SQL Server 프로세스 외부의 외부 메모리 압력 또는 프로세스 내에서 발생하는 내부 압력이 있는 경우 메모리 부족이 발생할 수 있습니다. 내부 압력은 SQL Server 데이터베이스 엔진 또는 프로세스 내에서 실행되는 다른 구성 요소(예: 연결된 서버, XP, SQLCLR, 침입 방지 또는 바이러스 백신 소프트웨어)에 의해 발생할 수 있습니다. 메모리 압력을 해결하는 방법에 대한 자세한 내용은 SQL Server 메모리 부족 또는 메모리 부족 문제 해결을 참조하세요.

명령을 사용하고 결과를 해석하기 위한 일반적인 단계는 다음과 같습니다. 특정 시나리오에서는 출력에 약간 다르게 접근해야 할 수 있지만 전체 접근 방식은 여기에 설명되어 있습니다.

  1. DBCC MEMORYSTATUS 명령을 실행합니다.
  2. 프로세스/시스템 개수메모리 관리자 섹션을 사용하여 외부 메모리 압력이 있는지 확인합니다(예: 컴퓨터가 물리적 메모리 또는 가상 메모리가 부족하거나 작업 집합이 페이징된 SQL Server). 또한 이러한 섹션을 사용하여 SQL Server 데이터베이스 엔진이 시스템의 전체 메모리와 비교하여 할당한 메모리 양을 결정합니다.
  3. 외부 메모리 압력이 있음을 설정한 경우 다른 애플리케이션 및 OS에서 메모리 사용량을 줄이거나 RAM을 더 추가합니다.
  4. SQL Server 엔진이 대부분의 메모리(내부 메모리 압력)를 사용하고 있음을 설정하는 경우 의 나머지 섹션을 사용하여 이 메모리 사용량에 DBCC MEMORYSTATUS 가장 큰 기여자 구성 요소(메모리 클럭, Cachestore, UserStore 또는 Objectstore)를 식별할 수 있습니다.
  5. , , CACHESTOREUSERSTOREOBJECTSTORE의 각 구성 요소를 MEMORYCLEARK검사합니다. Pages Allocated 값을 검사하여 구성 요소가 SQL Server 내에서 소비하는 메모리 양을 확인합니다. 대부분의 데이터베이스 엔진 메모리 구성 요소에 대한 간략한 설명은 메모리 클럭 형식 테이블을 참조하세요.
    1. 드문 경우이지만 할당은 SQL Server 메모리 관리자를 거치지 않고 직접 가상 할당입니다. 이러한 경우 할당된 페이지 대신 특정 구성 요소에서 VM 커밋된 값을 검사합니다.
    2. 컴퓨터에서 NUMA를 사용하는 경우 일부 메모리 구성 요소는 노드당 분할됩니다. 예를 들어 , , , 등을 관찰OBJECTSTORE_LOCK_MANAGER (node 0)하고 마지막으로 에서 각 노드의 합계 값을 관찰할 수 있습니다OBJECTSTORE_LOCK_MANAGER (Total). OBJECTSTORE_LOCK_MANAGER (node 2)OBJECTSTORE_LOCK_MANAGER (node 1) 시작하는 가장 좋은 위치는 총 값을 보고한 다음 필요에 따라 분석을 검사하는 섹션입니다. 자세한 내용은 NUMA 노드의 메모리 사용을 참조하세요.
  6. 의 일부 섹션에서는 DBCC MEMORYSTATUS 특정 메모리 할당자에 대한 상세하고 특수한 정보를 제공합니다. 이러한 섹션을 사용하여 추가 세부 정보를 이해하고 메모리 클럭 내의 할당에 대한 추가 분석을 볼 수 있습니다. 이러한 섹션의 예로는 버퍼 풀(데이터 및 인덱스 캐시), 프로시저 캐시/계획 캐시, 메모리 개체 쿼리(메모리 부여), 최적화 큐 및 소형 및 중형 및 대형 게이트웨이(최적화 프로그램 메모리)가 있습니다. SQL Server 메모리의 특정 구성 요소가 메모리 압력의 원본이라는 것을 이미 알고 있는 경우 해당 특정 섹션으로 직접 이동하는 것이 좋습니다. 예를 들어 메모리 오류를 유발하는 메모리 부여 사용량이 많은 다른 방법으로 설정한 경우 메모리 개체 쿼리 섹션을 검토할 수 있습니다.

이 문서의 나머지 부분에서는 메모리 문제를 보다 효과적으로 진단할 수 있는 몇 가지 유용한 카운터 DBCC MEMORYSTATUS 에 대해 설명합니다.

프로세스/시스템 수

이 섹션에서는 테이블 형식의 샘플 출력을 제공하고 해당 값을 설명합니다.

Process/System Counts                Value
------------------------------------ ------------
Available Physical Memory            5060247552
Available Virtual Memory             140710048014336
Available Paging File                7066804224
Working Set                          430026752
Percent of Committed Memory in WS    100
Page Faults                          151138
System physical memory high          1
System physical memory low           0
Process physical memory low          0
Process virtual memory low           0

다음 목록에서는 값 및 해당 설명에 대해 설명합니다.

  • 사용 가능한 실제 메모리: 이 값은 컴퓨터의 전체 사용 가능한 메모리 양을 표시합니다. 이 예제에서 사용 가능한 메모리는 5,060,247,552바이트입니다.
  • 사용 가능한 가상 메모리: 이 값은 SQL Server 프로세스에 대한 사용 가능한 가상 메모리의 전체 양이 140,710,048,014,336바이트(128TB)인 것을 보여 줍니다. 자세한 내용은 메모리 및 주소 공간 제한을 참조하세요.
  • 사용 가능한 페이징 파일: 이 값은 여유 페이징 파일 공간을 표시합니다. 이 예제에서 값은 7,066,804,224바이트입니다.
  • 작업 집합: 이 값은 SQL Server 프로세스가 RAM에 있는 전체 가상 메모리 양(페이징되지 않음)이 430,026,752바이트임을 보여 줍니다.
  • WS에서 커밋된 메모리의 백분율: 이 값은 RAM에 있는 SQL Server 할당된 가상 메모리의 백분율(또는 작업 집합)을 보여 줍니다. 100%의 값은 커밋된 모든 메모리가 RAM에 저장되고 그 중 0%가 페이징된 것으로 표시됩니다.
  • 페이지 오류: 이 값은 SQL Server 대한 전체 하드 및 소프트 페이지 폴트를 보여 줍니다. 이 예제에서 값은 151,138입니다.

나머지 4개의 값은 이진 또는 부울입니다.

  • 시스템 실제 메모리 값이 1이면 SQL Server 컴퓨터에서 사용 가능한 실제 메모리가 높은 것으로 간주됨을 나타냅니다. 따라서 시스템 실제 메모리 낮음 값이 0이면 메모리가 부족하지 않습니다. 유사한 논리는 실제 메모리 낮음 처리가상 메모리 낮음 처리에 적용됩니다. 여기서 0은 false이고 1은 true임을 의미합니다. 이 예제에서 두 값은 모두 0입니다. 즉, SQL Server 프로세스에 대한 물리적 메모리와 가상 메모리가 많이 있습니다.

메모리 관리자

이 섹션에서는 SQL Server 전체 메모리 사용량을 보여 주는 메모리 관리자의 샘플 출력을 제공합니다.

Memory Manager             KB
-------------------------- --------------------
VM Reserved                36228032
VM Committed               326188
Locked Pages Allocated     0
Large Pages Allocated      0
Emergency Memory           1024
Emergency Memory In Use    16
Target Committed           14210416
Current Committed          326192
Pages Allocated            161904
Pages Reserved             0
Pages Free                 5056
Pages In Use               286928
Page Alloc Potential       15650992
NUMA Growth Phase          0
Last OOM Factor            0
Last OS Error              0

다음 목록에서는 출력의 값과 해당 설명에 대해 설명합니다.

  • 예약된 VM: 이 값은 SQL Server 예약한 VAS(가상 주소 공간) 또는 VM(가상 메모리)의 전체 양을 보여 줍니다. 가상 메모리 예약은 실제로 실제 메모리를 사용하지 않습니다. 이는 단순히 가상 주소가 큰 VAS 내에서 따로 설정된다는 것을 의미합니다. 자세한 내용은 VirtualAlloc(), MEM_RESERVE.

  • VM 커밋됨: 이 값은 SQL Server 커밋한 전체 VM(가상 메모리) 양을 KB로 표시합니다. 즉, 프로세스에서 사용하는 메모리는 실제 메모리에 의해 백업되거나 페이지 파일에서 덜 자주 백업됩니다. 이전에 예약된 메모리 주소는 이제 실제 스토리지에서 백업됩니다. 할당된 것입니다. 메모리의 잠긴 페이지를 사용하는 경우 SQL Server 다른 방법을 사용하여 메모리, AWE API 및 대부분의 메모리를 이 카운터에 반영하지 않습니다. 이러한 할당은 [할당된 잠긴 페이지](#Locked 페이지 할당됨)를 참조하세요. 자세한 내용은 VirtualAlloc(), MEM_COMMIT.

  • 할당된 페이지: 이 값은 SQL Server 데이터베이스 엔진에서 할당한 총 메모리 페이지 수를 보여 줍니다.

  • 할당된 잠긴 페이지: 이 값은 SQL Server AWE API를 사용하여 실제 RAM에 할당되고 잠긴 메모리 양(KB)을 나타냅니다. 이는 SQL Server 사용 중인 메모리 양을 나타내며 성능을 최적화하기 위해 메모리에 유지하도록 요청했습니다. 메모리에서 페이지를 잠그면 SQL Server 중요한 데이터베이스 페이지를 쉽게 사용할 수 있고 디스크로 교환하지 않도록 합니다. 자세한 내용은 AWE(Windows 확장) 메모리 주소를 참조하세요. 값이 0이면 "메모리의 잠긴 페이지" 기능이 현재 비활성화되고 SQL Server 대신 가상 메모리를 사용함을 나타냅니다. 이러한 경우 VM 커밋된 값은 SQL Server 할당된 메모리를 나타냅니다.

  • 큰 페이지 할당됨: 이 값은 큰 페이지를 사용하여 SQL Server 할당한 메모리 양을 나타냅니다. 큰 페이지는 운영 체제에서 제공하는 메모리 관리 기능입니다. 이 기능은 표준 페이지 크기(일반적으로 4KB)를 사용하는 대신 2MB 또는 4MB와 같은 더 큰 페이지 크기를 사용합니다. 값이 0이면 기능이 활성화되지 않음을 나타냅니다. 자세한 내용은 Virtual Alloc(), MEM_LARGE_PAGES 참조하세요.

  • 대상 커밋됨: 이 값은 SQL Server 커밋하려는 대상 메모리 양을 나타내며, 최근 워크로드에 따라 SQL Server 사용할 수 있는 이상적인 메모리 양입니다.

  • 현재 커밋됨: 이 값은 SQL Server 메모리 관리자가 현재 커밋한 운영 체제 메모리 양(KB)을 나타냅니다(실제 저장소에 할당됨). 이 값에는 "메모리의 잠긴 페이지"(AWE API) 또는 가상 메모리가 포함됩니다. 따라서 이 값은 VM 커밋 또는 잠긴 페이지 할당과 가깝거나 동일합니다. SQL Server AWE API를 사용하는 경우 일부 메모리는 여전히 OS Virtual Memory Manager에 의해 할당되며 VM 커밋됨으로 반영됩니다.

  • NUMA 성장 단계: 이 값은 SQL Server 현재 NUMA 성장 단계에 있는지 여부를 나타냅니다. NUMA 노드가 머신에 있을 때의 이 초기 메모리 증가에 대한 자세한 내용은 작동 방식: SQL Server(NUMA 로컬, 외지 및 어웨이 메모리 블록)을 참조하세요.

  • 마지막 OS 오류: 이 값은 시스템에 메모리 압력이 있을 때 발생한 마지막 OS 오류를 표시합니다. SQL Server OS 오류를 기록하고 출력에 표시합니다. OS 오류의 전체 목록은 시스템 오류 코드를 참조하세요.

NUMA 노드의 메모리 사용량

메모리 관리자 섹션 뒤에 각 메모리 노드에 대한 메모리 사용량 요약이 표시됩니다. NUMA(비균형 메모리 액세스) 사용 시스템에는 각 하드웨어 NUMA 노드에 해당하는 메모리 노드 항목이 있습니다. SMP 시스템에는 단일 메모리 노드 항목이 있습니다. 동일한 패턴이 다른 메모리 섹션에 적용됩니다.

Memory node Id = 0      KB
----------------------- -----------
VM Reserved             21289792
VM Committed            272808
Locked Pages Allocated  0
Pages Allocated         168904
Pages Free              3040
Target Committed        6664712
Current Committed       272808
Foreign Committed       0
Away Committed          0
Taken Away Committed    0

참고

  • 값이 Memory node Id 하드웨어 노드 ID에 해당하지 않을 수 있습니다.
  • 이러한 값은 이 NUMA 노드에서 실행되는 스레드에 의해 할당된 메모리를 보여 줍니다. 이러한 값은 NUMA 노드에 로컬인 메모리가 아닙니다.
  • 모든 메모리 노드에서 VM 예약 값과 VM 커밋된 값의 합계는 메모리 관리자 테이블에 보고된 해당 값보다 약간 적습니다.
  • NUMA 노드 64(노드 64)는 DAC용으로 예약되어 있으며 이 연결은 제한된 메모리 리소스를 사용하기 때문에 메모리 조사에 거의 관심이 없습니다. DAC(전용 관리자 연결)에 대한 자세한 내용은 데이터베이스 관리자에 대한 진단 연결을 참조하세요.

다음 목록에서는 출력 테이블의 값과 해당 설명에 대해 설명합니다.

  • 예약된 VM: 이 노드에서 실행되는 스레드에서 예약된 VAS(가상 주소 공간)를 표시합니다.
  • VM 커밋됨: 이 노드에서 실행되는 스레드에서 커밋된 VAS를 표시합니다.

집계 메모리

다음 표에는 각 클럭 유형 및 NUMA 노드에 대한 집계 메모리 정보가 포함되어 있습니다. NUMA 사용 시스템의 경우 다음과 유사한 출력이 표시될 수 있습니다.

MEMORYCLERK_SQLGENERAL (node 0) KB
------------------------------  --------------------
VM Reserved                     0
VM Committed                    0
Locked Pages Allocated          0
SM Reserved                     0
SM Commited                     0
Pages Allocated                 5416

MEMORYCLERK_SQLGENERAL (node 1) KB
------------------------------- --------------------
VM Reserved                     0
VM Committed                    0
Locked Pages Allocated          0
SM Reserved                     0
SM Commited                     0
Pages Allocated                 136

MEMORYCLERK_SQLGENERAL (Total)  KB
------------------------------- --------------------
VM Reserved                     0
VM Committed                    0
Locked Pages Allocated          0
SM Reserved                     0
SM Commited                     0
Pages Allocated                 5552

Pages Allocated 은 특정 구성 요소(메모리 클럭, 사용자 저장소, 개체 저장소 또는 캐시 저장소)에 의해 할당된 전체 메모리 페이지 수를 보여 줍니다.

참고

이러한 노드 ID는 SQL Server 실행 중인 컴퓨터의 NUMA 노드 구성에 해당합니다. 노드 ID에는 하드웨어 NUMA 노드 위에 정의되거나 SMP 시스템 위에 정의된 가능한 소프트웨어 NUMA 노드가 포함됩니다. 각 노드에 대한 노드 ID와 CPU 간의 매핑을 찾으려면 정보 이벤트 ID 17152를 참조하세요. 이 이벤트는 SQL Server 시작할 때 이벤트 뷰어 애플리케이션 로그에 기록됩니다.

SMP 시스템의 경우 DAC에서 사용되는 노드 = 64를 계산하지 않고 각 클럭 유형에 대해 하나의 테이블만 표시됩니다. 이 테이블은 다음 예제와 유사합니다.

MEMORYCLERK_SQLGENERAL (Total)     KB
--------------------------------- --------------------
VM Reserved                        0
VM Committed                       0
AWE Allocated                      0
SM Reserved                        0
SM Commited                        0
Pages Allocated                    2928

이러한 테이블의 다른 정보는 공유 메모리에 관한 것입니다.

  • SM 예약됨: 메모리 매핑된 파일 API를 사용하는 이러한 종류의 모든 클럭이 예약한 VAS를 표시합니다. 이 API를 공유 메모리라고도 합니다.
  • SM 커밋됨: 메모리 매핑된 파일 API를 사용하는 이러한 종류의 모든 클럭이 커밋한 VAS를 표시합니다.

다른 방법으로, sys.dm_os_memory_clerks DMV(동적 관리 뷰)를 사용하여 모든 메모리 노드의 각 클럭 유형에 대한 요약 정보를 가져올 수 있습니다. 이렇게 하려면 다음 쿼리를 실행합니다.

SELECT
  TYPE,
  SUM(virtual_memory_reserved_kb) AS [VM Reserved],
  SUM(virtual_memory_committed_kb) AS [VM Committed],
  SUM(awe_allocated_kb) AS [AWE Allocated],
  SUM(shared_memory_reserved_kb) AS [SM Reserved],
  SUM(shared_memory_committed_kb) AS [SM Committed],
  -- SUM(multi_pages_kb) AS [MultiPage Allocator],          /*Applies to: SQL Server 2008   (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
  -- SUM(single_pages_kb) AS [SinlgePage Allocator],        /*Applies to: SQL Server 2008   (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
  SUM(pages_kb) AS [Page Allocated]                      /*Applies to: SQL Server 2012 (11.  x) and later.*/
FROM sys.dm_os_memory_clerks
GROUP BY TYPE

버퍼 풀 세부 정보

이 섹션은 버퍼 풀 내의 다양한 상태 데이터 및 인덱스 페이지(데이터 캐시라고도 함)를 분석하는 중요한 섹션입니다. 다음 출력 테이블에는 버퍼 풀 및 기타 정보에 대한 세부 정보가 나와 있습니다.

Buffer Pool                                       Pages
------------------------------------------------- ---------
Database                                          5404
Simulated                                         0
Target                                            16384000
Dirty                                             298
In IO                                             0
Latched                                           0
IO error                                          125
In Internal Pool                                  0
Page Life Expectancy                              3965

다음 목록에서는 출력의 값과 해당 설명에 대해 설명합니다.

  • 데이터베이스: 데이터베이스 콘텐츠(데이터 및 인덱스 페이지)가 있는 버퍼(페이지)의 수를 표시합니다.
  • 대상: 버퍼 풀의 대상 크기(버퍼 수)를 표시합니다. 이 문서의 이전 섹션에서 는 대상 커밋된 메모리를 참조하세요.
  • 더티: 데이터베이스 콘텐츠가 있고 수정된 페이지를 표시합니다. 이러한 버퍼에는 검사점 프로세스에서 일반적으로 디스크로 플러시해야 하는 변경 내용이 포함되어 있습니다.
  • IO: 보류 중인 I/O 작업을 기다리는 버퍼를 표시합니다. 즉, 이러한 페이지의 내용이 스토리지에 쓰여지거나 스토리지에서 읽는 것을 의미합니다.
  • 래치됨: 래치된 버퍼를 표시합니다. 스레드가 페이지의 내용을 읽거나 수정할 때 버퍼가 래치됩니다. 페이지를 디스크에서 읽거나 디스크에 쓸 때 버퍼도 래치됩니다. 래치는 읽거나 수정하는 동안 페이지에서 데이터의 물리적 일관성을 유지하는 데 사용됩니다. 반면 잠금은 논리 및 트랜잭션 일관성을 유지하는 데 사용됩니다.
  • IO 오류: I/O 관련 OS 오류가 발생할 수 있는 버퍼 수를 보여 줍니다(반드시 문제를 나타내는 것은 아닙니다).
  • 페이지 평균 수명: 이 카운터는 가장 오래된 페이지가 버퍼 풀에 유지된 시간(초)을 측정합니다.

DMV를 사용하여 sys.dm_os_buffer_descriptors 데이터베이스 페이지의 버퍼 풀에 대한 자세한 정보를 얻을 수 있습니다. 그러나 SQL Server 기반 서버에서 RAM을 많이 사용할 수 있는 경우 장시간 실행되고 엄청난 출력을 생성할 수 있으므로 주의해서 이 DMV를 사용합니다.

계획 캐시

이 섹션에서는 이전에 프로시저 캐시라고 했던 계획 캐시에 대해 설명합니다.

Procedure Cache         Value
----------------------- -----------
TotalProcs              4
TotalPages              25
InUsePages              0

다음 목록에서는 출력의 값과 해당 설명에 대해 설명합니다.

  • TotalProcs: 이 값은 프로시저 캐시에 현재 캐시된 총 개체를 표시합니다. 이 값은 DMV의 항목 수와 sys.dm_exec_cached_plans 일치합니다.

    참고

    이 정보의 동적 특성으로 인해 일치 항목이 정확하지 않을 수 있습니다. PerfMon을 사용하여 트리거, 프로시저 및 임시 개체와 sys.dm_exec_cached_plans 같은 캐시된 개체의 유형에 대한 자세한 정보를 보려면 Plan Cache 개체 및 DMV SQL Server 모니터링할 수 있습니다.

  • TotalPages: 모든 캐시된 개체를 계획 또는 프로시저 캐시에 저장하는 데 사용되는 누적 페이지를 표시합니다. 이 숫자를 8KB로 곱하여 KB로 표현된 값을 가져올 수 있습니다.

  • InUsePages: 현재 활성 상태인 프로시저에 속하는 프로시저 캐시의 페이지를 표시합니다. 이러한 페이지는 삭제할 수 없습니다.

전역 메모리 개체

이 섹션에는 다양한 전역 메모리 개체 및 사용하는 메모리 양에 대한 정보가 포함되어 있습니다.

Global Memory Objects               Buffers
----------------------------------  ----------------
Resource                            576
Locks                               96
XDES                                61
DirtyPageTracking                   52
SETLS                               8
SubpDesc Allocators                 8
SE SchemaManager                    139
SE Column Metadata Cache            159
SE Column Metadata Cache Store      2
SE Column Store Metadata Cache      8
SQLCache                            224
Replication                         2
ServerGlobal                        1509
XP Global                           2
SortTables                          3

다음 목록에서는 출력의 값과 해당 설명에 대해 설명합니다.

  • 리소스: Resource 개체에서 사용하는 메모리를 표시합니다. 다양한 서버 차원의 구조에 스토리지 엔진에서 사용됩니다.
  • 잠금: Lock Manager에서 사용하는 메모리를 표시합니다.
  • XDES: 트랜잭션 관리자에서 사용하는 메모리를 표시합니다.
  • SETLS: TLS(스레드 로컬 스토리지)를 사용하는 스토리지 엔진별 스레드별 구조를 할당하는 데 사용되는 메모리를 표시합니다. 자세한 내용은 스레드 로컬 스토리지를 참조하세요.
  • SubpDesc 할당자: 병렬 쿼리, 백업 작업, 복원 작업, 데이터베이스 작업, 파일 작업, 미러링 및 비동기 커서에 대한 하위 프로세서를 관리하는 데 사용되는 메모리를 표시합니다. 이러한 하위 프로세스를 "병렬 프로세스"라고도 합니다.
  • SE SchemaManager: 스키마 관리자가 스토리지 엔진별 메타데이터를 저장하는 데 사용하는 메모리를 표시합니다.
  • SQLCache: 임시 및 준비된 문의 텍스트를 저장하는 데 사용되는 메모리를 표시합니다.
  • 복제: 서버가 내부 복제 하위 시스템에 사용하는 메모리를 표시합니다.
  • ServerGlobal: 여러 하위 시스템에서 일반적으로 사용되는 전역 서버 메모리 개체를 표시합니다.
  • XP 전역: 확장 저장 프로시저에서 사용하는 메모리를 표시합니다.
  • SortTables: 정렬 테이블에서 사용하는 메모리를 표시합니다.

메모리 개체 쿼리

이 섹션에서는 쿼리 메모리 부여 정보를 설명합니다. 또한 쿼리 메모리 사용량의 스냅샷 포함합니다. 쿼리 메모리를 "작업 영역 메모리"라고도 합니다.

Query Memory Objects (default)           Value
---------------------------------------- -------
Grants                                    0
Waiting                                   0
Available                                 436307
Current Max                               436307
Future Max                                436307
Physical Max                              436307
Next Request                              0
Waiting For                               0
Cost                                      0
Timeout                                   0
Wait Time                                 0

쿼리의 크기와 비용이 "작은" 쿼리 메모리 임계값을 충족하는 경우 쿼리는 작은 쿼리 큐에 배치됩니다. 이 동작은 큐에 이미 있는 더 큰 쿼리 뒤에 더 작은 쿼리가 지연되는 것을 방지합니다.

다음 목록에서는 출력의 값과 해당 설명에 대해 설명합니다.

  • 권한 부여: 메모리 부여가 있는 실행 중인 쿼리 수를 표시합니다.
  • 대기 중: 메모리 부여를 얻기 위해 대기 중인 쿼리 수를 표시합니다.
  • 사용 가능: 해시 작업 영역 및 정렬 작업 영역으로 사용하기 위해 쿼리에 사용할 수 있는 버퍼를 표시합니다. 값은 Available 주기적으로 업데이트됩니다.
  • 다음 요청: 다음 대기 쿼리에 대한 메모리 요청 크기(버퍼)를 표시합니다.
  • 대기 중: 다음 요청 값이 참조하는 쿼리를 실행하는 데 사용할 수 있어야 하는 메모리 양을 표시합니다. 대기 중 값은 Next Request 헤드룸 요소에 곱한 값입니다. 이 값은 다음 대기 쿼리를 실행할 때 특정 양의 메모리를 사용할 수 있도록 효과적으로 보장합니다.
  • 비용: 다음 대기 쿼리의 비용을 표시합니다.
  • 시간 제한: 다음 대기 쿼리에 대한 시간 제한(초)을 표시합니다.
  • 대기 시간: 다음 대기 쿼리가 큐에 배치된 이후 경과된 시간을 밀리초 단위로 표시합니다.
  • 현재 최대값: 쿼리 실행에 대한 전체 메모리 제한을 표시합니다. 이 값은 큰 쿼리 큐와 작은 쿼리 큐 모두에 대한 결합된 제한입니다.

메모리 부여의 의미, 이러한 값의 의미 및 메모리 부여 문제를 해결하는 방법에 대한 자세한 내용은 SQL Server 메모리 부여로 인한 성능 저하 또는 메모리 부족 문제 해결을 참조하세요.

최적화 메모리

쿼리는 컴파일을 위해 서버에 제출됩니다. 컴파일 프로세스에는 구문 분석, 대수화 및 최적화가 포함됩니다. 쿼리는 각 쿼리가 컴파일 프로세스 중에 사용하는 메모리에 따라 분류됩니다.

참고

이 양에는 쿼리를 실행하는 데 필요한 메모리가 포함되지 않습니다.

쿼리가 시작되면 컴파일할 수 있는 쿼리 수에 제한이 없습니다. 메모리 사용량이 증가하고 임계값에 도달하면 쿼리는 계속하려면 게이트웨이를 통과해야 합니다. 각 게이트웨이 이후에 동시에 컴파일된 쿼리의 제한이 점진적으로 감소합니다. 각 게이트웨이의 크기는 플랫폼 및 부하에 따라 달라집니다. 게이트웨이 크기는 확장성 및 처리량을 최대화하기 위해 선택됩니다.

쿼리가 게이트웨이를 전달할 수 없는 경우 메모리를 사용할 수 있게 될 때까지 기다리거나 시간 제한 오류(오류 8628)를 반환합니다. 또한 쿼리를 취소하거나 교착 상태가 감지된 경우 쿼리가 게이트웨이를 획득하지 못할 수 있습니다. 쿼리가 여러 게이트웨이를 통과하는 경우 컴파일 프로세스가 완료될 때까지 더 작은 게이트웨이를 해제하지 않습니다.

이 동작을 사용하면 동시에 몇 가지 메모리 집약적 컴파일만 발생할 수 있습니다. 또한 이 동작은 더 작은 쿼리의 처리량을 최대화합니다.

다음 표에서는 쿼리 최적화를 위한 메모리 부족으로 인해 발생하는 메모리 대기에 대한 세부 정보를 제공합니다. 내부 메모리는 시스템 쿼리에서 사용되는 최적화 프로그램 메모리를 사용하는 반면, 기본은 사용자 또는 애플리케이션 쿼리에 대한 최적화 메모리를 보고합니다.

Optimization Queue (internal)      Value
---------------------------------- ----------------
Overall Memory                     4013162496
Target Memory                      3673882624
Last Notification                  1
Timeout                            6
Early Termination Factor           5

Small Gateway (internal)           Value
---------------------------------- ----------------
Configured Units                   32
Available Units                    32
Acquires                           0
Waiters                            0
Threshold Factor                   380000
Threshold                          380000

Medium Gateway (internal)          Value
---------------------------------- ----------------
Configured Units                   8
Available Units                    8
Acquires                           0
Waiters                            0
Threshold Factor                   12
Threshold                          -1

Big Gateway (internal)             Value
---------------------------------- ----------------
Configured Units                   1
Available Units                    1
Acquires                           0
Waiters                            0
Threshold Factor                   8
Threshold                          -1

Optimization Queue (default)       Value
---------------------------------- ----------------
Overall Memory                     4013162496
Target Memory                      3542319104
Last Notification                  1
Timeout                            6
Early Termination Factor           5

Small Gateway (default)            Value
---------------------------------- ----------------
Configured Units                   32
Available Units                    32
Acquires                           0
Waiters                            0
Threshold Factor                   380000
Threshold                          380000

Medium Gateway (default)           Value
---------------------------------- ----------------
Configured Units                   8
Available Units                    8
Acquires                           0
Waiters                            2
Threshold Factor                   12
Threshold                          -1

Big Gateway (default)              Value
---------------------------------- ----------------
Configured Units                   1
Available Units                    1
Acquires                           0
Waiters                            0
Threshold Factor                   8
Threshold                          -1

다음은 이러한 값 중 일부에 대한 설명입니다.

  • 구성된 단위 - 게이트웨이에서 컴파일 메모리를 사용할 수 있는 동시 쿼리 수를 나타냅니다. 이 예제에서 32개의 동시 쿼리는 Small Gateway의 메모리(기본값), 중간 게이트웨이의 동시 쿼리 8개, Big Gateway의 쿼리 1개를 사용할 수 있습니다. 앞에서 설명한 것처럼 쿼리에 Small Gateway가 할당할 수 있는 것보다 더 많은 메모리가 필요한 경우 중간 게이트웨이로 이동하고 해당 쿼리는 두 게이트웨이에서 단위를 가져온 것으로 계산됩니다. 쿼리에 필요한 컴파일 메모리 양이 클수록 게이트웨이에서 구성된 단위가 줄어듭니다.
  • 사용 가능한 단위 - 구성된 단위 목록에서 컴파일할 동시 쿼리에 사용할 수 있는 슬롯 또는 단위 수를 나타냅니다. 예를 들어 32개 단위를 사용할 수 있지만 현재 3개의 쿼리가 컴파일 메모리 Available Units 를 사용하는 경우 32-3 또는 29단위가 됩니다.
  • 획득 - 컴파일할 쿼리에서 획득한 단위 또는 슬롯 수를 나타냅니다. 세 개의 쿼리가 현재 게이트웨이의 메모리를 사용하는 경우 Acquires = 3입니다.
  • 웨이터 - 게이트웨이에서 컴파일 메모리를 기다리는 쿼리 수를 나타냅니다. 게이트웨이의 모든 단위가 모두 소진되면 대기 중인 쿼리 수를 보여 주는 Waiters 값이 0이 아닙니다.
  • 임계값 - 쿼리가 메모리를 가져오는 위치 또는 쿼리가 유지되는 게이트웨이를 결정하는 게이트웨이 메모리 제한을 나타냅니다. 쿼리가 임계값을 초과할 필요가 없는 경우 작은 게이트웨이에 유지됩니다(쿼리는 항상 작은 게이트웨이로 시작됨). 컴파일에 더 많은 메모리가 필요한 경우 중간 크기로 이동하고 해당 임계값이 여전히 충분하지 않으면 큰 게이트웨이로 이동합니다. 작은 게이트웨이의 경우 x64 플랫폼에 대한 임계값 요소는 380,000바이트(이후 버전에서 변경될 수 있음)입니다.
  • 임계값 요소: 각 게이트웨이의 임계값을 결정합니다. 작은 게이트웨이의 경우 임계값이 미리 정의되어 있으므로 요소도 동일한 값으로 설정됩니다. 중간 및 큰 게이트웨이의 임계값 요소는 총 최적화 프로그램 메모리(최적화 큐의 전체 메모리)의 분수이며 각각 12와 8로 설정됩니다. 따라서 다른 SQL Server 메모리 소비자에게 메모리가 필요하기 때문에 전체 메모리가 조정되면 임계값 요인으로 인해 임계값도 동적으로 조정됩니다.
  • 시간 제한: 쿼리가 최적화 프로그램 메모리를 대기하는 시간을 정의하는 시간(분)의 값을 나타냅니다. 이 시간 제한 값에 도달하면 세션 대기가 중지되고 오류 8628이 발생합니다. A time out occurred while waiting to optimize the query. Rerun the query.

메모리 브로커

이 섹션에서는 캐시된 메모리, 도난당한 메모리 및 예약된 메모리를 제어하는 메모리 브로커에 대한 정보를 제공합니다. 이러한 테이블의 정보는 내부 진단 대해서만 사용할 수 있습니다. 따라서 이 정보는 자세히 설명되지 않습니다.

MEMORYBROKER_FOR_CACHE (internal)       Value
--------------------------------------- -------------
Allocations                             20040
Rate                                    0
Target Allocations                      3477904
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_STEAL (internal)       Value
--------------------------------------- -------------
Allocations                             129872
Rate                                    40
Target Allocations                      3587776
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_RESERVE (internal)     Value
--------------------------------------- -------------
Allocations                             0
Rate                                    0
Target Allocations                      3457864
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_CACHE (default)        Value
--------------------------------------- -------------
Allocations                             44592
Rate                                    8552
Target Allocations                      3511008
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_STEAL (default)        Value
--------------------------------------- -------------
Allocations                             1432
Rate                                    -520
Target Allocations                      3459296
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_RESERVE (default)      Value
--------------------------------------- -------------
Allocations                             0
Rate                                    0
Target Allocations                      3919104
Future Allocations                      872608
Overall                                 3919104
Last Notification                       1