2011-06-22 4 views
3

Lors de l'utilisation de la procédure stockée, est-il plus rapide de renvoyer un curseur? ou est-il plus rapide d'utiliser le paramètre de données out du type de données. ou il n'aura vraiment aucune différence de performance.Est-ce que les Cursors retournent plus vite?

PROCEDURE SPUSINGCURSOR (input1 INT, 
          retcursor out sys_refcursor) IS 
BEGIN 

    OPEN retcursor FOR 
    SELECT var1, 
      var2, 
      var3 
     FROM Table_Vlaues 
    WHERE var1 = input1 
    ORDER BY var1; 

END; 

Répondre

7

Cela dépend de beaucoup de choses.

Si vous exécutez la requête dans le SP et renvoyez un type de table imbriquée contenant les résultats, le SP mettra du temps à s'exécuter et à consommer de la mémoire requise pour contenir les données. Il devra également renvoyer toutes ces données au client en une fois, ce qui prendra du temps. Mais si vous avez besoin d'accéder à toutes les données avant de continuer quoi que ce soit d'autre, et que les besoins en mémoire ne sont pas trop importants, c'est une façon raisonnable de faire les choses.

Si vous ouvrez et renvoyez à la place un CURSEUR REF, le temps d'exécution SP réel et la mémoire requise seront inférieurs; mais vous ne faites que reporter l'heure d'exécution à plus tard, lorsque vous récupérez le curseur. S'il y a de bonnes chances, vous n'aurez pas besoin d'aller chercher toutes les lignes; ou si l'ensemble de données est susceptible d'être très grand; ou si le fait d'aller chercher des lignes dans de petits groupes vous permet d'effectuer d'autres tâches significatives (telles que les rediriger vers un autre thread ou un processus qui va réellement faire quelque chose avec eux), alors cela pourrait être un excellent choix. Le principal inconvénient du retour d'un curseur est que sa récupération nécessitera probablement plus d'allers-retours réseau, ce qui pourrait être plus lent que de simplement retourner les données en une fois. Un avantage non lié à la performance de retourner un REF CURSOR ouvert est qu'il est plus facile de travailler avec certains environnements clients (par exemple, en JDBC il est directement mappé sur un ResultSet, alors que pour un type de table imbriqué, vous devez faire un travail supplémentaire fournir à Java les informations de type).

+0

Ceci est une excellente analyse. –

Questions connexes