고스트 정리 프로세스는 삭제로 표시된 페이지에서 레코드를 삭제하는 단일 스레드 백그라운드 프로세스입니다. 다음 문서에서는 이 프로세스의 개요를 제공합니다.
고스트 레코드
인덱스 페이지의 리프 수준에서 삭제된 레코드는 페이지에서 물리적으로 제거되지 않습니다. 대신 레코드가 '삭제될 것'으로 표시되거나 삭제됩니다. 즉, 행이 페이지에 유지되지만 행 머리글의 일부가 변경되어 행이 실제로 고스트 행임을 나타냅니다. 이는 삭제 작업 도중 성능을 최적화하기 위함입니다. 레벨 잠금을 위한 행 수준 잠금뿐만 아니라, 이전 버전의 행을 유지해야 하는 경우의 스냅샷 격리를 위해서도 고스트가 필요합니다.
고스트 레코드 정리 작업
삭제로 표시되거나 고스트된 레코드는 백그라운드 고스트 정리 프로세스에 의해 정리됩니다. 이 백그라운드 프로세스는 삭제 트랜잭션이 커밋된 후 언젠가 실행되며 실제로 페이지에서 고스트 레코드를 제거합니다. 고스트 정리 프로세스는 간격(SQL Server 2012 이상의 경우 5초마다, SQL Server 2008/2008R2의 경우 10초마다)에 자동으로 실행되며, 고스트 레코드로 표시된 페이지가 있는지 확인합니다. 레코드를 찾으면, 삭제로 표시되거나 고스트 처리된 레코드를 삭제하며, 실행할 때마다 최대 10페이지를 터치합니다.
레코드가 고스트되면 데이터베이스에 고스트 항목이 있는 것으로 표시되고, 고스트 정리 프로세스는 해당 데이터베이스만 검사합니다. 또한 고스트 정리 프로세스는 모든 고스트 레코드가 삭제되면 데이터베이스를 '고스트 레코드가 없음'으로 표시하고 다음에 실행될 때 이 데이터베이스를 건너뜁니다. 또한 이 프로세스는 공유 잠금을 사용할 수 없는 모든 데이터베이스를 건너뛰고 다음에 실행될 때 다시 시도합니다.
아래 쿼리는 단일 데이터베이스에 있는 고스트 레코드 수를 식별할 수 있습니다.
SELECT sum(ghost_record_count) total_ghost_records, db_name(database_id)
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'SAMPLED')
group by database_id
order by total_ghost_records desc
고스트 정리 비활성화
삭제가 많은 부하가 높은 시스템에서는 고스트 정리 프로세스로 인해 버퍼 풀의 페이지를 유지하고 IO를 생성하는 데 성능 문제가 발생할 수 있습니다. 따라서 추적 플래그 661을 사용하여 이 프로세스를 사용하지 않도록 설정할 수 있습니다. 그러나 프로세스를 사용하지 않도록 설정하면 성능에 영향을 미칩니다.
고스트 정리 프로세스를 사용하지 않도록 설정하면 데이터베이스가 불필요하게 커지고 성능 문제가 발생할 수 있습니다. 고스트 정리 프로세스는 고스트로 표시된 레코드를 제거하므로 프로세스를 사용하지 않도록 설정하면 이러한 레코드가 페이지에 남게 되므로 SQL Server에서 이 공간을 다시 사용할 수 없습니다. 이렇게 하면 SQL Server가 대신 새 페이지에 데이터를 추가하여 데이터베이스 파일이 부풀어 오르고 페이지가 분할될 수도 있습니다. 페이지 분할로 인해 실행 계획을 만들 때와 검사 작업을 수행할 때 성능 문제가 발생합니다.
고스트 정리 프로세스를 사용하지 않도록 설정하면 일부 작업을 수행하여 고스트 레코드를 제거해야 합니다. 한 가지 옵션은 인덱스 다시 작성을 실행하여 페이지에서 데이터를 이동하는 것입니다. 또 다른 옵션은 수동으로 sp_clean_db_free_space 실행(모든 데이터베이스 데이터 파일 정리) 또는 sp_clean_db_file_free_space (단일 데이터베이스 데이터 파일을 정리)하는 것입니다. 그러면 삭제된 레코드가 삭제됩니다.
경고
고스트 정리 프로세스를 사용하지 않도록 설정하는 것은 일반적으로 권장되지 않습니다. 이렇게 하려면 프로덕션 환경에서 영구적으로 구현되기 전에 제어된 환경에서 철저히 테스트해야 합니다.