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



oracle-pro-c建议使用指示器变量作为"NULL flags"附加在主机变量上。根据文档,我们可以将每个主机变量与一个可选的指示变量(short type)关联。例如:

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

哪一个在性能方面更好?

啊,Pro*C。这是过去的一段时间,20多年了,但我想我的记性对我来说很好。

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

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

在实践中,您不会注意到太多的区别。但是你问了:-)

根据我的经验,NVL比指示器变量慢得多,特别是如果嵌套(是的,您可以嵌套它们)用于INSERT或UPDATE字段。那是很久以前的事了,我不记得具体的情况了,但我记得成绩的提高是真实的。在select上,它不是那么明显,但是使用指示符变量也允许检测截断发生的情况。

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

相关内容

  • 没有找到相关文章

最新更新