DataBase/Oracle

[ORACLE]문자열 합치기 (CONCAT, ||)

DevStory 2021. 5. 8.

ORACLE에서 문자열을 연결해야 하는 경우 CONCAT 또는 || 을 사용하여 연결할 수 있습니다.

 

CONCAT과 || 는 문자열을 합친다는 동일한 기능을 하지만, 차이점이 존재하며 성능적인 관점에서도 다른 면모를 보여줍니다.

 

이번 포스팅에서는 CONCAT과 || 에 대해 정리합니다.

 


성능 및 속도

-- || 사용
DECLARE
   i NUMBER;
   j NUMBER := 100000000;
   v VARCHAR2 (1000);
   v_start TIMESTAMP := SYSTIMESTAMP;
BEGIN
   FOR i IN 1 .. j LOOP
      v := DBMS_RANDOM.VALUE () || DBMS_RANDOM.VALUE ();
   END LOOP;    
   DBMS_OUTPUT.put_line ('1: ' || (SYSTIMESTAMP - v_start));
END;

-- CONCAT 사용
DECLARE
   i NUMBER;
   j NUMBER := 100000000;
   v VARCHAR2 (1000);
   v_start TIMESTAMP := SYSTIMESTAMP;
BEGIN
   FOR i IN 1 .. j LOOP
      v := CONCAT (DBMS_RANDOM.VALUE (), DBMS_RANDOM.VALUE ());
   END LOOP;    
   DBMS_OUTPUT.put_line ('2: ' || (SYSTIMESTAMP - v_start));
END;

반복문 1억 번을 실행하여 문자열을 합치는 쿼리입니다.

 

|| 142.93초, CONCAT144.11초 결과가 나왔습니다.

 

CPU, Memory의 문제로 어느 정도 시간 차이가 존재할 수 있으므로 성능상으로 차이는 없다고 생각됩니다.

 

하지만, 실제로는 몇 가지 차이가 존재하는데요.

 

가장 큰 차이점으로 || 는 연산자(Operation)이며, CONCAT은 함수(Function)이기 때문에 우선 순위가 다릅니다.

 

보통 연산자가 함수보다 우선순위가 더 높기 때문에 더 빨리 처리되고 함수는 비교적으로 느립니다.

 

그렇기 때문에 || 연산자가 CONCAT 함수보다 조금 더 빨리 동작합니다.

 

성능적인 관점에서는 CONCAT이 자동으로 형 변환을 해주기 때문에 더 좋을 수 있습니다.

 

위 내용은 아래 링크를 참고하여 정리하였습니다.

 

속도 관점

www.toolbox.com/tech/data-management/question/concat-vs-022004/

 

성능 관점

docs.informatica.com/data-integration/data-services/10-0/transformation-language-reference/functions/concat.html


MySQL에서 || 연산자

|| Operation은 Ansi 표준입니다.

 

하지만, MySQL에서는 비교 연산자로 사용됩니다.

SELECT 'FOO'='BAR' || 'FOO'='BAR' AS RESULT1
     , 'FOO'='FOO' || 'FOO'='BAR' AS RESULT2
     , 'FOO'='BAR' || 'FOO'='FOO' AS RESULT3;

실행 결과


정리

  • ORACLE 기준으로 속도는 || 가 더 빠른데, 성능적으로는 CONCAT이 더 좋습니다.
  • CONCAT 함수를 중첩해서 사용해야 하는 경우 가독성이 떨어지므로 이러한 경우 || 연산자 사용을 권유합니다.
  • 해당 포스트는 ORACLE 기준이므로 다른 DBMS에는 다를 수 있습니다.

참고

stackoverflow.com/questions/26103027/is-there-performance-difference-between-concat-vs-in-oracle

 

Is there performance difference between concat vs || in oracle

I want to concat multiple(3) columns in oracle sql query. Currently I am using function concat. Someone suggested to use || in place of concat as it gives performance benefit. Is it true? If yes...

stackoverflow.com

 

반응형

댓글