IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Optimisation et raison d'être des différents types des curseurs explicites [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué Avatar de goute
    Homme Profil pro
    Développeur éclectique
    Inscrit en
    Novembre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur éclectique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 224
    Points : 159
    Points
    159
    Par défaut Optimisation et raison d'être des différents types des curseurs explicites
    Bonjour,

    Il y a deux façons d'utiliser les curseurs explicites :

    -La premiere avec les 4 etapes cursor open fetch close ...

    -La seconde avec le LOOP FOR


    J'ai envie de dire la première est plus laborieuse, pourquoi continuer à l'utiliser ??
    Qu'elle façon choisir ?
    Il y a t'il encore une bonne raison d'utiliser la première ?
    Est ce pour des raisons historiques ou il y a t-il vraiment un intérêt à utiliser la première ?

    De grandes questions

    Merci pour votre intérêt.

    Bye
    Moins tu vas vite, plus tu vas moins vite!

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    En réalité les 4 étapes sont toujours présentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Declare
    Ouverture
    Fetch
    Close
    ce qui diffère est juste qui fait le boulot: le développeur ou le compilateur.

    Aujourd'hui il y a 3 cas d'utilisation:
    - recherche d'une seul enregistrement: la solution Select ... Into...
    - recherche d'un nombre limité et connus d'avance des enregistrements (ex. lignes d'une commande): Select ... Bulk Collect Into
    - recherche d'un nombre inconnu des enregistrements: Cursor et Fetch en Bulk

    Tous les autres structures existent seulement pour des raisons historiques ou quelque cas limites et marginaux.

    Pour plus des informations cherchez l'article de Bryan LLewellyn : Doing sql from pl/sql

  3. #3
    Membre habitué Avatar de goute
    Homme Profil pro
    Développeur éclectique
    Inscrit en
    Novembre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur éclectique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 224
    Points : 159
    Points
    159
    Par défaut
    On est bien d'accord. Je me suis mal expliqué.

    Je parle du cas "- recherche d'un nombre inconnu des enregistrements: Cursor et Fetch en Bulk"

    On a deux façons d'utiliser les curseurs :

    -Avec Declare Ouverture Fetch Close...

    ou

    -Avec FOR var_iteration IN mon_curseur LOOP [...] END LOOP;

    Et la ma question c'est pourquoi utiliser une façon et pas l'autre ? et je trouve la deuxième manière vraiment plus simple alors pourquoi je devrais m’embêter à connaitre encore la façon avec le fetch ??

    ahah

    Merci
    Moins tu vas vite, plus tu vas moins vite!

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    FOR LOOP est la syntaxe préconisée depuis des années pour sa simplicité.
    OPEN reste nécessaire pour faire du BULK COLLECT (et paramétré le LIMIT) ou pour du SQL dynamique, ou pour une procédure avec paramètre curseur en sortie.

    difference between cursors for loop and normal explicit cursors

  5. #5
    Membre habitué Avatar de goute
    Homme Profil pro
    Développeur éclectique
    Inscrit en
    Novembre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur éclectique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2008
    Messages : 224
    Points : 159
    Points
    159
    Par défaut
    Merci beaucoup pour ces éléments !! Ça répond à ma question
    Moins tu vas vite, plus tu vas moins vite!

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Le principe de rasoir d'Occam ne fonctionne pas toujours!

    La boucle for implicite a été optimisée à partir de la version 10.1 ou 10.2. Avant ce type de traitement était dans la catégorie "row by row is slow by slow". Et la raison de son optimisation a été précisément cet aspect. Donc à partir de cette version cette structure de programmation a été optimisée pour travailler par lot de 100 c'est à dire cela corresponde à un Bulk Fetch avec la limite de 100. Et si ma mémoire est bonne comme toute optimisation "automagique" elle fonctionne que si l'optimiseur a le niveau d'optimisation approprié.

    Considérer que 100 est la bonne valeur dans toutes les cas s'apparente à la légende du lit de Procuste.

    Et de plus cela n'oblige pas le programmeur feignant à utiliser les collections ce qui est "la solution" des problèmes PL/SQL d'optimisation des traitement.

    Pour récapituler:
    - select d'un enregistrement : select ... into <Record>
    - select de N enregistrements ou N <= 2000 enregistrements: Select ... Bulk Into <Colection des Records>
    - select des N enregistrements ou N > 2000 enregistrements : Declare cursor ...Bulk Fetch Into <Colection des Records>

    Bref comme toute autre valeur le "2000" c'est à prendre avec les pincettes, ça peut être 100 ça peut être 5000. Au delà la gestion de la mémoire prendre le dessous sur les bénéfices.

    Lisez le document cité, vous allez apprendre pas mal des choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 22/05/2012, 14h24
  2. Taille de stockage maximale des différents types en sql server
    Par stefsas dans le forum Accès aux données
    Réponses: 1
    Dernier message: 02/07/2010, 09h15
  3. [XL-2003] Combobox des différent types de "currency"
    Par Umaro137 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/08/2009, 17h23
  4. Taille des différents types
    Par muad'dib dans le forum Réseau
    Réponses: 20
    Dernier message: 09/06/2007, 22h57
  5. [MySQL] description des différents types de champ
    Par amazircool dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/05/2007, 00h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo