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

SQL Oracle Discussion :

[9i] Jointure sur chaine de caractère


Sujet :

SQL Oracle

  1. #1
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut [9i] Jointure sur chaine de caractère
    Bonjour,

    voilà, j'aimerai améliorer une requête mais j'ai beu la tourner dans tout les sens, ça reste très moyen. si quelqu'un a une idée ... en fait, je pensais qu'il existait des "coups spéciaux" pour joindre efficacement deux tables par des chaines de caractère.

    Je m'explique. J'ai deux petites requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT period_id /* entier*/, eac2 /*decimal*/, ca_short_name /* varchar2*/
        FROM admuser.histo_tasksum
        WHERE (wp_bo_number = 'CA'
            OR wp_bo_number = 'MR'
            OR wp_bo_number = 'MC'
            OR wp_bo_number = 'PC')
    ici, elle met 93 ms et retourne 57000 lignes

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT wbs_short_name /*varchar2*/
            FROM admuser.projwbs
            WHERE proj_node_flag = 'Y'
            AND delete_date IS NULL
            START WITH wbs_short_name IN ('P-01034')
            CONNECT BY PRIOR wbs_id = parent_wbs_id
    ici 531 ms et 294 lignes.

    Je veux joindre ces deux sous requêtes par ca_short_name = wbs_short_name


    et là je me retrouve avec un temps d'exécution variant entre 15 et 20 sec suivant la technique que j'emploie ... (tout ça pour récupérer 383 lignes)

    Avez vous une technique pour accélérer cette requete ? genre transformer la chaine en nombre

    [EDIT] si j'enlève le WHERE (wp_bo_number = 'CA' ... j'atteins les 4 sec
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    C'est comme ça que tu as fait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT period_id /* entier*/, eac2 /*decimal*/, ca_short_name /* varchar2*/
    FROM admuser.histo_tasksum
    WHERE (wp_bo_number = 'CA'
        OR wp_bo_number = 'MR'
        OR wp_bo_number = 'MC'
        OR wp_bo_number = 'PC')
    AND ca_short_name IN (SELECT wbs_short_name /*varchar2*/
    			FROM admuser.projwbs
    			WHERE proj_node_flag = 'Y'
    			AND delete_date IS NULL
    			START WITH wbs_short_name IN ('P-01034')
    			CONNECT BY PRIOR wbs_id = parent_wbs_id)
    PS : Depuis une ORA-00600 récalcitrante sur un connect by, je déteste cette d'instruction
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    non, là je tape dans les 3 min ... peut être avec un EXIST mais je n'y arrive pas réellement ...

    bon je pense que ya pas de solution miracle, je vais tatonner et on verra bien ...

    je vais mettre en délestage.

    Je pensais quand même que y'avait "un truc"

    Merci quand même ...

    [EDIT] en fait je viens de tester, en remplaçant le
    WHERE wp_bo_number = 'CA' ...

    par
    LENGTH(wp_bo_number) = 2

    je descend à 2 sec. En pratique ça marche car je n'ai que ces valeurs. En théorie c'est pas cool parce que ça risque de me retourner des trucs faux.

    Enfin, si j'applique la clause where initiale au 383 enregistrements retournés par la méthode précendenten je retombe à 15 sec ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    bon je crois que j'ai ma solution (3 sec) ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT period_id, eac2, ca_short_name
    FROM (
        SELECT period_id, ca_short_name, eac2, wp_bo_number
        FROM admuser.histo_tasksum
        WHERE wp_bo_number = 'CA'
        UNION
        SELECT period_id, ca_short_name, eac2, wp_bo_number
        FROM admuser.histo_tasksum
        WHERE wp_bo_number = 'PC'
        UNION
        SELECT period_id, ca_short_name, eac2, wp_bo_number
        FROM admuser.histo_tasksum
        WHERE wp_bo_number = 'MR'
        UNION
        SELECT period_id, ca_short_name, eac2, wp_bo_number
        FROM admuser.histo_tasksum
        WHERE wp_bo_number = 'MC'
        ) histo JOIN
        (
        SELECT wbs_short_name
        FROM admuser.projwbs
        WHERE proj_node_flag = 'Y'
        AND delete_date IS NULL
        START WITH wbs_short_name IN ('P-01034')
        CONNECT BY PRIOR wbs_id = parent_wbs_id
        ) pw ON histo.ca_short_name = pw.wbs_short_name
    Je ne sais pas si quelqu'un d'expérimenté pourra me donner une explication ... pourquoi 4 union vont plus vite qu'un where (5 fois mieux quand même) ...

    Enfin bon, je ne déleste plus, peut être qu'un jour ça servira à quelqu'un ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Mieux vaut mettre UNION ALL que UNION si les données sont forcément différentes (tu as wp_bo_number dans le select). Ca évitera un tri.

    Pour l'explication, faut voir l'explain plan.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Oui c'est encore un peu mieux, merci
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

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

Discussions similaires

  1. opération sur chaine de caractères
    Par Matmal11 dans le forum Linux
    Réponses: 4
    Dernier message: 31/01/2007, 11h47
  2. condition sur chaine de caractère
    Par trax44 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 24/01/2007, 15h12
  3. Travail sur chaines de caractères
    Par g.greg45 dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2006, 19h11
  4. Travail sur chaine de caractère
    Par corben dallas dans le forum Access
    Réponses: 4
    Dernier message: 02/01/2006, 19h22
  5. [Debutant][Tableau] Tableau indexé sur chaine de caractères
    Par SamRay1024 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/05/2004, 11h14

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