테이블 스캔과 클러스터형 인덱스 스캔의 차이점은 무엇입니까?
a Table Scan
와 a 모두 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에 두 번째 쓰기가 필요합니다. 상대적인 성능 차이는 무시할 수있을 것이지만 데이터에 따라 상당히 달라집니다.
Microsoft에는 클러스터형 인덱스를 힙의 동등한 비 클러스터형 인덱스와 비교 하는 백서 가 있습니다 (위에서 논의한 것과 정확히 같지는 않지만 닫습니다). 그들의 결론은 기본적으로 모든 테이블에 클러스터형 인덱스를 배치하는 것입니다. 결과를 요약하기 위해 최선을 다할 것입니다 (여기서는 클러스터되지 않은 인덱스와 클러스터형 인덱스를 실제로 비교하고 있지만 상대적으로 비교 가능하다고 생각합니다).
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 열에 나타나면 조건자를 충족하는 행만 반환됩니다.
테이블 스캔은 테이블의 모든 단일 행을 검사해야합니다. 클러스터형 인덱스 스캔은 인덱스 만 스캔하면됩니다. 테이블의 모든 레코드를 스캔하지는 않습니다. 이것이 바로 인덱스의 요점입니다.
'Development Tip' 카테고리의 다른 글
연결 문자열에서 초기 카탈로그와 데이터베이스 키워드의 차이점 (0) | 2020.11.05 |
---|---|
ReactJS : 자식 구성 요소 내부 부모의 setState (0) | 2020.11.05 |
Swift의 C ++ 클래스와 상호 작용 (0) | 2020.11.05 |
TouchableNativeFeedback, TouchableHighlight 또는 TouchableOpacity를 언제 사용합니까? (0) | 2020.11.05 |
Webkit 브라우저에서 TBODY를 스크롤 가능하게 만들기 (0) | 2020.11.05 |