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 :

2 tables ca va, 3 tables, bonjour les dégats


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Par défaut 2 tables ca va, 3 tables, bonjour les dégats
    C'est encore moi.

    Toujours en quête du temps de réponse le plus court...

    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
    select count(*) from
    (SELECT code  FROM table1
       WHERE 
       table1.col1 IN
        (SELECT table2.col1
         FROM table2
         WHERE  table2.col2= 'mavariable')
         GROUP BY 'mavariable')
         and 
       substr (table1.col2,1,2) IN
        (SELECT table3.col1
         FROM table3
         WHERE table3.col2 = 'var1'
         AND table3.col3 = 'var2')
    )
    J'ai trituré ca dans tous les sens et c'est sous cette forme que j'ai le temps de réponse le plus rapide 8 sec, qui reste bien trop long.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from (select * from table1,table2,table3 where ...)
    Je reconnais que c'est des requetes tordues, mais comment faire?

    Avez vous des suggestions, je suis dans l'impasse?
    Merci a vous.

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Déjà tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT count(*) 
    FROM table1
    WHERE 
       table1.col1 IN
        (SELECT table2.col1
         FROM table2
         WHERE  table2.col2= 'mavariable')
    AND 
       substr (table1.col2,1,2) IN
        (SELECT table3.col1
         FROM table3
         WHERE table3.col2 = 'var1'
         AND table3.col3 = 'var2')
    Ensuite tu peux essayer de regarder si cela n'est pas plus rapide avec des clauses exists :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT count(*) 
    FROM table1
    WHERE EXISTS
        (SELECT null FROM table2
         WHERE  table2.col2= 'mavariable'
         AND table2.col1 = table1.col1)
    AND EXISTS
        (SELECT null
         FROM table3
         WHERE table3.col2 = 'var1'
         AND table3.col3 = 'var2'
         AND table3.col1 = substr (table1.col2,1,2))

  3. #3
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    La 2ieme requete de plaineR me semble la plus pure. Il faut s'assurer qu'il y a bien les index adéquat. Pour ça, il faut que tu saches quelles sont les clauses les plus discriminantes (s'il y en a).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Par défaut
    Résultat des courses :
    en effet la requête avec exists me fait gagner 1 sec sur 8 sec (c'est pas mal)

    Le problème c'est que ce n'est pas assez concluant.
    J'ai donc été obligé de créer une colonne indexée pour appuyer ma recherche et la rendre plus rapide.
    Je passe à 2,5 sec.

    Le truc, c'est que je ne peux pas faire ca pour toutes mes tables.

    Si vous avez d'autres suggestions...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Essaye peut-être de "cibler" tes requêtes sur les colonnes de clefs primaires, au lieu d'utiliser Count(*) et Select *

  6. #6
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Tu as quoi comme volumétrie de tables ? Et comme plan d'exécution ?

  7. #7
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Petites questions:
    - combien de lignes ont tes tables (en gros) ?
    - quel est le resultat de ton comptage (ordre de grandeur)?
    - dans le cas ou le comptage est petit pour un grand nombre de lignes au départ, quel sont les critères qui ont été les plus "filtrants" ?

    Petite remarque:
    Je ne vois pas pourquoi tu es rétissent à la création d'index, les index sont au coeur de toutes bases de données. sans index, aucune chance d'avoir un accés rapide à quoi que ce soit du moment que tu as du volume... imgagine une grosse librairie qui ne te fournie pas les cartons ou les livres sont classés par titre et par auteur... tu va forcément y passer l'après midi pour trouver ce que tu cherche....

  8. #8
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par crazykangourou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from (select * from table1,table2,table3 where ...)
    on pourrait voir la requête complète ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Par défaut requete complete
    Requete complete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT count(*) FROM (SELECT * FROM table1,table2,table3 WHERE  
    table1.col1=table2.col1 and table2.col2='mavarialbe' 
    and substr(table1.col2,0,2)=table3.col1  and table3.col2 = 'var1'  AND table3.col3 = 'var2')

  10. #10
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    je pense que le problème vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substr(table1.col2,0,2)=table3.col1
    si col2 != 0 alors col1=NULL

    1°) ça ne marche pas critère toujours faux
    2°) ça génère du produit cartésien, tu dois d'ailleur le voir dans le plan d'exécution

  11. #11
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Fred, T'as pas confondu substr et decode ?

  12. #12
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu as raison

    Il faudrait le plan d'exécution avant et après alors

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

Discussions similaires

  1. [OL-2010] PST, un ça va, cinq bonjour les dégats
    Par Yepazix dans le forum Outlook
    Réponses: 0
    Dernier message: 12/07/2010, 00h53
  2. [RegEx] un espace ça va deux espaces bonjour les dégats
    Par SpaceFrog dans le forum Langage
    Réponses: 8
    Dernier message: 12/06/2008, 17h43
  3. Réponses: 6
    Dernier message: 21/02/2008, 12h29
  4. 1 instance : oui, 2 instances: bonjour les dégats
    Par od.dev dans le forum Delphi
    Réponses: 11
    Dernier message: 15/12/2006, 17h36
  5. Réponses: 9
    Dernier message: 17/02/2005, 16h41

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