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초, CONCAT은 144.11초 결과가 나왔습니다.
CPU, Memory의 문제로 어느 정도 시간 차이가 존재할 수 있으므로 성능상으로 차이는 없다고 생각됩니다.
하지만, 실제로는 몇 가지 차이가 존재하는데요.
가장 큰 차이점으로 || 는 연산자(Operation)이며, CONCAT은 함수(Function)이기 때문에 우선 순위가 다릅니다.
보통 연산자가 함수보다 우선순위가 더 높기 때문에 더 빨리 처리되고 함수는 비교적으로 느립니다.
그렇기 때문에 || 연산자가 CONCAT 함수보다 조금 더 빨리 동작합니다.
성능적인 관점에서는 CONCAT이 자동으로 형 변환을 해주기 때문에 더 좋을 수 있습니다.
위 내용은 아래 링크를 참고하여 정리하였습니다.
속도 관점
www.toolbox.com/tech/data-management/question/concat-vs-022004/
성능 관점
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
'DataBase > Oracle' 카테고리의 다른 글
[ORACLE]반올림하는 ROUND 함수 (0) | 2021.05.16 |
---|---|
[ORACLE]소수점, 날짜 자르는 TRUNC 함수 (0) | 2021.05.16 |
[ORACLE]지정한 범위에서의 위치를 구하는 WIDTH_BUCKET함수 (0) | 2021.05.09 |
[ORACLE]올림 처리하는 CEIL 함수 (0) | 2021.05.09 |
[ORACLE]문자열 첫번째 문자, 마지막 문자 자르기 (SUBSTR, INSTR) (0) | 2021.05.07 |
댓글