我想在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