SQL 캠프 광고 이미지
  • SQL

연산 결과에 인덱스 걸기 (Indexes on Expressions)

    Contents

SQL 캠프 광고 이미지
SQL 캠프 광고 이미지
 
인덱스 열은 기초 테이블의 컬럼일 필요는 없습니다. 테이블의 하나 이상의 열에서 계산된 함수나 스칼라 표현식일 수도 있습니다. 이 기능은 계산 결과를 기반으로 테이블에 빠르게 액세스하는 데 유용합니다.
 
예를 들어, 대소문자를 구분하지 않고 문자열 비교를 하고 싶을 때 LOWER() 함수를 일반적으로 사용하는데요.
 
아래와 같이 LOWER(col1) 연산의 결과로 인덱스를 정의할 수 있습니다.
 
이 인덱스를 UNIQUE로 선언하면 col1 값이 대소문자 상관 없이 유일해야 한다는 제약 조건이 됩니다. 따라서 표현식에 인덱스를 거능 이 기능은 단순한 고유 제약 조건으로 정의할 수 없는 제약 조건을 적용하는 데 사용할 수도 있습니다.
 
또 다른 예로 다음과 같이 성과 이름을 붙여서 쿼리를 자주 수행하는 경우를 생각해볼 수 있습니다.
 
이런 경우 아래와 같은 인덱스를 만드는 것이 좋습니다.
 
두 번째 예시와 같은 CREATE INDEX 구문은 인덱스 표현식 주위에 괄호’( )’를 써야 합니다. 첫 번째 예에서처럼 표현식이 함수 호출일 때는 괄호를 생략할 수 있습니다.
인덱스 표현식은 유지 관리 비용이 상대적으로 많이 듭니다. 하지만 이미 계산된 결과가 인덱스에 저장되어 있기 때문에 인덱스 검색 중에는 저장 된 값을 가져다가 사용하기만 하면 됩니다. 위의 두 예에서 시스템은 쿼리를 WHERE indexedcolumn = '상수'로 간주하므로 검색 속도는 다른 간단한 인덱스 쿼리와 동일합니다. 따라서 식에 대한 인덱스는 삽입 및 업데이트 속도보다 검색 속도가 더 중요한 경우에 유용합니다.
 
 
✍🏻
Editor 선미’s comment
이 글의 원문은 PostgreSQL 공식문서 “Chapter 11. Indexes - 11.7. Indexes on Expressions”입니다. PostgreSQL 버전 16을 기준으로 작성되었습니다.
표현식을 저장하는 인덱스의 유지 관리 비용이 단순 컬럼 값을 저장하는 인덱스보다 상대적으로 높은데요. 원인에 대해서 좀 더 알고 싶다면 원문을 참고해주세요. 데이터 모델링을 할 때 위의 성과 이름 예시처럼 따로 또 같이 봐야하는 데이터를 어떻게 저장해야할지 고민이 될 때가 있는데, Indexes on Expressions을 활용하는 것도 하나의 옵션이 될 수 있겠네요.
이 번역 작업이 여러분이 인덱스에 대해 공부하는데 도움이 되었으면 좋겠습니다. PostgreSQL 공식 문서가 인덱스에 대해 잘 쓰여져 있어 이전부터 번역을 꼭 해오고 싶었는데요. 흔쾌히 허가해주신 PostgreSQL CoC(Code of Conduct)팀 감사합니다. 이해를 돕기 위해 역자의 의역이 섞여있으니 만약 번역과 원문 간에 차이가 있는 경우 원문을 우선적으로 생각해주세요. 번역 오류는 contact@datarian.io로 제보해주세요.
PostgreSQLPostgreSQL 공식 문서

The World's Most Advanced Open Source Relational Database

함께 읽어보면 좋은 글

주식회사 데이터리안