SQL 캠프 광고 이미지
  • SQL

인덱스 조합 기능 (Combining Multiple Indexes)

    Contents

SQL 캠프 광고 이미지
SQL 캠프 광고 이미지
 
단일 인덱스 스캔은 인덱스의 컬럼을 인덱스에서 지원하는 연산자와 함께 사용하고, AND로 조인되는 쿼리 절에서만 사용할 수 있습니다. 예를 들어, (a, b)에 대한 인덱스가 있을 때 WHERE a = 5 AND b = 6과 같은 쿼리 조건은 인덱스를 사용할 수 있지만, WHERE a = 5 OR b = 6과 같은 쿼리는 인덱스를 사용할 수 없습니다.
다행히도 PostgreSQL은 여러 인덱스를 결합하여(동일한 인덱스를 여러번 사용하는 것을 포함) 단일 인덱스 스캔으로는 구현할 수 없는 경우를 처리할 수 있는 기능을 갖추고 있습니다. 시스템은 여러 인덱스 스캔에 걸쳐 ANDOR 조건을 구성할 수 있습니다. 예를 들어, WHERE x = 42 OR x = 47 OR x = 53 OR x = 99와 같은 쿼리는 각 쿼리 절 중 하나를 사용하여 x에 대한 인덱스를 네 개의 개별 스캔으로 세분화할 수 있습니다. 그런 다음 이러한 스캔의 결과를 함께 OR로 연결하여 최종 결과를 생성합니다. (*역자주: x의 인덱스를 이용하여 x = 42, x = 47, x = 53, x = 99를 각각 스캔하고 스캔 결과를 OR로 연결하는 것을 의미합니다.)또 다른 예로, xy에 별도의 인덱스가 있는 경우, WHERE x = 5 AND y = 6과 같은 쿼리를 구현하는 한 가지 방법은 각 인덱스에 적절한 쿼리 절을 사용한 다음 인덱스 결과를 함께 AND하여 결과 행을 식별하는 것입니다.
여러 인덱스를 결합하기 위해 시스템은 필요한 각 인덱스를 스캔하고 해당 인덱스의 조건과 일치하는 것으로 보고된 테이블 행의 위치를 제공하는 비트맵을 메모리에 준비합니다. 그런 다음 쿼리에서 필요에 따라 비트맵을 ANDOR로 결합합니다. 마지막으로 실제 테이블에 있는 데이터를 가지고 옵니다. 테이블에 들어있는 데이터에는 물리적인 순서대로 접근하기 때문에, 이는 원래 인덱스의 순서가 손실된다는 것을 의미합니다. 쿼리에 ORDER BY 절이 있는 경우 별도의 정렬이 필요합니다. (*역자주: 인덱스를 이용해 ORDER BY 연산을 생략하는 케이스가 궁금하다면 이전 글을 확인해 주세요.) 이렇게 인덱스 스캔을 추가할 때마다 시간이 추가되기 때문에, 플래너는 때때로 사용할 수 있는 추가 인덱스가 있음에도 불구하고 단순 인덱스 스캔을 사용하기로 선택합니다.
데이터베이스 개발자는 다양한 상황을 고려하여 어떤 인덱스를 제공할지 결정해야 합니다. 멀티 컬럼 인덱스가 좋을 때도 있고, 별도의 인덱스를 생성하고 인덱스 조합 기능을 사용하는 것이 더 나은 상황도 있습니다. 예를 들어, 자주 실행되는 쿼리에 때로는 x 컬럼만, 때로는 y 컬럼만, 때로는 두 컬럼을 모두 포함하는 쿼리가 혼합되어 있는 경우 xy에 대해 두 개의 개별 인덱스를 생성하고, 두 컬럼을 모두 사용하는 쿼리는 인덱스 조합 기능이 처리하도록 하는 것이 효율적일 수 있습니다. 또한 (x, y)에 멀티 컬럼 인덱스를 만들 수도 있습니다. 이 인덱스는 일반적으로 두 열을 모두 포함하는 쿼리에는 인덱스 조합보다 더 효율적이지만 멀티 컬럼 인덱스에서 설명한 것처럼 y만 포함하는 쿼리에는 거의 쓸모가 없습니다. 이런 경우 멀티 컬럼 인덱스와 y에 대한 별도의 인덱스가 둘 다 있다면 상당히 잘 작동할 것입니다. x만 포함하는 쿼리의 경우 멀티 컬럼 인덱스를 사용할 수 있지만, 이 경우 x에 대한 인덱스만 사용하는 것보다 인덱스의 크기가 더 크기 때문에 속도가 느려질 수 있습니다. 마지막 대안은 세 가지 인덱스를 모두 생성하는 것이지만, 테이블이 업데이트되는 빈도보다 검색 쿼리가 실행되는 빈도가 훨씬 높고(*역자주: INSERT, UPDATE, DELETE 보다 SELECT 쿼리가 많을 때를 의미합니다.) 세 가지 유형의 쿼리가 모두 많이 실행되는 경우에만 합리적입니다. 쿼리 유형 중 하나가 다른 유형보다 훨씬 덜 실행되는 경우 가장 자주 실행되는 유형과 일치하는 두 개의 인덱스만 생성하는 것이 좋습니다.
 
 
✍🏻
Editor 선미’s comment
이 글의 원문은 PostgreSQL 공식문서 “Chapter 11. Indexes - 11.5. Combining Multiple Indexes”입니다. PostgreSQL 버전 16을 기준으로 작성되었습니다.
멀티 컬럼 인덱스와 인덱스 조합 기능을 잘 구분하여 이해해주세요!
이 번역 작업이 여러분이 인덱스에 대해 공부하는데 도움이 되었으면 좋겠습니다. PostgreSQL 공식 문서가 인덱스에 대해 잘 쓰여져 있어 이전부터 번역을 꼭 해오고 싶었는데요. 흔쾌히 허가해주신 PostgreSQL CoC(Code of Conduct)팀 감사합니다. 이해를 돕기 위해 역자의 의역이 섞여있으니 만약 번역과 원문 간에 차이가 있는 경우 원문을 우선적으로 생각해주세요. 번역 오류는 contact@datarian.io로 제보해주세요.
PostgreSQLPostgreSQL 공식 문서

The World's Most Advanced Open Source Relational Database

함께 읽어보면 좋은 글

주식회사 데이터리안