ROWID 및 확장 ROWID를 활용한 Oracle 데이터베이스 튜닝
Oracle 데이터베이스에서 데이터 액세스 성능을 최적화하는 방법 중 하나는 ROWID와 확장 ROWID를 이해하고 활용하는 것입니다. ROWID는 테이블 내의 특정 행의 주소를 나타내는 고유한 식별자이며, 이를 통해 데이터베이스는 매우 빠르게 특정 행에 접근할 수 있습니다.
ROWID란 무엇인가?
ROWID는 Oracle 데이터베이스에서 각 행에 할당되는 물리적 주소입니다. 이는 특정 테이블 내에서 각 행을 고유하게 식별하는 데 사용됩니다. ROWID는 데이터 파일 번호, 블록 번호, 그리고 해당 블록 내의 행 번호를 포함합니다. 따라서, ROWID를 알고 있다면 데이터베이스는 해당 행을 테이블 전체를 스캔하지 않고도 직접 찾아낼 수 있습니다.
ROWID는 다음과 같은 형식으로 표현됩니다:
OOOOOOO.FFFF.RRR
OOOOOOO
: 데이터 객체 번호FFFF
: 데이터 파일 번호RRR
: 데이터 블록 내의 행 번호
확장 ROWID
파티셔닝된 테이블이나 인덱스 구성 테이블과 같은 특정 유형의 테이블에서는 표준 ROWID 형식이 충분하지 않을 수 있습니다. 이러한 경우, Oracle은 확장 ROWID를 사용합니다. 확장 ROWID에는 객체 번호, 데이터 파일 번호, 블록 번호, 행 번호 뿐만 아니라 파티션 정보도 포함됩니다.
ROWID 활용 방법
- 직접 행 액세스: ROWID를 사용하여 특정 행에 직접 액세스할 수 있습니다. 이는 특히 애플리케이션에서 특정 행을 빠르게 검색해야 할 때 유용합니다.
- 성능 튜닝: 쿼리 성능을 분석할 때, ROWID를 통해 특정 행에 액세스하는 데 필요한 시간을 측정하고, 이를 바탕으로 액세스 경로를 최적화할 수 있습니다.
- 데이터 무결성 검사: ROWID를 사용하여 데이터의 물리적 위치를 확인하고, 데이터 손상 여부를 검사할 수 있습니다.
ROWID를 활용한 쿼리 예제
다음은 ROWID를 사용하여 특정 행을 선택하는 간단한 쿼리 예제입니다.
SELECT *
FROM employees
WHERE ROWID = 'AAARv9AAEAAAARRABq';
이 쿼리는 employees
테이블에서 ROWID가 'AAARv9AAEAAAARRABq'
인 행을 선택합니다.
ROWID를 이용한 성능 튜닝 예제
ROWID를 사용하여 쿼리 성능을 튜닝하는 방법은 다음과 같습니다.
먼저, EXPLAIN PLAN
명령어를 사용하여 쿼리 실행 계획을 확인합니다.
EXPLAIN PLAN FOR
SELECT * FROM employees
WHERE employee_id = 100;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
실행 계획에서 테이블 전체 스캔(Full Table Scan)이 발생하는 경우, 인덱스를 생성하여 ROWID를 활용한 인덱스 검색(Index Range Scan)으로 변경할 수 있습니다.
CREATE INDEX idx_employee_id ON employees (employee_id);
인덱스 생성 후, 동일한 쿼리의 실행 계획을 다시 확인하면, 인덱스를 사용한 검색으로 변경되었음을 확인할 수 있습니다.
확장 ROWID를 이용한 파티션 테이블 액세스 예제
파티셔닝된 테이블의 특정 파티션에 있는 행에 액세스하는 방법을 보여주는 예제입니다.
SELECT *
FROM sales
WHERE ROWID = 'EAAR8p9AAaADFHAAB';
확장 ROWID는 파티션 정보와 함께 물리적 주소를 제공하므로, 데이터베이스는 해당 파티션만 스캔하여 매우 효율적인 액세스를 수행할 수 있습니다.
ROWID 사용 시 주의사항
- ROWID는 영구적인 주소가 아닐 수 있습니다. 테이블 재구성(예: 테이블 이동, 파티션 재분할) 후에는 ROWID가 변경될 수 있습니다.
- ROWID는 특정 데이터베이스 인스턴스 내에서만 유효합니다. 따라서, 다른 데이터베이스 인스턴스에서는 사용할 수 없습니다.
- 확장 ROWID는 표준 ROWID보다 더 많은 저장 공간을 필요로 합니다.
결론
ROWID와 확장 ROWID는 Oracle 데이터베이스에서 데이터 액세스 성능을 향상시키는 강력한 도구입니다. ROWID의 개념을 제대로 이해하고 활용함으로써, 쿼리 성능을 최적화하고 데이터 무결성을 유지하는 데 기여할 수 있습니다. 하지만, ROWID는 영구적인 주소가 아니므로, 테이블 재구성 후에는 변경될 수 있다는 점을 반드시 고려해야 합니다.