계획의 최상위 레벨은 기본 테이블 (클러스터형 인덱스)에서 행을 제거하고 4 개의 비 클러스터형 인덱스를 유지 관리하는 것과 관련이 있습니다. 이러한 인덱스 중 두 개는 클러스터형 인덱스 삭제가 처리되는 동시에 행 단위로 유지됩니다. 아래의 녹색으로 강조 표시된 "+2 비 클러스터형 인덱스"입니다.
다른 두 개의 비 클러스터형 인덱스의 경우 옵티마이 저는 이러한 인덱스의 키를 tempdb 작업 테이블 (Eager Spool)에 저장 한 다음 스풀을 두 번 재생하고 인덱스 키를 기준으로 정렬하여 순차 액세스 패턴을 향상시키는 것이 가장 좋습니다.
마지막 작업 순서는 xml
DDL 스크립트에 포함되지 않은 기본 및 보조 인덱스 유지 관리와 관련이 있습니다.
이것에 대해 할 일이별로 없습니다. 비 클러스터형 인덱스 및 xml
인덱스는 기본 테이블의 데이터와 동기화 상태를 유지해야합니다. 이러한 인덱스를 유지 관리하는 비용은 테이블에 추가 인덱스를 생성 할 때 발생하는 트레이드 오프의 일부입니다.
즉, xml
인덱스는 특히 문제가 있습니다. 최적화 프로그램이이 상황에서 몇 개의 행을 사용할 수 있는지 정확하게 평가하기는 매우 어렵습니다. 실제로 xml
인덱스에 대해 과대 평가 하여이 쿼리에 거의 12GB의 메모리가 부여됩니다 (런타임에는 28MB 만 사용됨).
과도한 메모리 부여의 영향을 줄이려면 더 작은 배치로 삭제를 수행 할 수 있습니다.
를 사용하여 정렬하지 않고 계획의 성능을 테스트 할 수도 있습니다 OPTION (QUERYTRACEON 8795)
. 이것은 문서화되지 않은 추적 플래그 이므로 개발 또는 테스트 시스템에서만 시도해야하며 프로덕션에서는 절대 사용하지 않아야합니다. 결과 계획이 훨씬 빠르면 계획 XML을 캡처하고이를 사용 하여 프로덕션 쿼리에 대한 계획 지침 을 만들 수 있습니다.