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