CONCAT 함수가 인덱스를 사용할 수 있는지는 데이터베이스 엔진과 쿼리의 구조에 따라 다릅니다.
일반적으로, SQL에서 함수(예: CONCAT)를 사용하는 경우, 인덱스를 제대로 사용할 수 없을 가능성이 큽니다.
이유는 함수가 적용된 컬럼 값이 가공된 상태로 처리되기 때문에, 기존 인덱스와 일치하지 않기 때문입니다.
(1) 단순 CONCAT가 WHERE 조건에 사용된 경우
SELECT *
FROM my_table
WHERE CONCAT(col1, col2) = 'value';=
• 이 경우, CONCAT(col1, col2)는 함수 기반 처리가 되므로, 일반적인 B-tree 인덱스는 활용되지 않습니다.
(2) CONCAT 결과가 SELECT에서만 사용된 경우
SELECT CONCAT(col1, col2) AS full_name
FROM my_table
WHERE col1 = 'value';
• 여기서는 WHERE col1 = 'value' 조건이 인덱스를 활용할 수 있습니다.
• CONCAT은 단순히 결과 반환용으로 사용되므로 인덱스에 영향을 주지 않습니다.
함수를 사용하면서도 인덱스를 활용하려면 함수와 인덱스를 함께 사용하려면 다음 중 하나를 고려해야 합니다:
(1) 함수 기반 인덱스 (Function-Based Index) 생성
• 데이터베이스에 함수 기반 인덱스를 생성하면 가능합니다.
• 예를 들어 이 인덱스를 생성한 후, 아래 쿼리에서 인덱스를 활용할 수 있습니다:
CREATE INDEX idx_concat ON my_table (CONCAT(col1, col2));
SELECT *
FROM my_table
WHERE CONCAT(col1, col2) = 'value';
• 지원 여부
- Oracle, PostgreSQL, MySQL(8.0 이상) : 함수 기반 인덱스 지원
- MySQL 8.0 이하 : 지원되지 않음
(2) 가상 컬럼 또는 계산된 컬럼
• MySQL 8.0 이상 및 일부 DBMS는 가상 컬럼을 지원합니다. 이 방법으로 계산된 값을 인덱싱할 수 있습니다.
• 예를 들어 다음과 같은 쿼리는 인덱스를 사용할 수 있습니다
ALTER TABLE my_table
ADD COLUMN col_concat VARCHAR(255) GENERATED ALWAYS AS (CONCAT(col1, col2)) STORED;
CREATE INDEX idx_col_concat ON my_table (col_concat);
SELECT *
FROM my_table
WHERE col_concat = 'value';
(3) SQL 리팩토링
• 가능하면 함수 사용을 피하고 조건을 단순화하여 인덱스를 활용할 수 있게 리팩토링합니다.
인덱스 활용 여부 확인
- 인덱스가 실제로 사용되는지 확인하려면 실행 계획(Execution Plan)을 확인
EXPLAIN SELECT *
FROM my_table
WHERE CONCAT(col1, col2) = 'value';
'IT > Oracle' 카테고리의 다른 글
오라클 인덱스 생성시 NOWAIT 옵션 (0) | 2025.02.22 |
---|---|
오러클 인덱스 없는 테이블에 빠른 데이터 저장 방법 (0) | 2025.02.22 |
유형별 락(Lock) (2) | 2025.02.20 |
오라클 실행계획과 통계정보 백업 (1) | 2025.02.20 |
DBMS_JOB 모니터링 (3) | 2025.02.19 |