본문 바로가기

RDMS/PostgreSQL

[PostgreSQL] 인덱스 온리 스캔(index only scan)에 대해서 - 컴도리돌이

728x90
728x90

인덱스 온리 스캔(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 환경에서 유용하며, 효율적인 인덱스 설계를 통해 데이터베이스 성능을 최적화할 수 있습니다.

 


 

 

728x90
728x90