오라클의 테이블/로우체이닝/로우 마이그레이션

반응형
728x90
반응형

오브젝트의 종류

종류 개요
테이블 (Table) 로우(행)과 컬럼(열)으로 구성된 표 형식의 오브젝트
인덱스 (Index) 테이블 안의 데이터에 효율적으로 접근하기위한 보조역할을 하는 오브젝트
뷰 (View) 테이블 또는 다른 뷰를 기반으로 생성된 가상 테이블
머티리얼라이즈드 뷰 (materialized view) 실체를 가진 뷰
시노님 (Synonym) 오브젝트에 지정할 수 있는 별칭
시퀀스 (Sequence) 연속된 숫자를 생성하는 오브젝트

 

 

 

테이블에 대하여 알아보자

테이블이란, 로우(행)과 컬럼(열)으로 구성된 표 형식의 오브젝트로 데이터를 보관하는 역할을 한다. 데이터베이스 내에 생성할 수 있는 테이블의 수는 제한이 없으며, 물리적인 제약이 없는 한 얼마든지 생성할 수 있다.

 

컬럼럼명 : 테이블 안의 컬럼을 식별하기 위한 이름이다. 컬럼은 최대 1,000개까지 생성 가능하다.
데이터 타입 : 칼럼에 저장할 수 있는 데이터의 종류를 말한다.

 

 

 

로우 저장 방식이란 무엇인가 ?

테이블의 로우는 테이블이 저장되는 테이블 스페이스를 구성하는 데이터 파일의 블록에 저장된다. 로우를 입력하는 처리 (데이터 insert) 를 수행하면, 블록의 데이터 저장 영역 중 밑단 부분부터 데이터를 저장한다. 일반적으로 여러 로우를 하나의 블록에 저장한다. 오라클은 로우 데이터를 데이터 저장 영역이 가득찰 때까지 집어넣지는 않는다. PCTFREE와 PCTUSED라는 두가지 파라미터를 이용하여 데이터 저장용 영역을 관리한다.

 

 

 

PCTFREE / PCTUSED

PCTFREE 파라미터는 테이블마다 설정할 수 있다. 오라클은 블록 안의 빈 공간이 PCTFREE 에 설정한 비율을 넘어가면 새로운 데이터를 입력하는 것을 멈추고 다른 블록에 데이터를 입력하기 시작한다. 하지만, 블록이 가득 찼다고 해서 앞으로 새로운 데이터를 입력하지 않는 것은 아니다. 블록 안의 빈 공간이 데이터의 삭제나 변경 작업으로 인해 늘어나면 다시 데이터를 입력하기 시작한다. 빈 공간이 얼마나 늘어나야 데이터를 다시 입력할 수 있는지는 테이블이 저장되어있는 테이블 스페이스의 세그먼트 공간 관리 방식에 따라 다르다.

 

오라클의 세그먼트 빈 공간 관리 방식에는 FLM (Free List Management)와 ASSM (Automatic Segment Space Management) 의 두가지 종류가 있다.

 

세그먼트 공간 관리 방식 데이터를 입력할 수 있는 조건
FLM (Free List Management) 테이블 스페이스가 'FLM' 일때, 테이블에 'PCDUSED' 파라미터를 설정하고 브록의 사용률이 PCTUSED 보다 아래로 내려가면 데이터를 입력할 수 있게된다. 
'PCDUSED' 에는 'PCTFREE' 보다 작은 값을 설정해야한다.
SEGMENT SPACE MANAGEMENT 절에 'MANUAL' 로 지정한다.


오라클 9i ~ 오라클 10g R1 까지의 기본 관리 방식이다.
ASSM (Automatic Segment Space Management) 테이블 스페이스가 'ASSM' 일때, 데이터를 입력할 수 있는지 여부는 오라클이 자동으로 판단한다.
오라클은 'PCTUSED'를 설정했더라도 무시한다.
SEGMENT SPACE MANAGEMENT 절에 'AUTO' 로 지정한다.


오라클 10g R2 이후의 기본 관리 방식이다.

 

테이블 스페이스의 세그먼트 공간 관리 방식을 확인해보자.

SELECT tablespace_name,
       segment_space_management
FROM DBA_TABLESPACES;

 

 

 

로우 마이그레이션이란 무엇인가 ?

