查询执行中的Oracle pro * c指标变量与NVL

时间:2016-08-12 03:13:13

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

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 ...;

哪一个在性能方面更好?

2 个答案:

答案 0 :(得分:2)

啊,Pro * C.这是20年前的一段时间了,但我认为我的记忆在这里很适合我。

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

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

现在在实践中,你不会发现太多差异。但你问: - )

答案 1 :(得分:0)

根据我的经验,NVL比指示符变量要慢得多,特别是如果为字段的INSERT或UPDATE嵌套(是的,可以嵌套它们)。这是很久以前的事了,我不记得确切的情况,但是我记得性能的提高是真实的。 选择时并没有那么明显,但是使用指标变量还可以检测出发生截断的情况。

如果使用VARCHARUVARCHAR列,则在Oracle中还有第三个选项可检测NULL / Empty字符串。 len字段将设置为0,表示该值为空。由于Oracle无法区分NULL和长度为0的字符串,因此它几乎相同。