[Oracle to PostgreSQL] concat() vs. || 차이 및 성능비교

CambleB·2022년 10월 13일
0

PostgreSQL

목록 보기
1/4

1. ‘||’은 NULL이 하나라도 있다면 NULL 반환

PostgreSQL과 Oracle의 NULL 차이

  • PostgreSQL
    • Null은 값 자체가 없는 것 <> ''은 길이가 0인 문자열
  • Oracle
    • Null = ''(Empty String)

이로인해 PostgreSQL에서는 문자열과 null 연산 시 차이가 발생한다

PostgreSQL

  • concat(): null의 유무와 상관없이 문자열 반환
  • ||: null이 있으면 null 반환

Oracle

  • concat(), || 둘 다 null의 유무와 상관없이 문자열 반환

예시

--PostgreSQL
select concat('1', null); --> 1
select '1'||null;         --> [NULL] -- null로 뭉개짐!
--Oracle
select concat('1', null) from dual; --> 1
select '1'||null from dual;         --> 1

2. PostgreSQL의 'concat()'은 ‘||’보다 느리다

하지만 PostgreSQL에서는 대상 레코드가 많을수록 'concat()'은 ‘||’보다 느리다.

[TEST] PostgreSQL - concat()과 || 속도 차이

/*PostgreSQL*/
--CASE 1. ||
select * from tb
where col1 = 'id'||'0001'         

--CASE 2. CONCAT()
select * from tb
and col1 = concat('id', '0001') 
  • Execution Plan
    • CASE 1. Execution Plan (Time: 319.573)
    • CASE 2. Execution Plan (Time: 607.710)

  • 실제 실행 결과 (실행 결과는 18,520 rows, 표의 단위는 ms)
    CASE 2. Execution plan의 Time값이 더 컸던 것 처럼,
    실제 실행 소요시간 또한 CASE 2.가 더 오래 걸림
    * CASE 1. str||str: 상수처럼 처리 빠름
     * CASE 2. concat(str, str): 스칼라 쿼리 처럼 건수에 비례하는 처리 속도        


3. PostgreSQL에서 NULL과 문자열 연산시 속도도 중요하다면?

  • coalesce()를 사용하자
--예시
and col2 = COALESCE(null, '123')||'456';
profile
DBA의 벨로그 🖤 (Oracle | PostgreSQL | AWS | Python ... )

0개의 댓글