인덱스 온리 스캔(Index Only Scan)
인덱스 온리 스캔(Index Only Scan)은 인덱스 스캔과 유사하지만, 테이블 데이터 대신 인덱스로부터 직접 데이터를 가져옵니다. 따라서 테이블 데이터에 대한 접근이 필요 없으므로, 더 빠른 쿼리 실행 속도를 제공합니다.
인덱스 온리 스캔을 사용한다는 것은 데이터베이스가 쿼리의 결과를 인덱스만으로 만들어내기 때문에 "인덱스만 스캔한다."라고 표현할 수 있습니다.
테이블 예제
테스트를 위해서 테이블은 다음과 같이 작성했습니다.
CREATE TABLE books_test
(
books_id INTEGER NOT NULL PRIMARY KEY ,
books_title VARCHAR ,
books_price INTEGER ,
books_link VARCHAR ,
books_pub TIMESTAMP ,
books_reg TIMESTAMP
);
인덱스 온리 스캔을 사용하려면 두 가지 주요 제한 사항이 있습니다. 첫째, 사용하는 인덱스 유형이 인덱스 온리 스캔을 지원해야 합니다. 보통 b-tree 인덱스 유형은 이를 지원합니다. 둘째, 쿼리에서 선택하는 컬럼들이 모두 인덱스에 포함되어 있어야 합니다. 즉 쿼리는 인덱스의 컬럼들만을 필요로 하며, 그렇지 않으면 인덱스 온리 스캔을 사용할 수 없습니다.
인덱스 설정
CREATE INDEX books_price_idx ON books_test (books_price , books_pub);
인덱스 온리 스캔 예시 쿼리
SELECT
books_price, books_pub
FROM
books_test bt
WHERE
books_price < 25000
AND books_pub BETWEEN CURRENT_TIMESTAMP - INTERVAL '3 months' AND CURRENT_TIMESTAMP;
인덱스가 걸려 있는 "books_price"와 "books_pub"을 조건을 걸어서,
인덱스가 걸려 있는 컬럼만 조회를 해보니 인덱스 온리 스캔이 잘 작동됩니다.
그렇다면 이 상태에서 인덱스가 걸려 있지 않은 칼럼도 함께 조회를 하면 어떻게 될까요? 🤔🤔
인덱스 온리 스캔이 적용되지 않는 경우
인덱스에 걸지 않은 컬럼을 하나만 추가했을 뿐인데, 바로 인덱스 온리 스캔이 작동되지 않습니다.
EXPLAIN
SELECT
books_price, books_pub, books_title
FROM
books_test bt
WHERE
books_price < 25000
AND books_pub BETWEEN CURRENT_TIMESTAMP - INTERVAL '3 months' AND CURRENT_TIMESTAMP;
인덱스 온리 스캔은 선택한 컬럼이 모두 인덱스에 포함되어 있을 때, 테이블에 대한 접근 없이 인덱스만으로 쿼리 결과를 생성하여 쿼리 실행 속도를 향상합니다. 이는 디스크 I/O를 줄여서 전체적인 성능을 향상하는데 도움이 됩니다. 특히 대량의 데이터를 처리하는 OLAP 환경에서 유용하며, 효율적인 인덱스 설계를 통해 데이터베이스 성능을 최적화할 수 있습니다.
'RDMS > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 해시 인덱스(Hash Index)에 대해서 - 컴도리돌이 (0) | 2024.08.28 |
---|---|
[PostgreSQL] B-tree index에 대해서 - 컴도리돌이 (2) | 2024.03.28 |
[PostgreSQL] Foreign Key (외래키, 관계 테이블) - 컴도리돌이 (2) | 2024.02.22 |
[PostgreSQL] 날짜 형식 검증 함수 - 컴도리돌이 (0) | 2024.01.18 |
[PostgreSQL] NLP 자연어 기반 구문 검색[Full-Text Search] - 컴도리돌이 (0) | 2024.01.17 |