본문 바로가기

IT/Oracle

CONCAT 함수의 인덱스 수행 여부

반응형

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';
반응형