1. SUBSTRING 함수
가장 범용적으로 사용되는 함수입니다.
기본 문법
SUBSTRING(문자열 FROM 시작위치 FOR 길이)
예제
SELECT SUBSTRING('Hello World' FROM 1 FOR 5);
결과: Hello
특징
- 시작 위치는 1부터 시작
- 길이를 생략하면 끝까지 반환
SELECT SUBSTRING('Hello World' FROM 7);
결과: World
2. LEFT / RIGHT 함수 (간단한 자르기)
문자열의 양 끝에서 자를 때 유용합니다.
LEFT
SELECT LEFT('Hello World', 5);
결과: Hello
RIGHT
SELECT RIGHT('Hello World', 5);
결과: World
특징
- 문법이 간단하고 가독성이 좋음
- 단순 길이 기반 자르기에 적합
3. SPLIT_PART 함수
특정 구분자를 기준으로 문자열을 나눌 때 사용합니다.
기본 문법
SPLIT_PART(문자열, 구분자, 위치)
예제
SELECT SPLIT_PART('apple,banana,grape', ',', 2);
결과: banana
특징
- CSV, 로그, 이메일 처리에 유용
- 위치는 1부터 시작
4. POSITION + SUBSTRING
특정 문자의 위치를 기준으로 자를 수 있습니다.
예제 (이메일 아이디 추출)
SELECT SUBSTRING('test@example.com'
FROM 1 FOR POSITION('@' IN 'test@example.com') - 1);
결과: test
5. 정규식 기반 문자열 자르기
패턴 기반 추출이 필요한 경우 사용합니다.
예제
SELECT SUBSTRING('abc123xyz' FROM '[0-9]+');
결과: 123
특징
- 복잡한 문자열 처리 가능
- 정규식 비용이 높아 성능 주의 필요
성능 관점에서의 차이
문자열 함수는 단순해 보이지만 대량 데이터에서는 성능 차이가 발생합니다.
1. 함수 비용 비교
일반적인 성능 순서는 다음과 같습니다.
- 빠름: LEFT, RIGHT
- 보통: SUBSTRING
- 상황에 따라: SPLIT_PART
- 느림: 정규식 기반 SUBSTRING
이유:
- LEFT, RIGHT는 단순 길이 기반 연산
- SUBSTRING은 범용 함수로 약간 더 많은 처리 필요
- 정규식은 패턴 매칭 엔진을 사용하기 때문에 비용이 큼
2. WHERE 절에서의 성능 문제
다음과 같은 쿼리는 인덱스를 사용할 수 없습니다.
SELECT *
FROM users
WHERE SUBSTRING(email FROM 1 FOR 4) = 'test';
- 컬럼에 함수가 적용되면 인덱스가 무효화됨
3. 해결 방법 (인덱스 활용)
방법 1: LIKE 사용
SELECT *
FROM users
WHERE email LIKE 'test%';
- 인덱스 사용 가능 (prefix 검색)
방법 2: 함수 기반 인덱스
CREATE INDEX idx_users_email_prefix
ON users (SUBSTRING(email FROM 1 FOR 4));
SELECT *
FROM users
WHERE SUBSTRING(email FROM 1 FOR 4) = 'test';
- 인덱스 사용 가능
4. SPLIT_PART 성능 주의
SELECT SPLIT_PART(email, '@', 1) FROM users;
- 전체 데이터를 매번 split 하기 때문에 비용 증가
- 대량 데이터에서는 미리 컬럼 분리 권장
5. 정규식 사용 시 주의
SELECT SUBSTRING(col FROM '[0-9]+') FROM table;
- Full scan + regex 처리로 매우 느려질 수 있음
- 가능한 경우 일반 함수로 대체
반응형
'DB > postgreSQL' 카테고리의 다른 글
| postgreSQL UPDATE, DELETE 조인 사용법 (0) | 2025.04.01 |
|---|---|
| postgreSQL merge문 사용하기 (0) | 2025.03.28 |
| postgreSQL 임시테이블 생성 (0) | 2025.03.28 |