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

Langage SQL Discussion :

connect by prior


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut connect by prior
    Bonjour,

    juste une petite question :
    Oracle permet de gérer le concept de requêtes récursives, à l'aide des clauses suivantes : start-with et connect by

    est-ce que c'est une bonne chose ?
    En gros, est-ce que ça plombe les perfs ?

    Etant donné que j'ai au moins 170000 enregistrements ? Est-ce une bonne chose.

    Vous me direz vaut mieux utiliser ça que faire des sous-requetes ou des auto jointures.....

    Ma table a beaucoup de colonne.

    pour faire simple j'ai

    operation_id,-----nom, ------operation_precedent
    1---------"operation1"---------null
    2---------"operation2"--------- 1
    3 --------- "operation3"--------- 2
    4 --------- "operation4" --------- null
    5 ---------"operation5"--------- 4


    Je dois récupérer chaque chaine.

    En gros, j'aurai les chaines suivantes : 3->2->1 et 5->4.

    J'ai pas envie de savoir la requête, je la ferai en m'aidant des docs, mais j'aimerai juste savoir, si utiliser connect by est une bonne chose pour les perfs ?

    ou bien, y -a t-il un autre moyen ?

    Ma question : est-ce que connect by est conseillé ?

    merci

  2. #2
    Membre régulier Avatar de Doracle
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2010
    Messages : 60
    Points : 74
    Points
    74
    Par défaut
    Le principe des requêtes hiérarchiques (et non pas récursives) est que justement il va parcourir tous les tuples de ta table et chercher a faire uné égalité entre ta clef étrangère et ta clef primaire. Comme le principe des jointures, sauf que là forcément c'est une "self-join", que tu peux traduire par "jointure sur elle-même".
    Dans ton cas tu nous montres un échantillon des tuples de la table ou le contenu total mais seulement certaines colonnes ?

    Car si tu as peu de lignes, il n'y aura pas de souci. Par contre c'est vrai que le récursif est souvent gourmand en ressources. Mais le problème sera le même si tu fais le traitement dans ton code. Par contre j'avoue ne pas connaître d'autres alternatives efficaces ... Mais je te conseillerai quand même le CONNECT BY.

    Au niveau de la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT operation_id, nom, operation_precedent, LEVEL
    FROM matable
    START WITH operation_id=1
    CONNECT BY PRIOR operation_id=operation_precedent;
    START WITH indique a partir de quel moment de la table tu vas commencer le parcours récursif, ainsi tu peux générer des "arbres" restreints. CONNECT BY PRIOR indique les 2 champs en lien.
    La colonne virtuelle LEVEL est intéressante, elle indique le niveau au sein de l'arbre, et donc si tu cherches a faire des manipulations c'est souvent sur cette colonne que cela se fait.

    En espérant t'avoir aidé.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    1) CONNECT BY / PRIOR est spécifique à Oracle et ne fait pas partie du SQL. Le langage SQL accepte les requêtes récursives avec le concept de CTE depuis la version 1999 de la norme. Voir l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/s...te-recursives/

    2) si vous avez une arborescence, toute requête récursive est plus consommatrice que n'importe quel autre traitement itératif et assez mal optimisable, même avec de bons index.

    3) si vous voulez des performances dans l'interrogation des arbres, optez pour une représentation de votre arborescence en mode intervallaire. Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/arborescence/

    Voir aussi mon blog pour les sujet connexes !

    A +

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    Je ne montre que les tuples, car il y a beaucoup de colonne, et de toute manière, je récupérerai l'operation_id, nom et operation_precedent.


    Oui merci !!!! de toute manière, je ne vois pas aussi comment faire :d à part ça !!
    car si je m'amuse à traiter ça avec le code, je risque de faire plein de requête..........

    et ce n'est pas dit que c'est plus optimale !

    Merci en tout cas.

    Est-ce possible de mettre des conditions where dans la requete que tu m'a montré ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    ooo cool !!

    merci, je vais lire en détail ! et si le moindre problème, je te poserai des questions.

    merci !

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    le problème avec le système à intervalle, c'est que cela me fait changer ma structure de la base et aussi mettre à jour les 200000 enregistrements avec un script (qui faut bien entendu qui soit correcte ) et cela fait aussi changer le code java pour prendre en compte ce système.

    Le risque est trop important.

    La question que je me pose, le connect by consomme peut etre beaucoup de ressources, mais là je l'utilise pour un batch de purge qui sera exécuté le soir (quand tout le monde fait dodo )!!

    donc cela peut-il poser un souci au niveau des ressources même si on sait que personne ne travaille sur la base ??

    Car actuellement, nous sommes entrain de mettre en place un système d'archivage/purge qui n'a pas été conçu lors du développement il y a 3 ans.

    Il faudra archiver toutes les données actuelles, nous n'allons pas le faire tout d'un coup, ça va être lourd ! mais petit à petit (je ne connais pas encore le nombre d'enregistrements).

    A terme, il y aura surement 5000 enregistrements à purger par jour/semaine (comparé à 200000 au début ).

    C'est pourquoi, je me pose la question d'utiliser le connect by même si cela consomme beaucoup mais c'est pendant la nuit, (à moins qu'au matin, il n'est pas terminé )!!!

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Le mieux c'est encore d'essayer, il y a tant de paramètres qui rentrent en jeu sur le temps d'exécution d'une requête.

    Votre table peut faire 170 000 lignes, si elle fait 3 Mo ou 2 Go ce ne sera pas la même histoire.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    j'ai testé ce matin sur un jeu de donnée de 2 millions d'enregistrements.

    Il a mis 406s !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    une autre petite question,
    supposé que je dois faire un insert de ces 2 millions d'enregistrements.
    Car lors du processus de purge, on dois récupérer les identifiants technique des opérations et les stocker dans une table "EXTRACTION" avant de les supprimer des tables d'origines OPERATION.

    Donc je fais mon select avec count by et je fais une boucle en Java sur les résultats (2 millions d'enregistrement) en faisant un insert....

    for (listeresultat){
    insert...
    }


    A votre avis, (car je ne peux pas le tester encore), le temps d'exécution des inserts avec cette boucle sera t'elle longue ?

    Ensuite une fois que j'ai inséré les opérations dans la table EXTRACTION.

    Je fais un delete from OPERATION where id in (select id from EXTRACTION)

    J'aimerai avoir votre avis sur la durée totale :
    1) select
    2) insert
    3) delete

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    je pense utiliser une procedure stockée pour réaliser ce traitement, ça m'évitera de faire plusieurs aller-retour avec le serveur.

    et ça risque d'être moins lourd je pense !

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Vous faites quoi au juste en java avec vos données ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    rien !!
    En gros, j'ai un batch de purge où je dois faire des contrôles java pour voir si le batch peut etre lancé ou pas, et là je lance mes requetes.....

    Par contre, je viens d'apprendre que chez le client, les procédures stockées sont bannis !!

    Mais ça change pas grand chose, j'ouvrirai un cursor avec jdbc où pour chaque enregistrement, je ferai un insert (dans un table) et un delete de la donnée dans la table d'origine).

    En gros, je fais tout dans une boucle !!!
    Et je mettrai le commit à la fin pour valider les enregistrements !!

    Après moult discussion avec l'équipe, c'est la seule solution viable, en utilisant le connect by.

    J'ai 1h pour la purge, sachant que pour 2 millions d'enregistermnt, j'ai mis 6min.
    Je pense avec ce système gagner du temps !!

    merci en tout cas pour les infos !

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Nul besoin de boucle alors, vous pouvez envoyer vos ordres SQL ensemblistes pour chaque étape.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 117
    Points
    117
    Par défaut
    comment faire pour stocker dans une table (virtuelle ou temporaire) des données qu'on veut stocker temporairement ?

    D'après des collègues, on peut le faire sans passer par un create table....
    mais directement à partir d'une requete select into ????

    j'ai vu sur le net des choses, mais j'aimerai avoir votre avis sur le sujet ?

Discussions similaires

  1. CONNECT BY PRIOR oracle pour MySQL : possible ?
    Par thanaos dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/12/2006, 15h11
  2. Connect By Prior ?
    Par eric95 dans le forum Hibernate
    Réponses: 2
    Dernier message: 05/12/2006, 09h52
  3. Réponses: 6
    Dernier message: 10/05/2006, 15h34
  4. [SQLSERVER] Connect by prior sous SQL Server
    Par marsup54 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/03/2006, 09h49
  5. quel équivalent de start with...connect by prior en DB?
    Par Mittou dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/10/2005, 14h02

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