concat 与 || 之间是不是存在性能差异?在甲骨文中

Posted

技术标签:

【中文标题】concat 与 || 之间是不是存在性能差异?在甲骨文中【英文标题】:Is there performance difference between concat vs || in oracleconcat 与 || 之间是否存在性能差异?在甲骨文中 【发布时间】:2014-11-24 00:44:06 【问题描述】:

我想在 oracle sql 查询中连接多个 (3) 列。目前我正在使用函数concat。 有人建议使用|| 代替concat,因为它可以提高性能。

这是真的吗?如果是,为什么?

我只看到 || 的好处那个书面查询是否更具可读性。

【问题讨论】:

【参考方案1】:

两者完全相同,CONCAT() 用于支持不同的字符集进行 SQL 脚本处理,其中'||' 可能会被错误解释。

来自Documentation

在大多数平台上,连接运算符是两个实心垂直 条,如表 4-3 所示。但是,一些 IBM 平台使用损坏的 此运算符的竖线。在之间移动 SQL 脚本文件时 具有不同字符集的系统,例如在 ASCII 和 EBCDIC,竖线可能不会翻译成竖线 目标 Oracle 数据库环境所需。甲骨文提供 CONCAT 字符功能可替代竖线 难以或无法控制的情况下的操作员 由操作系统或网络实用程序执行的翻译。采用 将在环境之间移动的应用程序中的此功能 具有不同的字符集。

【讨论】:

【参考方案2】:

我设置了一个简单的 PL/SQL 脚本(如下),在一个循环中尝试两个连接选项,每个选项 1 亿次。 || 的结果是 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要求的竖线 数据库环境。 Oracle 提供的 CONCAT 字符函数为 竖线运算符的替代方案,适用于以下情况 难以或不可能控制通过操作执行的翻译 系统或网络实用程序。在应用程序中使用此功能 将在具有不同字符集的环境之间移动。

【讨论】:

我的一些同事表示他们使用管道的查询有时会失败,而 CONCAT 函数则不会。我不认为在我们的情况下这是不同字符集的问题,但网络/操作系统问题很有趣。我正在将 C7 .imr 文件转换为 C10(基于 Web),所以我正在切换到 ||。

以上是关于concat 与 || 之间是不是存在性能差异?在甲骨文中的主要内容,如果未能解决你的问题,请参考以下文章

视图和内联表函数之间是不是存在性能差异?

视图和存储过程之间是不是存在性能差异

C# 中的 ++i 和 i++ 之间是不是存在性能差异?

CTE、子查询、临时表或表变量之间是不是存在性能差异?

SVG 属性和样式之间是不是存在性能差异?

for 循环和 for-each 循环之间是不是存在性能差异?