비투엔 기술기고

[Oracle Exadata] Oracle Exadata 핵심 기술요소 Summary 3

알 수 없는 사용자 2014. 10. 2. 10:14


[Oracle Exadata] Oracle Exadata 핵심 기술요소 Summary 1편 - 보기  

[Oracle Exadata] Oracle Exadata 핵심 기술요소 Summary 2편 - 보기



| Storage Index |

Storage Index는 데이터가 인덱스 범위에 속하지 않을 경우 해당 블록의 스캔을 회피하여 불필요한 Disk I/O를 줄이기 위한 목적으로 설계된 Storage 서버의 S/W 기능이다. 이번 호에서는 Storage Index 구조 및 동작 원리에 대해 알아보고, Storage Index가 사용되는 조건절과 Storage Index 모니터링 방법에 대해 알아본다.



B-tree Index vs. Storage Index

B-tree Index는 대용량 데이터 범위 검색 시 빠른 성능을 위해 고안되었기 때문에 대용량 데이터에서 적은 범위를 액세스 하고자 할 경우에 좋은 성능을 발휘한다. 하지만, 내부적으로 컬럼 값과 해당 레코드의 주소를 함께 저장하는 구조를 가지고 있고, 이러한 구조는 컬럼 값의 인덱스 개수만큼 블록을 반복 탐색해야 하기 때문에 넓은 범위 검색 시에는 급속도로 성능이 저하될 수 있다.


B-tree Index가 특정 범위를 빠르게 검색하기 위해 고안되었다면 Storage Index는 Storage 내에서 블록 검색 시 Disk I/O를 줄이기 위한 목적으로 만들어졌기 때문에 스마트 스캔 등 특정 조건이 충족될 경우만 사용될 수 있다.


다음은 B-tree Index와 Storage Index를 비교한 표이다.




Storage Index 구조

기본적으로 Storage Index는 테이블 하나에 최대 8개 컬럼까지 생성될 수 있다. Storage Index는 테이블을 Storage Region(1MB) 별로 나누고, Storage Region 내 데이터들의 최소/최대 값과 Null 유무 정보를 저장한다.

Storage Index는 해당 컬럼을 포함한 스마트 스캔 질의가 처음 실행될 때 Exadata에 의해 자동으로 생성되고, 이 후 데이터가 변경될 때 자동으로 변경된다. 또한, 메모리에 저장되기 때문에 Cell Server가 종료되면 자동으로 삭제되고 다시 해당 컬럼을 참조하는 스마트 스캔 질의가 처음으로 수행될 때 자동으로 생성된다. 

질의가 수행되면, Where 절 조건에 명시된 값과 Storage Region에 저장된 최소, 최대 값을 비교한다. 만약 조건에 명시된 값이 최소/최대 값 범위에 포함되지 않는다면, 해당 Storage Region의 블록들은 탐색할 필요가 없기 때문에 Storage Region의 모든 블록 스캔을 Skip한다.


  Storage Index 구조와 동작   



위의 그림을 보면, 각각의 Storage Region에는 데이터의 Min/Max 값과 Null 유무가 저장된 것을 알 수 있다. 위의 조건과 같이 101에서 200 사이의 데이터만 조회한다면, 가장 왼쪽의 Storage Region은 25 ~ 75 사이의 데이터만 존재하기 때문에 조회 조건에 만족하는 데이터가 없다. 따라서 해당 Storage Region의 블록들은 스캔할 필요가 없다. 마찬가지로 Storage Region 2도 390 ~ 452 사이의 데이터만 존재하므로 블록을 스캔할 필요가 없다. 하지만 Storage Region 3, 4의 데이터 범위가 각각 56~125, 110~240이므로 조회 조건에 만족하는 데이터가 포함될 수 있기 때문에 Storage 서버는 해당 Storage Region의 블록들에 대해 탐색을 수행한다. 이렇게 Storage Index의 필요한 Storage Region들만 탐색하게 되면 Storage 서버 내에서의 Disk I/O는 감소한다.



Storage Index의 사용 조건

Storage Index는 Smart Scan의 최적화 요소 중 하나로 질의가 Smart Scan으로 수행될 경우만 사용한다. Smart Scan 뿐 아니라, Storage Index가 사용되기 위해서 다음과 같은 몇 가지 필수 조건들이 있다.


1. Smart Scan

Smart Scan이 수행될 경우에만 Storage Index를 사용할 수 있다.

2. 최소 하나 이상의 조건

Where 절에 조건이 명시되어야만 Storage Index가 사용된다. 조건이 없는 경우는 테이블의 모든 블록을 조회하기 때문에 Storage Index를 사용할 필요가 없기 때문이다.

3. 연산자

=, >, <, >=, <=, IN, BETWEEN, IS NULL, IS NOT NULL 연산자를 사용하여 조건을 비교할 경우에 사용되고, 그 이외 연산자에는 Storage Index가 사용되지 않는다.


위에서 설명한 필수 조건은 아니지만 Storage Index가 사용되는 경우도 있다.


1. 조인 

조인 수행 전 Storage Index를 통해 블록 Filtering 수행이 가능하다.

2. Bind 변수

Bind 변수 값이 Storage 서버로 전달되기 때문에 Storage Index 사용이 가능하다.

3. 다중 컬럼 조건

Where 절에 Storage Index를 사용할 수 있는 컬럼이 여러 개 있다면, 각 컬럼의 Storage Index를 통해 Filtering이 가능하다.

4. 암호화

5. 서브쿼리

6. 파티션

7. 병렬쿼리

8. 파티션

9. HCC



Storage Index 제어

DB 서버에서 _kcfis_storageidx_disabled 히든 파라미터를 true로 설정하면 Storage Index를 비활성화 시킬 수 있다. 



True로 설정하면 질의 수행 시 참조 가능한 Storage Index가 있더라도 사용하지 않는다. 그러나 Storage Index가 사용되지 않는다고 해서 Storage Index가 삭제되는 것은 아니다. Storage Index를 비활성화 시켰을 뿐이지 Storage 서버는 계속해서 Storage Index를 유지 및 관리하고 있다. 



Storage Index 모니터링

DB 서버에서 ‘cell physical IO bytes saved by storage index’ 통계 정보를 통해 Storage Index 사용여부를 조회할 수 있다. 이 통계 정보는 Storage Index를 통해 Skip한 I/O 누적 값(bytes)을 나타낸다. 


다음은 v$mystats의 정보를 통해 현재 세션에서의 누적 값을 조회한 결과이다.