SQL Server 계획 : 인덱스 스캔 / 인덱스 검색의 차이점


87

SQL Server 실행 계획에서 인덱스 스캔과 인덱스 검색의 차이점은 무엇입니까?

저는 SQL Server 2005를 사용하고 있습니다.

답변:


128

인덱스 스캔은 SQL Server가 일치하는 항목을 찾기 위해 인덱스 전체를 읽는 곳입니다. 소요 시간은 인덱스 크기에 비례합니다.

인덱스 검색은 SQL 서버가 인덱스의 b- 트리 구조를 사용하여 일치하는 레코드를 직접 검색하는 곳입니다 ( 이 작동 방식에 대한 아이디어는 http://mattfleming.com/node/192 참조 ). 소요 시간은 일치하는 레코드의 수.

  • 일반적으로 인덱스 검색을 수행하는 데 걸리는 시간이 전체 레코드 수에 관계없이 일정하기 때문에 인덱스 검색이 인덱스 검색보다 선호됩니다 (일치하는 레코드 수가 총 레코드 수보다 훨씬 적을 때). 표.
  • 그러나 특정 상황에서는 인덱스 스캔이 인덱스 검색보다 빠를 수 있습니다 (때로는 상당히 빠름)-일반적으로 테이블이 매우 작거나 많은 비율의 레코드가 술어와 일치 할 때.

3
링크가 여전히 활성화되어 있습니까? 나를 위해 그것은 작동하지 않습니다. 업데이트 된 링크가있는 경우 도움을주세요
Ronak 아그라 왈

2
@RonakAgrawal 링크가 실제로 죽은 것 같습니다. 대신 wikipedia 를 확인 하시겠습니까?
Justin


76

따라야 할 기본 규칙은 스캔이 나쁘고 탐색이 좋다는 것입니다.

인덱스 스캔

SQL Server가 스캔을 수행 할 때 디스크에서 읽고 자하는 개체를 메모리로로드 한 다음 해당 개체를 위에서 아래로 읽어 필요한 레코드를 찾습니다.

인덱스 탐색

SQL Server가 검색을 수행 할 때 인덱스에서 데이터가있을 위치를 알고 있으므로 디스크에서 인덱스를로드하고 필요한 인덱스 부분으로 직접 이동하고 필요한 데이터가 끝나는 위치로 읽습니다. . SQL이 찾고있는 데이터의 위치를 ​​이미 알고 있기 때문에 이것은 분명히 스캔보다 훨씬 효율적인 작업입니다.


검색 대신 검색을 사용하도록 실행 계획을 수정하려면 어떻게해야합니까?

SQL Server가 데이터를 찾을 때 SQL Server가 검색에서 스캔으로 전환하게하는 가장 큰 요인 중 하나는 찾고있는 열 중 일부가 사용하려는 인덱스에 포함되지 않은 경우입니다. 클러스터형 인덱스에는 테이블의 모든 열이 포함되어 있기 때문에 대부분의 경우 SQL Server는 클러스터형 인덱스 스캔을 수행합니다. 이것은 (적어도 제 생각에는) 인덱스의 인덱싱 된 열에 해당 열을 추가하지 않고도 인덱스에 열을 포함 할 수있는 가장 큰 이유 중 하나입니다. 인덱스에 추가 열을 포함하면 인덱스의 크기가 증가하지만 SQL Server는 클러스터형 인덱스로 돌아 가지 않고도 인덱스를 읽거나 이러한 값을 얻기 위해 자체 테이블로 이동할 수 있습니다.

참고 문헌

SQL Server 실행 계획 내에서 이러한 각 연산자의 세부 사항에 대한 자세한 내용은 ...을 참조하십시오.


7

짧은 답변:

  • 인덱스 스캔 : 특정 열을 제외한 모든 행을 터치합니다.

  • 색인 찾기 : 특정 행과 특정 열을 터치합니다.


4

인덱스 스캔을 사용하면 일치하는 행을 찾기 위해 인덱스의 모든 행이 스캔됩니다. 이것은 작은 테이블에 효율적일 수 있습니다. Index Seek를 사용하면 실제로 기준을 충족하는 행만 터치하면되므로 일반적으로 성능이 더 좋습니다.


2

색인 스캔은 색인 정의가 검색 술어를 충족시키기 위해 단일 행에서 찾을 수 없을 때 발생합니다. 이 경우 SQL Server는 검색 조건 자를 충족하는 행 범위 를 찾기 위해 여러 페이지 를 검색해야합니다.

Index Seek의 경우 SQL Server는 인덱스 정의를 사용하여 검색 조건 자와 일치하는 단일 행을 찾습니다 .

Index Seeks가 더 좋고 더 효과적입니다.


0

스캔은 테이블의 모든 행을 터치합니다.

탐색은 찾고있는 행만 봅니다.

검색은 데이터를 조회하는 방식이 더 효율적이기 때문에 항상 스캔보다 더 낫습니다.

여기 에서 좋은 설명을 찾을 수 있습니다 .


3
없는 추구 항상 테이블이 상대적으로 작으며 그 테이블을 필요로하는 행의 큰 비율은 다음 인덱스 스캔이 훨씬 더 효율적으로 끝나게 반품 할 경우, 예를 들어, 더 나은.
Justin

1
안녕하세요 Justin, 테이블 스캔이 더 나을 수 있다고 말하고 싶군요. 인덱스 검색은 클러스터링에 대해 이야기하지 않는 한 항상 인덱스 스캔보다 낫습니다. 그러나 때로는 테이블 스캔이나 클러스터형 인덱스 스캔이 언급 한 이유로 더 효율적일 수 있습니다. 인덱스를 검색하고 테이블의 인덱스에없는 필드를 가져 오는 대신 인덱스에 criteria 필드가 있어도 ms sql이 테이블을 사용하는 경우가 있습니다.
Jose Areas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.