#title 미리 읽기 [[TableOfContents]] ==== 미리 읽기의 통계학적인 배경 ==== 통계학에 따르면 읽기 작업의 대부분은 순차적이라서 데이터의 다음 블럭을 읽고 메모리에 저장하면 다음 블럭이 요청되었을 때, 디스크 속도가 아니라 메모리 속도로 올라오게 된다고 한다. ==== 개념 ==== 미리 읽기[* Read Ahead]는 범위검색, 인덱스 생성과 같이 순차적인 데이터 읽기가 필요하고, 메모리에 특정 개수[* 몇 개인지는 공개되지 않았다]의 페이지가 없을 경우에 미리 읽기가 수행된다. 미리 읽기가 수행될 때는 다른 쓰레드를 할당하여 페이지를 읽으므로 미리 읽기를 병렬 데이터 스캔[* PDS: Pararell Data Scan]이라고도 한다. 테이블 스캔, 클러스터되지 않은 인덱스에 대한 잎 수준 인덱스 스캔, DBCC 문 및 UPDATE STATISTICS가 포함될 수 있다. attachment:read_ahead.gif 미리 읽기는 익스텐트 단위 즉, 64KB 단위로 입/출력이 이루어진다. IAM(Index Allocation Map) 저장소 구조를 사용한다. 미리읽기의 성능 모니터링은 SQL Server: Buffer Manager: Read-Ahead Pages/sec 성능 카운터를 참고한다. SQL Server는 미리 읽기 페이지의 최대 수를 존재하는 메모리 크기를 기준으로 동적으로 조정한다. ==== 오버헤드 ==== 너무 많은 미리 읽기는 전반적인 성능을 떨어뜨릴 수 있다. 그 이유는 다른 목적으로 사용될 수도 있는 입/출력 및 CPU를 사용하여 메모리가 불필요한 데이터로 가득찰 수 있기 때문이다. 만약 미리읽기로 전반적인 성능저하로 고생을 한다면 미리읽기 때문이라고 생각하면 거의 틀릴 것이다. 왜냐하면 대부분은 여러분의 잘못된 DB설계, 허접한 SQL작성으로 인한 성능저하일 것이기 때문이다. ==== 미리읽기 해제 ==== Trace Flag 652 다.