본문 바로가기

개발/인덱스와 통계

인덱스 생성 시 메모리 부족

728x90

dm_exec_query_memory_grants

인덱스 생성 시  RESOURCE_SEMAPHORE WAIT 이벤트 발생 시 아래 쿼리로 해당 인덱스 생성 작업에 대한 메모리 할당이 이루어 졌는지를 확인할 수 있습니다.

SELECT session_id,
  ((t1.requested_memory_kb)/1024.00) MemoryRequestedMB
  , CASE WHEN t1.grant_time IS NULL THEN 'Waiting' ELSE 'Granted' END AS RequestStatus
  , t1.timeout_sec SecondsToTerminate
  , t2.[text] QueryText
FROM sys.dm_exec_query_memory_grants t1
  CROSS APPLY sys.dm_exec_sql_text(t1.sql_handle) t2 

만약 메모리 할당이 이루어지지 않고 Waiting 상태라면, 메모리를 늘려야 하는데 서버의 물리적인 메모리가 여유가 있는 상태라면, Min/Max Server Memory를 설정하여 조정합니다.

 

물리적인 메모리가 부족하다고 하면 해당 서버의 다른 데이터베이스들이 사용하는 메모리들을 반환하여 조금씩 더 사용할 수 있는 메모리 영역을 만들 수 있습니다.

 

데이터베이스별로 Memory Buffer Pool에서 사용되는 Page 상태를 조회

SELECT (CASE 
           WHEN ( [database_id] = 32767 ) THEN 'Resource Database' 
           ELSE Db_name (database_id) 
         END )  AS 'Database Name', 
       Sum(CASE 
             WHEN ( [is_modified] = 1 ) THEN 0 
             ELSE 1 
           END) AS 'Clean Page Count',
		Sum(CASE 
             WHEN ( [is_modified] = 1 ) THEN 1 
             ELSE 0 
           END) AS 'Dirty Page Count'
FROM   sys.dm_os_buffer_descriptors 
GROUP  BY database_id 
ORDER  BY DB_NAME(database_id);

 

728x90