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.