2014-09-29 2 views
2

Я хочу конкатрировать несколько (3) столбцов в оракуле sql-запросе. В настоящее время я использую функцию concat. Кто-то предложил использовать || вместо concat, поскольку он дает преимущество в производительности.Есть ли разница в производительности между concat vs || in oracle

Это правда? Если да, то почему?

Я вижу только выгоду от || является то, что написанный запрос более читабельным.

ответ

3

Оба одинаковы, CONCAT() предназначен для поддержки различных наборов символов для обработки SQL-скриптов, где '||' может быть интерпретирован неправильно.

От Documentation

На большинстве платформ оператор конкатенации состоит из двух вертикальных твердых стержни, как показано в таблице 4-3. Однако некоторые платформы IBM используют для этого оператора разбитые вертикальные полосы. При перемещении файлов сценариев SQL между системами, имеющими разные наборы символов, например между ASCII и EBCDIC, вертикальные полосы не могут быть переведены в вертикальную полосу , необходимую целевой среде Oracle Database. Oracle предоставляет символьную функцию CONCAT в качестве альтернативы вертикальной панели Оператор для случаев, когда трудно или невозможно управлять Перевод выполняется операционной системой или сетевыми утилитами. Используйте эту функцию в приложениях, которые будут перемещаться между средами с различными наборами символов.

7

Я установил простой сценарий PL/SQL (см. Ниже), чтобы попробовать обе опции конкатенации в цикле 100 миллионов раз каждый. Результат для || составил 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 функции:

При перемещении файлов SQL сценарии между системами, имеющими различные наборов символов, например, между ASCII и EBCDIC, вертикальные полосы могут не будут переведены в вертикальную полосу, требуемую целевым Oracle База данных env ironment. Oracle предоставляет функцию символа CONCAT как альтернативу оператору вертикальной панели для случаев, когда трудно или невозможно контролировать перевод, выполняемый с помощью системных или сетевых утилит. Используйте эту функцию в приложениях, которые будут перемещаться между средами с разными наборами символов.

+0

Некоторые из моих коллег указывают, что их запросы с использованием труб иногда терпят неудачу, а функция CONCAT не работает.Я не думаю, что в нашей ситуации это проблема с разными наборами символов, но проблема сети/операционной системы интересна. Я конвертирую файлы C7 .imr в C10 (на веб-сайте), поэтому я переключаюсь на ||. –

Смежные вопросы