본문 바로가기

Nested Loop Join에서 인덱스를 사용하는 이유

by ㅇㅍㅍ 2023. 7. 27.
Nested Loop Join에서 인덱스를 사용하는 이유
728x90

디스크 I/O와 메모리 캐시

데이터가 메모리에 올라가 있는 경우 디스크 I/O가 발생하지 않습니다. 인덱스 역시 데이터베이스 시스템의 메모리에 캐시되어 있을 수 있습니다. 따라서 인덱스를 메모리에서 읽는 것이 디스크에서 읽는 것보다 훨씬 빠릅니다.

데이터베이스 시스템은 데이터베이스에서 자주 사용되는 데이터와 인덱스를 메모리에 캐시하여 빠른 접근을 가능하게 합니다. 이를 "버퍼 캐시" 또는 "인메모리 캐시"라고 합니다. 따라서 인덱스를 사용하여 조인이나 검색을 수행할 때, 해당 인덱스가 메모리에 캐시되어 있다면 디스크 I/O 없이 메모리에서 바로 접근하여 처리할 수 있습니다. 이로 인해 매우 빠른 속도로 쿼리를 실행할 수 있습니다.

그러나 모든 데이터와 인덱스를 메모리에 올리는 것은 불가능하기 때문에 모든 상황에서 메모리에서 처리가 이루어지지는 않습니다. 따라서 테이블이나 인덱스가 메모리에 캐시되지 않은 경우에는 여전히 디스크 I/O가 발생할 수 있습니다. 이런 경우에도 인덱스를 사용하는 것이 테이블을 풀 스캔하는 것보다 훨씬 효율적이며, 데이터베이스 시스템은 최적의 실행 계획을 선택하여 빠른 속도로 처리하려고 노력합니다.

따라서 인덱스를 사용하여 데이터를 조회하거나 조인할 때는 메모리에 캐시되어 있을 가능성을 고려하여 인덱스를 먼저 읽는 것이 성능 향상에 유리합니다. 인덱스를 효과적으로 사용하면 디스크 I/O를 줄여서 빠른 쿼리 실행이 가능하며, 데이터베이스의 성능을 향상시킬 수 있습니다.

 

인덱스가 메모리에 캐시되지 않았을 때에도 테이블 스캔 보다 유리한 이유

인덱스는 데이터베이스 시스템에서 데이터를 빠르게 찾기 위해 사용하는 데이터 구조입니다. 인덱스는 테이블의 컬럼 값과 해당 데이터가 위치한 주소를 매핑한 구조로, 데이터베이스에서 특정 값을 빠르게 검색하거나 조인하기 위해 사용됩니다. 인덱스를 사용하면 테이블을 풀 스캔하는 것보다 특정 조건을 만족하는 데이터를 더 빠르게 찾을 수 있습니다. 이는 인덱스의 B-tree 구조와 관련이 있습니다.

B-tree는 데이터를 효율적으로 검색할 수 있도록 설계된 자료구조로, 인덱스의 일종입니다. B-tree는 데이터가 정렬된 상태로 저장되기 때문에 이진 검색보다 더 빠른 검색이 가능합니다. 따라서 인덱스를 사용하면 특정 값을 빠르게 찾을 수 있고, 테이블을 풀 스캔하는 것보다 더 적은 I/O를 필요로 합니다.

인덱스가 메모리에 캐시되지 않았을 때에도 테이블을 풀 스캔하는 것보다 성능이 유리한 이유는 다음과 같습니다:

 

  1. 인덱스는 B-tree 구조로 데이터가 정렬되어 있기 때문에, 특정 값을 검색하는 데에 이진 검색보다 더 빠릅니다.
  2. 인덱스를 사용하면 테이블의 일부 블록만 읽으면 되기 때문에 디스크 I/O가 줄어듭니다.
  3. 인덱스는 메모리에 캐시되지 않았더라도 빠른 검색을 위해 사용되는 데이터 구조이기 때문에, 여전히 테이블을 풀 스캔하는 것보다 더 효율적입니다.

 

그러나 인덱스가 메모리에 캐시되어 있을 때에는 디스크 I/O 없이 메모리에서 바로 접근하여 데이터를 읽을 수 있기 때문에 훨씬 더 빠른 속도로 데이터를 조회할 수 있습니다. 따라서 데이터베이스 시스템은 인덱스를 가능한 한 메모리에 캐시하여 빠른 검색을 지원하려고 노력합니다.

 

 

목차
 

 

반응형

댓글