SQL Server 실행 계획에서 인덱스 스캔과 인덱스 검색의 차이점은 무엇입니까?
저는 SQL Server 2005를 사용하고 있습니다.
답변:
인덱스 스캔은 SQL Server가 일치하는 항목을 찾기 위해 인덱스 전체를 읽는 곳입니다. 소요 시간은 인덱스 크기에 비례합니다.
인덱스 검색은 SQL 서버가 인덱스의 b- 트리 구조를 사용하여 일치하는 레코드를 직접 검색하는 곳입니다 ( 이 작동 방식에 대한 아이디어는 http://mattfleming.com/node/192 참조 ). 소요 시간은 일치하는 레코드의 수.
따라야 할 기본 규칙은 스캔이 나쁘고 탐색이 좋다는 것입니다.
인덱스 스캔
SQL Server가 스캔을 수행 할 때 디스크에서 읽고 자하는 개체를 메모리로로드 한 다음 해당 개체를 위에서 아래로 읽어 필요한 레코드를 찾습니다.
인덱스 탐색
SQL Server가 검색을 수행 할 때 인덱스에서 데이터가있을 위치를 알고 있으므로 디스크에서 인덱스를로드하고 필요한 인덱스 부분으로 직접 이동하고 필요한 데이터가 끝나는 위치로 읽습니다. . SQL이 찾고있는 데이터의 위치를 이미 알고 있기 때문에 이것은 분명히 스캔보다 훨씬 효율적인 작업입니다.
검색 대신 검색을 사용하도록 실행 계획을 수정하려면 어떻게해야합니까?
SQL Server가 데이터를 찾을 때 SQL Server가 검색에서 스캔으로 전환하게하는 가장 큰 요인 중 하나는 찾고있는 열 중 일부가 사용하려는 인덱스에 포함되지 않은 경우입니다. 클러스터형 인덱스에는 테이블의 모든 열이 포함되어 있기 때문에 대부분의 경우 SQL Server는 클러스터형 인덱스 스캔을 수행합니다. 이것은 (적어도 제 생각에는) 인덱스의 인덱싱 된 열에 해당 열을 추가하지 않고도 인덱스에 열을 포함 할 수있는 가장 큰 이유 중 하나입니다. 인덱스에 추가 열을 포함하면 인덱스의 크기가 증가하지만 SQL Server는 클러스터형 인덱스로 돌아 가지 않고도 인덱스를 읽거나 이러한 값을 얻기 위해 자체 테이블로 이동할 수 있습니다.
참고 문헌
SQL Server 실행 계획 내에서 이러한 각 연산자의 세부 사항에 대한 자세한 내용은 ...을 참조하십시오.
색인 스캔은 색인 정의가 검색 술어를 충족시키기 위해 단일 행에서 찾을 수 없을 때 발생합니다. 이 경우 SQL Server는 검색 조건 자를 충족하는 행 범위 를 찾기 위해 여러 페이지 를 검색해야합니다.
Index Seek의 경우 SQL Server는 인덱스 정의를 사용하여 검색 조건 자와 일치하는 단일 행을 찾습니다 .
Index Seeks가 더 좋고 더 효과적입니다.