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

Oracle Discussion :

[PL/SQL] curseur et clause WITH


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Points : 50
    Points
    50
    Par défaut [PL/SQL] curseur et clause WITH
    Bonjour,

    Quelqu'un peut-il me dire à quoi sert ce genre de curseur? je ne l'ai pas trouver dans la doc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CURSOR cur_a
    		IS
    		WITH table_a
    		AS (SELECT FROM table_b WHERE ....)
    		SELECT .... FROM table_a.....;

  2. #2
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Bonjour,

    La clause WITH s'utilise dans un SELECT, et permet de factoriser une sous-requête, plutôt que de la taper N fois dans une requête.

    De plus, l'exécution de la requête est normalement plus rapide, puisque au lieu d'ête exécuter N fois, elle est exécutée 1 seule fois, et le résultat est mis en mémoire (ou dans une table temporaire si il y a trop de volume).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par rouardg
    Bonjour,

    La clause WITH s'utilise dans un SELECT, et permet de factoriser une sous-requête, plutôt que de la taper N fois dans une requête.

    De plus, l'exécution de la requête est normalement plus rapide, puisque au lieu d'ête exécuter N fois, elle est exécutée 1 seule fois, et le résultat est mis en mémoire (ou dans une table temporaire si il y a trop de volume).

    Nous utilisons une clause WITH dans un curseur avec une requête réalisant une union de 6 SELECT. Le temps de réponses est très long, en replaçant par une vue implicite dans chaque SELECT, la réponse est instantanée...quelqu'un a t'il une explication?

  5. #5
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Salut à tous,
    En fait ça dépend de la "lourdeur" du Select que tu fait dans la clause WITH et de sa jointure avec le select principal...

    Avec la clause WITH, le Select ainsi factorisé est FORCEMENT exécuté pour sa totalité (tous les rows) avant d'être utilisé dans le Select principal.

    Par contre, avec la vue en ligne (plus communément inline view) Oracle essaye tout d'abord de TRANSFORMER le select de la vue en ligne en fonction de la (les) jointure(s) sur le Select principal pour n'en faire qu'un seul Select le plus performant possible...

    Donc au final c'est la cardinalité et le degré de "restriction" de la jointure utilisée entre les 2 selects qui détermine si il est plus couteux d'utiliser une clause WITH ou une vue en ligne...

    Pour résumer, mettre un Select lourd qui va chercher plusieurs milliers le lignes dans une clause WITH pour finalement n'en utiliser qu'une ou deux par la jointure c'est mauvais pour les perf.
    Alors que si TOUTES (ou presque) les lignes de ce Select sont à utiliser par la suite, pour des comparaisons dans des clauses IN, ou Exists, ou autre... alors là c'est bien meilleur que la vue en ligne qui devrait refaire ce même Select à chaque fois (à chaque Row) en y incluant la jointure avec le Select principal...

    voilà ce que j'en sais et ce que j'ai pu constater à l'usage...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Yorglaa
    Salut à tous,
    En fait ça dépend de la "lourdeur" du Select que tu fait dans la clause WITH et de sa jointure avec le select principal...

    Avec la clause WITH, le Select ainsi factorisé est FORCEMENT exécuté pour sa totalité (tous les rows) avant d'être utilisé dans le Select principal.

    Par contre, avec la vue en ligne (plus communément inline view) Oracle essaye tout d'abord de TRANSFORMER le select de la vue en ligne en fonction de la (les) jointure(s) sur le Select principal pour n'en faire qu'un seul Select le plus performant possible...

    Donc au final c'est la cardinalité et le degré de "restriction" de la jointure utilisée entre les 2 selects qui détermine si il est plus couteux d'utiliser une clause WITH ou une vue en ligne...

    Pour résumer, mettre un Select lourd qui va chercher plusieurs milliers le lignes dans une clause WITH pour finalement n'en utiliser qu'une ou deux par la jointure c'est mauvais pour les perf.
    Alors que si TOUTES (ou presque) les lignes de ce Select sont à utiliser par la suite, pour des comparaisons dans des clauses IN, ou Exists, ou autre... alors là c'est bien meilleur que la vue en ligne qui devrait refaire ce même Select à chaque fois (à chaque Row) en y incluant la jointure avec le Select principal...

    voilà ce que j'en sais et ce que j'ai pu constater à l'usage...

    Dans mon cas, le select de la clause with faisait une jointure sur 4 tables pour ne ramener qu'une seule ligne, ça aurait donc dû être plus performant.
    Autre question que se passe t'il s'il existe déjà une vue qui porte le même nom que l'alias utilisé dans la clause with? je suppose que la requête utilise l'alias.

  7. #7
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par ljoly
    Dans mon cas, le select de la clause with faisait une jointure sur 4 tables pour ne ramener qu'une seule ligne, ça aurait donc dû être plus performant.
    Il est difficile d'être aussi catégorique !
    parce que ce que je voulais faire comprendre, c'est que c'est L'INTERACTION entre les 2 selects qui est importante... et pas seulement la volumétrie finale (les Rows ramenés) qui est en cause.
    Si ton Select factorisé brasse 50 millions de lignes avant de te ramener ce seul Row, alors il sera long...
    alors que, si il est directement mis en jointure dans le Select principal, cette jointure est peut-être justement assez "discriminante" pour que ce même select ne brasse plus que 2000 lignes pour te ramener ce même Row...
    Citation Envoyé par ljoly
    Autre question que se passe t'il s'il existe déjà une vue qui porte le même nom que l'alias utilisé dans la clause with? je suppose que la requête utilise l'alias.
    hummm je serais tenté de dire que le Select entre le parenthèses du WITH ne voit pas les éléments du Select principal... PAR CONTRE TOUS les éléments du Select principal, y compris une vue en ligne verront la requêtes factorisé par l'alias définit pasr la clause WITH.

    du coup, et dans un soucis de relecture, je te conseillerais d'avoir des alias différenciés.

Discussions similaires

  1. SQL dynamique et clause WITH
    Par romu92 dans le forum Développement
    Réponses: 3
    Dernier message: 21/10/2009, 13h05
  2. [SQL Server 2005] Clause order by sur un curseur
    Par nox75 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/09/2008, 16h45
  3. Réponses: 1
    Dernier message: 16/10/2007, 18h58
  4. [PL/SQL] curseurs et valeur Null dans la clause WHere
    Par etoileDesNeiges dans le forum Oracle
    Réponses: 13
    Dernier message: 11/12/2006, 17h58
  5. [PL/SQL] Curseur avec Paramètre
    Par blids dans le forum Oracle
    Réponses: 5
    Dernier message: 10/10/2004, 21h07

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