고스트 정리는 DML 문에 의해 삭제되도록 표시된 행을 물리적으로 제거하는 백그라운드 프로세스입니다. 다음 문서에서는 이 프로세스의 개요를 제공합니다.
고스트 행
인덱스의 리프 수준 페이지에서 삭제된 행은 페이지에서 물리적으로 제거되지 않습니다. 대신 행이 나중에 제거될 것으로 표시되거나 고스트됩니다. 즉, 행이 페이지에 유지되지만, 행 머리글의 비트가 변경되어 그 행이 고스트임을 나타냅니다. 이는 삭제 작업 도중 성능을 최적화하기 위함입니다. 고스트는 행 수준 잠금 및 데이터베이스 엔진이 이전 행 버전을 유지해야 하는 스냅샷 격리 트랜잭션에 필요합니다.
고스트 정리 작업
삭제로 표시되거나 고스트된 행은 더 이상 필요하지 않은 경우 백그라운드 고스트 정리 프로세스에 의해 정리됩니다. 고스트 정리는 주기적으로 실행되며 페이지에 고스트 행이 있는지 확인합니다. 검색된 행이 있으면 이러한 행이 물리적으로 제거됩니다. 데이터베이스 엔진 인스턴스의 모든 데이터베이스에 대해 단일 고스트 정리 스레드가 있습니다.
행이 고스트되면 데이터베이스는 고스트 항목이 있는 것으로 표시됩니다. 고스트 정리 프로세스는 이러한 데이터베이스만 검사합니다. 또한 고스트 정리 프로세스는 모든 고스트 행이 제거되면 데이터베이스에 고스트 행이 없는 것으로 표시하고 다음에 실행될 때 이 데이터베이스를 건너뜁니다. 또한 데이터베이스에 대한 공유 잠금을 획득할 수 없는 경우 이 프로세스는 모든 데이터베이스를 건너뜁니다. 다음에 데이터베이스를 실행할 때 데이터베이스에 대한 잠금 획득을 다시 시도합니다.
다음 쿼리는 데이터베이스에서 대략적인 수의 고스트 행을 반환합니다.
SELECT SUM(ghost_record_count) AS total_ghost_records,
DB_NAME(database_id) AS database_name
FROM sys.dm_db_index_physical_stats(NULL, NULL, NULL, NULL, 'SAMPLED')
GROUP BY database_id
ORDER BY total_ghost_records DESC;
고스트 정리 사용 안 함
삭제가 많은 높은 로드 시스템에서는 고스트 정리 프로세스가 버퍼 풀에서 자주 액세스하는 많은 페이지를 고스트 행이 있는 다른 페이지로 대체하면 성능이 저하될 수 있습니다. 따라서 자주 액세스하는 페이지는 디스크에서 다시 읽고 추가 디스크 I/O를 생성하고 쿼리 대기 시간을 늘려야 합니다. 이 경우 추적 플래그 661을 사용하여 고스트 정리를 사용하지 않도록 설정할 수 있습니다.
고스트 정리가 없으면 데이터베이스가 불필요하게 커질 수 있으므로 추가 I/O 및 메모리 사용으로 인해 성능이 저하됩니다. 고스트 정리 프로세스는 고스트로 표시된 행을 제거하므로 프로세스를 사용하지 않도록 설정하면 이러한 행이 페이지에 남게 되므로 데이터베이스 엔진이 이 공간을 다시 사용할 수 없습니다. 이렇게 하면 데이터베이스 엔진이 대신 새 페이지에 데이터를 추가하여 데이터베이스 파일이 부풀어 오르고 페이지가 분할될 수도 있습니다. 페이지 분할은 디스크 I/O를 증가시켜 쿼리 성능을 저하시킬 수 있습니다. 고스트 정리를 사용하지 않도록 설정하면 데이터베이스의 공간이 부족할 수 있습니다.
경고
고스트 정리 프로세스를 영구적으로 사용하지 않도록 설정하는 것은 권장되지 않습니다.
고스트 정리를 사용하지 않도록 설정할 때 고스트 행을 제거하려면 행이 삭제된 테이블에서 인덱스를 다시 작성합니다. 인덱스를 다시 작성하면 기존 데이터로부터 새 페이지가 생성되고, 이 과정에서 사용되지 않는 행이 생략됩니다.