#title Scan [[TableOfContents]] 문서 작성 중.. ==== SQL Server의 Scan의 의미 ==== Oracle Server의 Scan의 의미와 SQL Server의 Scan의미는 다르다. 심지어 SQL Server내에서도 Scan의 의미도 다르다. Oracle Server의 'Index Range Scan'의 경우는 인덱스의 특정 범위만을 읽었다는 것을 의미한다. 하지만 SQL Server에서는 'Index Range Scan'이란 용어가 없다. 일반적인 경우에 Index를 이용해서 1건을 찾았건 1000건을 찾았건 Index 전체가 대상이 되지 않았다면 Index Seek로 표현된다. 물론 매개변수 스니핑(참고: [선택도와 실행계획의 분리])과 같은 재컴파일된 SP의 잘못된 사용으로 전체 테이블을 Index Seek하는 경우도 있다. SQL Server에서 Scan은 다음과 같은 4가지다. * Table Scan * Index Scan * Clustered Index Scan * Partition Scan Table Scan은 Heap(참고:[Index]) 전체를 읽는 것을 의미한다. Index Scan은 Non-Clustered Index 전체를 읽은 것을 의미한다. Clustered Index Scan은 해당 테이블에 Clustered Index가 있다면 Clustere Index 전체를 읽는 것을 의미한다. Clustered Index의 리프노든 데이터이므로 Clustered Index가 있는 테이블을 'Full Scan'했다는 의미는 Clustered Index Scan을 했다는 의미가 된다. 만약 해당 테이블에 Clustered Index가 존재하지 않는다면 Full Scan의 의미는 Table Scan을 의미하게 된다. 하지만 [Ordered]문서에도 이야기 했듯이 꼭 Clustered Index Scan이 정렬된다는 보장은 없다. 결과만 볼 때는 Table Scan과 Clustered Index Scan의 결과가 동일할 수 있다. 어쨌든 정렬된 결과를 의미하지 않는다면 'Full Scan'은 테이블 전체를 접근했다는 의미로 생각하면 된다. Partition Scan은 SQL Server 2005버전에서 새롭게 등장했다. 그것도 Enterprise Edition과 Developer Edtion에서만 쓰인다. Partitioned Table에서 특정 파티션만을 Scan하는 것을 의미한다. ==== Full Scan은 느리다? ==== Full Scan이 느리다고 하는 것은 암시적으로 '현재 상황에서는 인덱스를 이용해서 접근하면 훨씬 빠르다'라는 의미를 내포하고 있다. 필자가 알기로는 DBMS에서 테이블에 접근해서 모든 데이터에 접근하는 방법 중에서는 Full Scan이 가장 빠르다. 게다가 '[미리 읽기]'라도 해대면 통계학적으로 Disk 기반에서는 메모리의 속도로 데이터를 접근할 수 있다. 파일 시스템에서의 미리 읽기는 데이터를 요청하기 전에 먼저 캐시로 읽는 기술이다. 순차적인 파일 읽기에 매우 효과적이다. SQL Server에서 이야기 하는 미리 읽기는 Clustered Index Scan을 의미하는데, 물리적인 읽기라고 하기 보다는 Page Header에 기록된 다음 Page의 위치로 이동하여 읽는 것을 말한다. 미리 읽기가 수행될 때 물리적으로도 다음에 읽을 데이터가 인접된 곳에 존재하면 매우 빨리 데이터를 읽을 수 있다. ==== Full Scan의 부하 변수 ==== * FillFactor * 정규화(중요한 것은 cadinality가 아니라 bytes) * 조건절(각각의 row에 대해 조건절을 검사) * 조건의 순서 * 물리적인 page의 인접순서