#title 클러스터링팩터 [[TableOfContents]] ==== 랜덤 액세스 ==== [선택도와 실행계획의 분리]에서 실행계획의 재사용으로 I/O가 5배 정도 많은 것을 보았다. 같은 테이블의 같은 데이터를 리턴하는데 왜 더 많은 I/O가 일어났을까? 그것은 논클러스터드가 각 인덱스의 중간 노드를 거쳐 임의의 여러 페이지(MSSQL SERVER의 최소 입/출력 단위, 8KB)를 접근했기 때문이다. 이렇게 접근하는 방법을 랜덤액세스(MSSQL Server의 실행계획에는 Bookmark Lookup이라고 한다)라고 한다. 만약 해당 데이터 페이지가 메모리에 로드되지 않았다면 물리적인 I/O가 발생하게 된다. 그러므로 물리적 I/O를 최소화하기 위해서는 DBMS의 최소 입출력 단위 내에 데이터를 꽉꽉 채워야 물리적 I/O가 감소하는 것을 알 수 있다. ==== 사례 ==== 다음과 같이 QUERY 한다고 해보자. 논클러스터드 인덱스는 ID에 잡혀 있다고 가정하고, 선택도도 좋다고 가정한다. {{{ SELECT * FROM TAB WHERE ID IN (1, 2, 3) }}} 위와 같이 QUERY했다고 가정했을 때 클러스터링 팩터에 따라서 물리적 I/O가 달라질 수 있다는 것이다. 만약 1, 2, 3이 아래 그림처럼 각각의 실제 페이지에 분산되어 있다면 결국 3개의 페이지[* 아마도 모든 상용 DBMS 제품은 최소 입/출력 단위가 있을 것이다. SQL Server의 경우는 8KB로 고정이고, Oracle Server의 경우는 2KB, 4KB, 8KB 등과 같이 지정할 수 있다.]에 대한 접근이 일어나야 한다는 것이다. attachment:clustering_factor01.jpg 그러나 아래의 그림처럼 페이지1에 모두 1, 2, 3이 있다면 실제로 1개의 페이지만 접근하면 되는 것이다. (물리적 I/O 비용은 디스크에서 메모리로 데이터를 올리는 것을 말한다.) attachment:clustering_factor02.jpg