테이블 검색과 클러스터형 인덱스 검색의 차이점은 무엇입니까?
둘 다 a이기 때문에Table Scan
a 리고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
그러면 인덱스 페이지를 사용하여 관련 데이터 페이지를 찾을 수 있으므로 클러스터된 테이블(보장된 순서대로)이 더 효율적입니다.힙은 순서 지정에 의존할 수 없기 때문에 모든 행을 검색해야 합니다.
그리고 물론 클러스터링된 인덱스를 사용하면 성능에 매우 최적인 클러스터링된 인덱스 검색을 수행할 수 있습니다.인덱스가 없는 힙은 항상 테이블 검색을 수행합니다.
그래서:
모든 행을 선택하는 예제 쿼리의 경우 클러스터된 인덱스가 유지 관리하는 이중 링크 목록만 다릅니다.이렇게 하면 클러스터된 테이블이 행 수가 많은 힙보다 조금 더 빨라집니다.
를사한조경우가 있는
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
클러스터된 인덱스 검색 논리적 및 물리적 연산자는 인수 열에 지정된 클러스터된 인덱스를 검색합니다.선택적 WHERE:() 술어가 있는 경우 술어를 충족하는 행만 반환됩니다.인수 열에 ORDERED 절이 있는 경우 쿼리 프로세서는 클러스터된 인덱스가 정렬한 순서대로 행의 출력을 반환하도록 요청했습니다.ORDERED 절이 없는 경우 스토리지 엔진은 최적의 방법으로 인덱스를 스캔합니다(출력이 정렬된다는 보장은 없음).
http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx
테이블 스캔 논리적 및 실제 연산자는 인수 열에 지정된 테이블에서 모든 행을 검색합니다.인수 열에 WHERE:() 술어가 나타나면 술어를 충족하는 행만 반환됩니다.
테이블 스캔은 테이블의 모든 행을 검사해야 합니다.클러스터된 인덱스 검사는 인덱스만 검사하면 됩니다.테이블의 모든 레코드를 스캔하지는 않습니다.그것이 바로 지수의 요점입니다.
언급URL : https://stackoverflow.com/questions/18764/whats-the-difference-between-a-table-scan-and-a-clustered-index-scan
'bestsource' 카테고리의 다른 글
OpenShift 클러스터의 여러 포드에서 변경 로그 잠금을 기다리는 액체 데이터베이스 문제를 해결하는 방법은 무엇입니까? (0) | 2023.07.13 |
---|---|
java.sql.날짜를 조다 시간으로 변환 (0) | 2023.07.13 |
문화 정보를 기반으로 날짜 및 시간 형식을 얻으려면 어떻게 해야 합니까? (0) | 2023.07.13 |
플래터 앱에서 달력 보기를 추가하는 올바른 방법은 무엇입니까? (0) | 2023.07.13 |
cx-Oracle을 사용하여 유니코드를 삽입할 수 없음 (0) | 2023.07.13 |