【问题标题】:Oracle pro*c indicator variables vs NVL in query execution查询执行中的 Oracle pro*c 指标变量与 NVL
【发布时间】:2016-08-12 03:13:12
【问题描述】:

oracle-pro-c 建议使用指标变量作为附加到主机变量的"NULL flags"。根据文档,我们可以将每个主变量与可选的指示变量(短类型)相关联。例如:

short indicator_var;
EXEC SQL SELECT xyz INTO :host_var:indicator_var
    FROM ...;

我们也可以使用 https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm 中记录的 NVL,例如:

EXEC SQL SELECT NVL(TO_CHAR(xyz), '') INTO :host_var
        FROM ...;

在性能方面哪个更好?

【问题讨论】:

  • 使用指标变量可能“更有效”,但可能几乎无法衡量。这确实意味着服务器要解析的 SQL 更少。这确实意味着更少的函数执行。我会选择“SQL 更简单”作为主要优势。
  • @JonathanLeffler 同意使用较少解析逻辑的更简单的 SQL,我对指标变量越来越慢,并寻找有更好解决方案的选项,没有指标变量,它会更快,但如果一些 col 是那么空值呢?
  • 我对 Oracle Pro*C 的了解不够,无法提供进一步帮助。我之前的评论(不是答案,请注意)是基于对 Oracle 以外的其他 DBMS 的一般经验 - 这就是为什么它不是答案。根据我的经验,最好在客户端 (Pro*C) 程序中对空值处理进行编码,而不是让 DBMS 处理所有这些。我相信 Oracle 和空字符串与空字符串存在一些问题,但同样,我没有 Oracle 工作的直接经验来证实这一点。

标签: c oracle oracle11g oracle-pro-c embedded-sql


【解决方案1】:

啊,Pro*C。已经有 20 多年的历史了,但我认为我的记忆在这里很好用。

使用指标变量在性能方面会更好,原因有两个:

  • SQL 更简单,因此解析更少,通过网络传输到数据库服务器的字节也更少。
  • 通常,在 Oracle 中,“Null”值以 0 字节编码。一个空字符串包含一个长度(N 字节)和存储空间(0 字节)。因此,NULL 值在返回的结果集中编码效率更高。

现在在实践中,您不会注意到太多差异。但是你问了:-)

【讨论】:

    【解决方案2】:

    根据我的经验,NVL 比指示变量慢得多,尤其是在为 INSERT 或 UPDATE 字段嵌套(是的,您可以嵌套它们)时。那是很久以前的事了,我不记得确切的情况,但我记得性能提升是真实的。 在选择时并不那么明显,但使用指示变量还可以检测发生截断的情况。

    如果您使用VARCHARUVARCHAR 列,则有第三个选项可以检测Oracle 中的NULL/空字符串。 len 字段将设置为 0,这意味着该值为空。由于 Oracle 不区分 NULL 和长度为 0 的字符串,因此它们或多或少是相同的。

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多