我想在oracle sql查詢中連接多個(3)列。目前我正在使用功能concat
。 有人建議使用||
代替concat
,因爲它具有性能優勢。concat和||之間是否存在性能差異?在oracle
這是真的嗎?如果是,爲什麼?
我只看到||的好處。是書面查詢更可讀。
我想在oracle sql查詢中連接多個(3)列。目前我正在使用功能concat
。 有人建議使用||
代替concat
,因爲它具有性能優勢。concat和||之間是否存在性能差異?在oracle
這是真的嗎?如果是,爲什麼?
我只看到||的好處。是書面查詢更可讀。
兩者都是一樣的,CONCAT()
用於支持SQL腳本處理的不同字符集,其中'||'
可能被錯誤地解釋。
在大多數平臺,並置運算符是兩個實心垂直 酒吧,表4-3所示。但是,某些IBM平臺爲此操作員使用了斷開的 豎條。當在具有不同字符集的系統(例如ASCII和 EBCDIC)之間移動 系統之間的SQL腳本文件時,豎線可能不會被轉換爲目標Oracle數據庫環境所需的豎線 。 Oracle提供 CONCAT字符函數作爲豎線 操作符的替代方法,用於操作系統或網絡實用程序難以或不可能控制 轉換時的情況。在應用程序中使用 此功能將在具有不同字符集的環境 之間移動。
我設置了一個簡單的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,豎線可能不會被翻譯成目標所需的豎線 數據庫env ironment。 Oracle提供了CONCAT字符功能 到垂直杆操作者對情況的替代,當它是通過操作 系統或網絡公用程序執行 難以或不可能控制翻譯。在 將環境之間具有不同的字符集的移動應用程序使用此功能。
一些我的同事的表明,採用管他們的查詢,而CONCAT功能不有時會失敗。我認爲在我們的情況下,這是不同字符集的問題,但網絡/操作系統問題很有趣。我將C7 .imr文件轉換爲C10(基於網頁),因此我正在切換到||。 – 2017-02-07 14:39:04