[SQL] 테이블 스캔 및 클러스터 된 인덱스 스캔의 차이점은 무엇입니까?
SQL테이블 스캔 및 클러스터 된 인덱스 스캔의 차이점은 무엇입니까?
테이블 스캔과 본질적으로 클러스터 된 인덱스 스캔 모두가 테이블에서 모든 레코드를 검색하기 때문에, 왜 가정으로 더 나은 클러스터 된 인덱스 스캔입니까?
예를 들어 - 많은 레코드가있는 경우 다음의 성능 차이는 무엇입니까?
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
해결법
-
==============================
1.클러스터 된 인덱스 (힙 테이블)이없는 테이블에서 데이터 페이지가 서로 연결되지 않은 - 페이지를 통과하면 인덱스 할당지도로 조회가 필요하므로.
클러스터 된 인덱스 (힙 테이블)이없는 테이블에서 데이터 페이지가 서로 연결되지 않은 - 페이지를 통과하면 인덱스 할당지도로 조회가 필요하므로.
클러스터형 테이블은, 그러나, 그것의 데이터 페이지는 이중 연결리스트에 연결되어있다 - 약간 빠른 순차적 스캔을. 물론, 교환, 당신은 INSERT, UPDATE 및 DELETE에 위해 데이터 페이지를 유지하는 처리의 오버 헤드를 가지고있다. 힙 테이블은, 그러나, IAM에 두 번째 쓰기가 필요합니다.
쿼리는 범위 연산자가있는 경우 (예 : 이드 1과 100 사이의 테이블에서 SELECT *), 다음 클러스터 테이블 (보장 된 순서에있는)이보다 효율적인 것 -는 관련 데이터를 찾기 위해 인덱스 페이지를 사용할 수 있습니다로 페이지 (들). 이 순서에 의존 할 수 없기 때문에 힙은 모든 행을 스캔해야합니다.
그리고, 물론, 클러스터 된 인덱스가 성능을 거의 최적 인 당신이 클러스터 된 인덱스가 추구 할 수 있습니다 ... 아니 인덱스 힙은 항상 테이블 스캔을 초래할 것입니다.
그래서:
Microsoft는이 힙에 상응하는 클러스터되지 않은 인덱스 클러스터 된 인덱스를 비교하는 백서 (내가 위에서 언급하지만, 가깝게 동일하지 않음). 그들의 결론은 모든 테이블에 클러스터 된 인덱스를 넣어 기본적으로. 내가 (다시 그들이 진짜로 여기에 클러스터 된 인덱스 클러스터되지 않은 인덱스를 비교하고 있다는 메모를 -하지만 상대적으로 비교 생각) 그 결과를 요약하기 위해 최선을 다하겠습니다 :
-
==============================
2.http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx
http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx
클러스터 된 인덱스 스캔 논리 및 물리 연산자는 Argument 열에 지정된 클러스터형 인덱스를 검색합니다. 옵션 WHERE :() 조건 술어를 충족 현재, 만 행이 반환됩니다. 인수 열이 ORDERED 절이 포함 된 경우 쿼리 프로세서는 행 '출력은 클러스터 된 인덱스를 분류 한 순서대로 반환 할 것을 요청했습니다. 순서화 절 없으면 스토리지 엔진 (소트 출력을 보장하지 않음)에 최적의 방법으로 인덱스를 검색한다.
http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx
테이블 스캔 논리 및 물리 연산자는 인수 열에 지정된 테이블의 모든 행을 검색한다. 인수 열에서 WHERE :() 술어가 나타날 경우, 술어를 충족 행만 반환됩니다.
-
==============================
3.테이블 스캔은 테이블의 모든 단일 행을 검사해야한다. 클러스터 된 인덱스 스캔은 인덱스를 스캔 할 필요가있다. 이 테이블의 모든 레코드를 검색하지 않습니다. 즉 인덱스, 정말 점입니다.
테이블 스캔은 테이블의 모든 단일 행을 검사해야한다. 클러스터 된 인덱스 스캔은 인덱스를 스캔 할 필요가있다. 이 테이블의 모든 레코드를 검색하지 않습니다. 즉 인덱스, 정말 점입니다.
from https://stackoverflow.com/questions/18764/whats-the-difference-between-a-table-scan-and-a-clustered-index-scan by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 그것은 MySQL을 사용 여러 열 BY GROUP 할 수 있습니까? (0) | 2020.06.21 |
---|---|
[SQL] 다수의 소비자와 SQL 테이블로 작업 대기열 (PostgreSQL을) (0) | 2020.06.21 |
[SQL] SQL 서버 - 여기서 "sys.functions"인가? (0) | 2020.06.21 |
[SQL] MySQL은 '스키마를 생성'과 '데이터베이스를 만드는'- 어떤 차이가 있나요 (0) | 2020.06.21 |
[SQL] 또 다른 하나의 필드에서 하나 개의 테이블의 SQL 업데이트 필드 (0) | 2020.06.21 |