2025. 2. 25. 19:01ㆍIT/Oracle
스마트 스캔 기능의 직접 경로 읽기란, 데이터베이스에서 쿼리를 실행할 때, 테이블의 행(Row) 단위를 직접 접근하여 읽는 방식을 말합니다. 일반적인 인덱스 스캔(Index Scan)이나 전체 테이블 스캔(Table Full Scan)을 거치지 않고, 필요한 레코드의 물리적 주소를 정확히 알고 있는 상태에서 데이터를 빠르게 조회하는 방법입니다.
직접 경로 읽기 (Direct Path Read)란 일반적인 DB 블록 버퍼 캐시를 거치지 않고, 데이터 파일에서 바로 PGA(Private Memory)영역으로 데이터를 읽는 방식을 의미합니다. 이는 주로 대량의 데이터를 읽는 경우 효율적입니다.
즉, 스마트 스캔과 직접 경로 읽기를 결합하면, 버퍼 캐시를 우회하여 스토리지에서 바로 데이터를 읽고 필터링을 한 후, 꼭 필요한 최소한의 데이터를 DB에 전달하는 방식이 됩니다.
1. 스마트 스캔을 통한 직접 경로 읽기 예시 (Oracle Exadata 환경)
• 다음 예제는 Oracle Exadata 환경에서 스마트 스캔을 활용한 직접 경로 읽기 시나리오입니다.
① 일반 쿼리 예제
SELECT customer_id, customer_name, address
FROM customer
WHERE region = '서울';
② 스마트 스캔 + 직접 경로 읽기 시나리오
- 이 쿼리가 실행될 때 다음과 같은 순서로 동작합니다.
1. 스토리지 계층에서 데이터를 필터링 : 스토리지 계층에서 region='서울' 조건을 미리 적용하여 해당하는 레코드만을 선별적으로 읽습니다. → 디스크에서 불필요한 데이터가 DB 서버로 올라오는 것을 차단합니다.
2. 직접 경로로 DB서버로 데이터 전송 : 필터링된 데이터가 DB서버의 PGA 영역에 직접 적재됩니다. (버퍼 캐시를 우회합니다.) → 블록 버퍼 캐시의 부하가 줄고, 데이터가 곧바로 사용자에게 전달될 수 있습니다.
③ 스마트 스캔 여부 확인 방법
- 다음의 성능 뷰로 확인 가능합니다
SELECT event, total_waits, time_waited
FROM v$session_event
WHERE event LIKE '%direct path read%';
- 스마트 스캔을 통해 최적화된 경우, 대량의 데이터를 빠르게 처리하는 동시에 DB서버로의 데이터 이동이 최소화되는 것을 확인할 수 있습니다.
- 스마트 스캔 활용 확인 예시 쿼리
✔︎ cell smart table scan: 스마트 스캔이 실제 적용되었는지 여부 확인
✔︎ direct path read: 직접 경로 읽기 방식으로 수행되었는지 여부 확인
SELECT sql_id, event, total_waits, time_waited_micro/1000000 AS time_waited_sec
FROM v$session_event
WHERE event IN ('cell smart table scan', 'direct path read');
2. 스마트 스캔 + 직접 경로 읽기 구체적 사례 2
• 상황 예시: 데이터베이스에 SALES라는 테이블이 있습니다. 이 테이블에는 10년간 축적된 약 100억 건의 매출 데이터가 있습니다.
이 중에서 특정 날짜의 매출 내역만 찾고 싶다고 가정합니다.
• 예시 테이블 구조
SALES (
sale_id NUMBER, -- 판매번호
sale_date DATE, -- 판매날짜
product_id NUMBER, -- 제품번호
amount NUMBER, -- 판매금액
region VARCHAR2(20) -- 판매지역
)
• 일반적인 전체 테이블 스캔 방식 (비효율적)
SELECT sale_id, amount, region
FROM SALES
WHERE sale_date = TO_DATE('2024-02-01', 'YYYY-MM-DD');
- DB서버는 테이블 전체 블록(100억 건)을 버퍼 캐시로 읽습니다.
- 모든 블록을 DB 서버로 전송하여 조건(sale_date)을 만족하는 데이터를 찾습니다.
- 메모리, I/O, CPU 비용이 매우 높고 성능이 저하될 수 있습니다.
• 스마트 스캔을 활용한 직접 경로 읽기 방식 (효율적)
- 같은 쿼리가 스마트 스캔 및 직접 경로 읽기를 활용하면 이렇게 수행됩니다.
- 실행 흐름 설명
단계 | 내용 |
Step 1: 스마트 스캔 | - Exadata 스토리지 계층(혹은 스마트 스토리지 장비)이 조건절인 sale_date = '2024-02-01'를 미리 판단합니다. - 즉, DB서버에 보내기 전에 이미 조건에 맞는 블록만 골라내어 불필요한 데이터를 제거합니다. |
Step 2: 직접 경로 읽기 | - 필터링되어 축소된 데이터를 버퍼 캐시를 통하지 않고, DB 서버의 PGA 메모리로 바로 전달합니다. |
Step 3: DB 서버에서 최종 데이터 가공 및 전달 | - PGA 메모리로 받은 최소한의 데이터를 처리하여 최종적으로 사용자에게 빠르게 결과를 반환합니다. |
스마트 스캔은 보통 다음과 같은 경우 활성화됩니다.
• 쿼리가 전체 또는 많은 데이터에 접근하는 Full Table Scan (전체 테이블 스캔) 또는 Full Index Scan (전체 인덱스 스캔) 을 수행할 때
• 데이터베이스가 스토리지와 협력하여 불필요한 데이터를 필터링할 수 있을 때 (Oracle Exadata 환경 등)
즉, 스마트 스캔은 전체 범위를 스캔하면서 조건에 따라 필터링하는 방식에 최적화되어 있습니다.
또한, 인덱스 힌트를 주면, 데이터베이스는 테이블 전체를 스캔하는 대신 인덱스를 통해 특정 레코드에 빠르게 접근하는 경로를 선택하게 됩니다. 이러한 방식은 보통 랜덤 I/O 형태이며, 이미 데이터 위치를 빠르게 찾기 때문에 스마트 스캔처럼 스토리지 계층에서 추가적으로 필터링할 필요가 없습니다.
결국, 인덱스 경로로 접근하면 스마트 스캔의 이점인 대량의 데이터를 조건에 따라 미리 필터링하여 DB서버로 전달하는 과정이 없어집니다.
스마트 스캔 (인덱스 힌트 없음)
• 조건에 맞는 데이터를 스토리지에서 직접 필터링한 뒤 DB서버에 전달(스마트 스캔)
• 전체 데이터 중 필요한 데이터만 빠르게 PGA로 전달(Direct Path Read)
SELECT *
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-02-01';
인덱스 힌트 (스마트 스캔 X)
• 명시된 인덱스(idx_sales_date)를 통해 빠르게 데이터를 찾아서 랜덤 I/O 방식으로 데이터를 읽음.
• 스마트 스캔은 수행되지 않으며 일반적인 인덱스 경로 스캔으로 처리.
SELECT /*+ INDEX(sales idx_sales_date) */ *
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-02-01';
관련 블로그
오라클 - 스마트 스캔
오라클 엑사데이터의 스마트 스캔(Smart Scan) 기능은 Exadata의 핵심 성능 향상 기술 중 하나로, 데이터베이스 서버의 작업 부하를 스토리지 레벨에서 처리하여 성능을 크게 향상시키는 기술입니다.
make2t.tistory.com
'IT > Oracle' 카테고리의 다른 글
ORA-12547 : TNS:lost contact 에러 원인 및 해결 방법 (2) | 2025.02.27 |
---|---|
데이터베이스의 병행 제어(Concurrency Control) (0) | 2025.02.26 |
Oracle 19c - JSON 활용 방법 (1) | 2025.02.25 |
오라클 프로시저 상태 조회 (0) | 2025.02.25 |
병합 조인(Cartesian Join) 비용 증가 (1) | 2025.02.24 |