함수기반 인덱스
作成
·
7
0
함수기반 인덱스는 실무에서 최대한 피하는게 낫죠? 피할 수 없으면 만는거구요? ㅎㅎ
실무적인 입장을 듣고싶습니다.
クイズ
WHERE句でインデックスカラムにTRIM()関数を適用すると全テーブルスキャンが発生する理由は?
インデックスがNULL値を含まないため
関数適用によりインデックスカラムの値が変形されて
TRIM()関数がソート作業を引き起こすため
オプティマイザーがインデックスの使用を回避して
回答 2
0
안녕하세요. 질문 정말 감사드립니다.
제 생각으로 답변드리면 다음과 같습닏나.
함수기반 인덱스는 실무에서 무조건 피해야 하는 대상이라기보다는, 마지막에 꺼내는 실무 카드에 가깝다고 봅니다.
결론부터 말하면, 함수기반 인덱스를 피해야 한다기보다는 먼저 SQL을 고칠 수 있는지부터 확인하는 게 맞습니다.
예를 들어 WHERE 절에서 컬럼에 함수를 씌우고 있다면, 먼저 조건식을 함수 없이 바꿀 수 있는지, 데이터 저장 방식을 정리할 수 있는지, 일반 인덱스로 해결할 수 있는지부터 봐야 합니다.
그런데 현실적으로 SQL을 고칠 수 없는 경우도 많습니다.
대표적으로는 첫째, 레거시 코드라서 애플리케이션 SQL을 수정하기 어려운 경우입니다. 이미 여러 시스템에서 같은 SQL을 사용하고 있거나, 배포 리스크가 커서 WHERE 절을 바꾸기 어려운 상황이라면 함수기반 인덱스가 현실적인 해결책이 될 수 있습니다.
둘째, 배치성 레포트나 조회 전용에 가까운 테이블입니다. INSERT, UPDATE, DELETE가 거의 없고, 특정 조건으로 반복 조회되는 테이블이라면 함수기반 인덱스를 만들어 검색 성능을 개선하는 것이 충분히 합리적입니다.
다만 함수기반 인덱스를 만들면 DML 비용과 인덱스 관리 비용이 늘어납니다. 그래서 OLTP처럼 데이터 변경이 많은 테이블에 습관적으로 만드는 것은 조심해야 합니다.
정리하면, 함수기반 인덱스는 나쁜 인덱스가 아닙니다. 다만 먼저 SQL 수정 가능성, 데이터 정합성, 일반 인덱스 활용 가능성, DML 비용을 검토한 뒤에 사용하는 것이 좋습니다.
즉, SQL을 고칠 수 있다면 SQL부터 고치고, SQL을 고칠 수 없고 조회 성능 문제가 명확하다면 함수기반 인덱스를 만드는 것이 맞습니다. ^^
0
안녕하세요, 인프런 AI 인턴입니다. 개foot님.
함수 기반 인덱스(Function-Based Index, FBI)는 컬럼의 값이 아닌 특정 함수의 결과에 인덱스를 생성하는 방법으로, 일반적인 인덱스 사용으로는 성능을 개선할 수 없을 때 활용할 수 있습니다. 실무에서 함수 기반 인덱스를 사용하는 것은 다음과 같은 상황과 고려 사항이 있습니다:
필요성과 성능: 컬럼의 값 자체가 아닌 변환된 결과에 대한 검색이 자주 필요하다면 함수 기반 인덱스가 유용할 수 있습니다. 예를 들어, 대소문자를 무시한 검색을 자주 수행하는 시스템에서는 LOWER() 함수 기반 인덱스를 만들어 활용할 수 있습니다.
비용: 함수 기반 인덱스는 추가 저장 공간을 필요로 하고, 인덱스 작성 및 유지 보수 과정에서 추가적인 비용을 발생시킬 수 있습니다. 따라서 무분별한 사용은 피해야 하며, 반드시 성능 향상이 필요한 경우에만 사용하는 것이 좋습니다.
대안 확인: 함수 기반 인덱스를 사용하기 전에, 가능한 다른 성능 최적화 방법(쿼리 최적화, 조인 방식 개선 등)을 먼저 고려해보는 것이 좋습니다.
파티셔닝과의 상호작용: 모든 DBMS가 함수 기반 인덱스를 동일하게 지원하지 않으므로, 파티셔닝이 적용된 테이블에서는 주의해야 합니다.
데이터베이스의 운영 효율성: 인덱스는 테이블의 DML(INSERT, UPDATE, DELETE) 작업에 부하를 증가시킬 수 있기 때문에, 데이터 입력이나 수정이 빈번한 환경에서는 사용에 신중해야 합니다.
결론적으로, 함수 기반 인덱스는 성능 문제의 구체적인 원인이 파악되고, 대체할 방법이 없는 경우에만 사용하는 것이 좋습니다. 즉, 가능한 한 피하고 성능 최적화의 마지막 수단으로 보는 것이 실무적인 관점입니다.
더 많은 정보와 유사한 사례를 경험해보고 싶으시다면, 관련 질문 및 답변을 참고해 보시기 바랍니다:
- “SQL 최적화 및 인덱스 사용법 개선 팁”
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





