인덱스 열은 기초 테이블의 컬럼일 필요는 없습니다. 테이블의 하나 이상의 열에서 계산된 함수나 스칼라 표현식일 수도 있습니다. 이 기능은 계산 결과를 기반으로 테이블에 빠르게 액세스하는 데 유용합니다.
예를 들어, 대소문자를 구분하지 않고 문자열 비교를 하고 싶을 때
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로 제보해주세요.