2014-09-29 3 views
2

Oracle SQL 쿼리에서 여러 개의 (3) 열을 연결하려고합니다. 현재 함수 concat을 사용하고 있습니다. 누군가는 concat 대신 ||을 사용하여 성능 이점을 제공하도록 제안했습니다.concat vs || 성능 차이가 있습니까? in oracle

사실입니까? 그렇다면 왜?

나는 || 그 쓰여진 쿼리가 더 읽기 쉽습니다.

답변

3

CONCAT()은 모두 동일하며, '||'이 잘못 해석 될 수있는 SQL 스크립트 처리를 위해 다른 문자 집합을 지원합니다. 표 4-3에 나타낸 바와 같이 대부분의 플랫폼 Documentation

가입일

는 연결 연산자 두 고체 수직 바있다. 그러나 일부 IBM 플랫폼은이 연산자에 대해 깨진 수직 막대를 사용합니다. ASCII 문자와 EBCDIC 사이에 다른 문자 세트가있는 시스템간에 SQL 스크립트 파일을 이동하는 경우 대상 Oracle 데이터베이스 환경에 필요한 수직 막대 으로 수직 막대가 변환되지 않을 수 있습니다. 운영 체제 나 네트워크 유틸리티에서 을 제어하는 ​​것이 어렵거나 불가능한 경우, 수직 막대 연산자 대신 CONCAT 문자 기능을 에 제공합니다. 문자 집합이 다른 사이에서 이동할 응용 프로그램에서 을이 기능을 사용하십시오.

7

각 루프의 연결 옵션을 각각 1 억 번씩 시도하기 위해 간단한 PL/SQL 스크립트 (아래)를 설정했습니다. ||에 대한 결과는 142.93 초이고 CONCAT은 144.11 초입니다. 어쨌든, 당신은 약 1.4 마이크로 초 작동에 대해 이야기하고 있습니다. 내 결론은 성능 차이가 눈에 띄지 않는 것으로 보인다.

더 읽기 쉬운 것 외에도 ||은 연결 연산자의 ANSI 표준입니다. 각주로

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; 

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; 


, Oracle는 말한다 CONCAT 기능이 약 목적 :

같은 ASCII와 같은 다른 문자 집합을 갖는 시스템 사이에서 SQL 스크립트 파일을 이동 및 EBCDIC, 수직 막대는 이 대상 Oracle에 필요한 수직 막대로 변환되지 않을 수도 있습니다 Database env 다림질. 오라클은 시스템 또는 네트워크 유틸리티를 수행하여 수행되는 변환을 제어하기가 어렵거나 불가능한 경우에 대비하여 수직 막대 연산자 대신 CONCAT 문자 기능을 으로 제공합니다. 문자 집합이 다른 환경간에 을 이동할 응용 프로그램에서이 기능을 사용하십시오.

+0

동료 중 일부는 CONCAT 기능이 작동하지 않는 동안 파이프를 사용하는 쿼리가 실패하는 경우가 있음을 나타냅니다.우리의 상황에서는 다른 문자 집합에 문제가 있다고 생각하지 않지만 네트워크/운영 체제 문제는 흥미 롭습니다. C7 .imr 파일을 C10 (웹 기반)으로 변환하므로 ||로 전환 중입니다. –

관련 문제