2016-08-12 3 views
1

oracle-pro-c ont recommandé d'utiliser des variables indicatrices comme "NULL flags" attachées aux variables hôtes. Selon la documentation, nous pouvons associer chaque variable hôte à une variable indicatrice optionnelle (type court). Par exemple:Les variables d'indicateur Oracle pro * c vs NVL dans l'exécution de la requête

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

Nous pouvons également utiliser alternativement NVL comme indiqué dans https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm, par exemple, comme:

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

Quelle est la meilleure en termes de performance?

+2

L'utilisation des variables indicatrices est probablement «plus efficace» mais probablement presque incommensurable. Cela signifie moins de SQL à analyser par le serveur. Cela signifie moins d'exécutions de fonctions. J'irais avec «le SQL est plus simple» comme étant un avantage majeur. –

+0

@JonathanLeffler était d'accord avec SQL plus simple avec moins de logique d'analyse, je deviens lent avec des variables indicatrices, et je cherche des options pour avoir une meilleure solution, sans variables indicatrices, c'est plus rapide, mais si une valeur est nulle, alors? –

+0

Je ne connais pas assez Oracle Pro \ * C pour pouvoir vous aider. Mon commentaire précédent (pas une réponse, que ce soit noté) était basé sur une expérience générique avec d'autres SGBD que Oracle - et c'est pourquoi ce n'est pas une réponse. Dans mon expérience, il vaut mieux coder la gestion null dans le programme client (Pro \ * C) que de faire en sorte que le SGBD gère tout cela. Je crois qu'il y a quelques problèmes avec Oracle et des chaînes vides vs des chaînes nulles, mais encore une fois, je n'ai pas l'expérience directe d'Oracle pour confirmer cela. –

Répondre

2

Ah, Pro * C. Il y a un certain temps, plus de 20 ans, mais je pense que ma mémoire me sert bien ici.

En utilisant les variables indicatrices seront mieux en termes de performances, pour deux raisons:

  • Le SQL est plus simple, donc il y a moins parsing et moins d'octets seront transférés sur le réseau au serveur de base de données.
  • Dans Oracle en général, une valeur "Null" est codée sur 0 octet. Une chaîne vide contient une longueur (N octets) et un espace de stockage (0 octet). Ainsi, une valeur NULL est codée plus efficacement dans l'ensemble de résultats renvoyé.

Maintenant, en pratique, vous ne remarquerez pas beaucoup la différence. Mais vous avez demandé :-)