INDEXED BY 절
INDEXED BY 절
이 페이지에서는 SQLite의 INDEXED BY 절에 대해 설명해요. INDEXED BY 절은 SELECT, UPDATE, DELETE 문에서 특정 인덱스를 강제로 사용하도록 지정하는 구문이에요. 쿼리 최적화 프로그램이 자동으로 선택한 인덱스 대신 사용자가 원하는 인덱스를 사용하게 할 수 있어요.
출처: 문서
본문
qualified-table-name:
schema-name . table-name AS alias INDEXED BY index-name NOT INDEXED
INDEXED BY index-name 구문은 지정된 인덱스를 반드시 사용해서 앞의 테이블에서 값을 조회해야 한다는 것을 지정해요. index-name이 존재하지 않거나 쿼리에 사용할 수 없다면 SQL 문 준비가 실패해요. NOT INDEXED 절은 앞의 테이블에 접근할 때 UNIQUE 및 PRIMARY KEY 제약 조건으로 만들어진 암시적 인덱스를 포함해 어떤 인덱스도 사용하지 않도록 지정해요. 하지만 NOT INDEXED가 지정된 경우에도 rowid를 사용해 항목을 조회하는 것은 가능해요.
일부 SQL 데이터베이스 엔진은 특정 문에 대해 쿼리 최적화 프로그램이 어떤 인덱스를 사용해야 할지에 대한 단서를 제공하는 비표준 "힌트" 메커니즘을 제공해요. SQLite의 INDEXED BY 절은 힌트 메커니즘이 아니며 그런 용도로 사용되어서도 안 돼요. INDEXED BY 절은 어떤 인덱스를 사용할지에 대한 힌트를 주는 것이 아니라, 어떤 인덱스를 사용해야 하는지에 대한 요구 사항을 주는 거예요. 쿼리 최적화 프로그램이 INDEXED BY 절에 지정된 인덱스를 사용할 수 없으면 쿼리는 오류와 함께 실패해요.
INDEXED BY 절은 쿼리 성능을 튜닝하기 위한 목적이 아니에요. INDEXED BY 절의 의도는 인덱스를 삭제하거나 생성하는 등의 스키마 변경으로 인해 시간에 민감한 쿼리의 쿼리 계획이 바뀌면 런타임 오류를 발생시키는 것이에요. INDEXED BY 절은 회귀 테스트 중 바람직하지 않은 쿼리 계획 변경을 감지하는 데 도움을 주도록 설계되었어요. 애플리케이션 개발자는 애플리케이션 설계, 구현, 테스트 및 튜닝 과정에서 INDEXED BY 사용을 모두 생략하는 것이 좋아요. 만약 INDEXED BY를 사용해야 한다면 개발 프로세스의 맨 마지막에 설계를 "확정"할 때 삽입해야 해요.
2. 참고 자료
-
쿼리 플래너 체크리스트는 애플리케이션 개발자가 쿼리 플래너 문제를 해결하기 위해 따라야 할 단계를 설명해요.
INDEXED BY사용은 최후의 수단이며 다른 모든 조치가 실패했을 때만 사용해야 한다는 점에 유의하세요. -
단항
+연산자는 WHERE 절의 특정 조건을 인덱스 사용 대상에서 제외하는 데 사용할 수 있어요. 단항+를 신중하게 사용하면 쿼리 플래너를 하나의 특정 인덱스로 제한하지 않으면서도 좋지 않은 인덱스를 선택하지 못하게 막는 데 도움이 될 수 있어요. 단항+연산자를 신중히 배치하는 것은 쿼리가 사용하는 인덱스를 제어하는 더 나은 방법이에요. -
sqlite3_stmt_status()C/C++ 인터페이스는SQLITE_STMTSTATUS_FULLSCAN_STEP및SQLITE_STMTSTATUS_SORT동사와 함께 사용하여 SQL 문이 인덱스를 효과적으로 사용하지 못하는 시점을 런타임에 감지할 수 있어요. 많은 애플리케이션은 여기에 설명된INDEXED BY구문보다sqlite3_stmt_status()인터페이스를 사용해 인덱스 오용을 감지하는 것을 선호할 수 있어요.
이 페이지는 2025-07-12 15:11:36Z에 마지막으로 업데이트되었어요.