테이블 스캔과 클러스터형 인덱스 스캔의 차이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/18764

  •  09-06-2019
  •  | 
  •  

문제

둘 다 이후 Table Scan 그리고 Clustered Index Scan 본질적으로 테이블의 모든 레코드를 스캔하는데 Clustered Index Scan이 더 나은 이유는 무엇입니까?

예를 들어, 레코드가 많을 때 다음의 성능 차이는 무엇입니까?

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp
도움이 되었습니까?

해결책

클러스터형 인덱스가 없는 테이블(힙 테이블)에서는 데이터 페이지가 서로 연결되지 않으므로 페이지를 순회하려면 인덱스 할당 맵 조회.

그러나 클러스터링된 테이블에는 다음이 있습니다. 이중 연결 목록에 연결된 데이터 페이지 - 순차 스캔을 조금 더 빠르게 만듭니다.물론 그 대가로 데이터 페이지를 순서대로 유지하는 작업을 처리하는 오버헤드가 있습니다. INSERT, UPDATE, 그리고 DELETE.그러나 힙 테이블에는 IAM에 대한 두 번째 쓰기가 필요합니다.

귀하의 쿼리에 RANGE 연산자(예: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100), 클러스터링된 테이블(순서가 보장됨)이 더 효율적입니다. 인덱스 페이지를 사용하여 관련 데이터 페이지를 찾을 수 있기 때문입니다.힙은 순서에 의존할 수 없기 때문에 모든 행을 스캔해야 합니다.

그리고 물론 클러스터형 인덱스를 사용하면 성능에 거의 최적인 CLUSTERED INDEX SEEK를 수행할 수 있습니다. 인덱스가 없는 힙은 항상 테이블 스캔을 발생시킵니다.

그래서:

  • 모든 행을 선택하는 예제 쿼리의 경우 유일한 차이점은 클러스터형 인덱스가 유지 관리하는 이중 연결 목록입니다.이렇게 하면 클러스터링된 테이블이 행 수가 많은 힙보다 약간 더 빨라집니다.

  • 다음이 포함된 쿼리의 경우 WHERE 클러스터형 인덱스에 의해 (적어도 부분적으로) 충족될 수 있는 절이 있으면 순서 때문에 앞서 나올 것입니다. 따라서 전체 테이블을 스캔할 필요가 없습니다.

  • 클러스터형 인덱스로 만족되지 않는 쿼리의 경우 거의 동일합니다. 유일한 차이점은 순차 스캔을 위한 이중 연결 목록입니다.두 경우 모두 최적이 아닙니다.

  • 을 위한 INSERT, UPDATE, 그리고 DELETE 힙이 이길 수도 있고 그렇지 않을 수도 있습니다.힙은 순서를 유지할 필요가 없지만 IAM에 대한 두 번째 쓰기가 필요합니다.상대적인 성능 차이는 무시할 수 있지만 데이터에 따라 상당히 달라질 수 있다고 생각합니다.

마이크로소프트는 백지 이는 클러스터형 인덱스를 힙의 동등한 비클러스터형 인덱스와 비교합니다(위에서 설명한 것과 정확히 동일하지는 않지만 가깝습니다).그들의 결론은 기본적으로 모든 테이블에 클러스터형 인덱스를 배치하는 것입니다.나는 그들의 결과를 요약하기 위해 최선을 다할 것입니다. (여기서는 실제로 비클러스터형 인덱스와 클러스터형 인덱스를 비교하고 있지만 상대적으로 비슷하다고 생각합니다.)

  • INSERT 성능:클러스터형 인덱스는 힙에 필요한 두 번째 쓰기로 인해 약 3% 정도 승리합니다.
  • UPDATE 성능:클러스터형 인덱스는 힙에 필요한 두 번째 조회로 인해 약 8% 승리합니다.
  • DELETE 성능:클러스터형 인덱스는 두 번째 조회가 필요하고 힙에 대해 IAM에서 두 번째 삭제가 필요하기 때문에 약 18% 승리합니다.
  • 하나의 SELECT 성능:클러스터형 인덱스는 힙에 필요한 두 번째 조회로 인해 약 16% 승리합니다.
  • 범위 SELECT 성능:클러스터형 인덱스는 힙의 무작위 순서로 인해 약 29% 승리합니다.
  • 경쟁 상대 INSERT:클러스터형 인덱스의 페이지 분할로 인해 힙 테이블이 로드 시 30% 승리합니다.

다른 팁

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

Clustered Index Scan 논리 및 물리 연산자는 Argument 열에 지정된 클러스터형 인덱스를 검색합니다.선택적 WHERE:() 조건자가 있는 경우 조건자를 충족하는 행만 반환됩니다.Argument 열에 ORDERED 절이 포함된 경우 쿼리 프로세서는 클러스터형 인덱스가 정렬한 순서대로 행의 출력을 반환하도록 요청한 것입니다.ORDERED 절이 없으면 스토리지 엔진은 최적의 방식으로 인덱스를 스캔합니다(출력 정렬을 보장하지 않음).

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

Table Scan 논리 및 물리 연산자는 Argument 열에 지정된 테이블에서 모든 행을 검색합니다.WHERE:() 조건자가 Argument 열에 나타나는 경우 조건자를 충족하는 행만 반환됩니다.

테이블 스캔은 테이블의 모든 단일 행을 검사해야 합니다.클러스터형 인덱스 스캔은 인덱스만 스캔하면 됩니다.테이블의 모든 레코드를 검색하지는 않습니다.이것이 바로 인덱스의 핵심입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top