PCTFREE를 설정해 블록에 빈 공간을 마련해두는 이유는 UPDATE 문 수행 등으로 인해 데이터가 변경되 로우의 크기가 커질 수 있기 때문이다. 이때 데이터가 블록의 빈 공간에 들어갈 수 없을정도로 커지면, ‘로우 마이그레이션’ 이 발생한다.로우 마이그레이션이 발생하면, 변경으로 인해 증가한 데이터 뿐만 아니라 전체 로우의 데이터가 다른 블록으로 복사된다. 해당 로우의 위치를 갖고있는 인덱스 등의 모든 오브젝트를 변경해야하는 일이 생기므로 원래의 블록에 새로 복사된 위치의 포인터를 남긴다.

 

로우 마이그레이션이 발생한 로우의 데이터를 읽어오기 위해서는 ‘로우의 포인터가 저장돼있는 블록’과 ‘로우의 데이터가 저장돼있는 블록’을 둘 다 읽어와야한다. 따라서 ‘로우 마이그레이션이 발생하지 않은 블록’ 을 읽어올때 보다 성능이 저하된다. 해결방안은, PCTFREE 를 좀더 크게 설정하고 로우 마이그레이션의 발생을 억제하는 것이다.

 

 

 

 

로우체이닝

로우 체이닝이란, 한 로우의 데이터 크기가 블록의 데이터 저장 공간보다 클때 발생하는 현상이다. 데이터 크기가 블록의 데이터 저장공간보다 클때 한 로우를 여러개의 조각으로 분리하고 각 조각을 다른 블록에 저장한다.

 

 

 

로우 마이그레이션과 로우 체이닝을 확인하는 방법

로우 마이그레이션과 로우 체이닝이 얼마나 발생했는지 확인하기 위해서는 대상 테이블에 ANALYZE COMPUTE STATISTICS문을 수행한 후 DBA_TABLES 뷰나 USER_TABLES 뷰의 CHAIN_CNT 칼럼에서 확인할 수 있다. 로우 마이그레이션과 로우 체이닝의 발생 수를 따로따로 확인할 수 없다.

 

  • 로우 마이그레이션과 로우 체이닝의 확인
SELECT TABLE_NAME,
       CHAIN_CNT
FROM USER_TABLES
WHERE TABLE_NAME = <테이블명>;

 

  • 로우 마이그레이션 / 로우 체이닝이 발생한 로우를 확인
SELECT owner_name,
       table_name,
       head_rowid
FROM CHAINED_ROWS;

 

 

 

로우 저장블록과 ROWID

로우는 특정한 순서를 갖고 블록에 저장되는 것이 아니라 임의대로 나뉘어 저장된다. 따라서 ORDER BY 절을 지정하지 않고 SELECT 문을 수행하면 쿼리의 결과는 정렬되지않은 데이터가 나온다. 오라클은 로우의 칼럼 값과 로우가 저장되는 블록과의 연관 관계에 대한 명확한 룰이 없다. 해당 로우의 ROWID를 알고 있을때 로우가 저장돼있는 블록을 특정해낼 수 있다.

 

ROWID란, 로우의 물리적인 위치를 표시하는 특수한 식별자이다.
ROWID는 로우의 칼럼 값이 아닌 수도(preudo) 칼럼으로, SELECT 문에 ROWID를 추가해 조회할 수 있다.

ROWID = 파일번호 + 블록번호 + 로우번호 + 보조정보

 

  • (1) 데이터 조회
SELECT rowid, empno from emp;

 

  • (2) ROWID 를 조건문으로 검색
select rowid, empno from emp where rowid = 'rowid명'

 

검색 조건에 ROWID 를 지정해 로우에 접근하는 방법은 오라클이 제공해주는 로우에 접근하는 방법 중 가장 빠다.ROWID는 로우의 칼럼 값이 아닌 로우의 물리적인 위치에서 도출된 정보이므로, 로우의 물리적인 위치가 바뀌면 ROWID도 변경되므로 ROWID를 이용한 쿼리는 실행할 때 로우의 물리적인 위치가 변경되지 않았다는 확신이 있을때만 사용해야 한다.

 

 

 

** 참고문서

- '전문가를 위한 오라클 아키텍처 입문' 교재

 

반응형

Designed by JB FACTORY