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 :

Clause "Where" Importante


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 32
    Par défaut Clause "Where" Importante
    Bonjour,

    Mon programme construit un select avec une clause "Where" variable. Le problème est que celle-ci peut atteindre plusieurs milliers de lignes. Voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select X, Y  from t1
    where (t1.X = 'aaa' and t1.Y = '1')
    OR
    (t1.X = 'bbb' and t1.Y = '2')
    OR
    (t1.X = 'ccc' and t1.Y = '3')
    OR 
    ....
    Vous comprendrez les OR pouvant atteindre 100 000 lignes peuvent être trés lent lors de l'exécution de la requête, voire même oracle plante !
    Il faut savoir que la clause Where sera affinée au fur et à mesure de l'exécution.

    Si vous avez des idées à m'apporter pour améliorer tout çà.

    Merci

    Séb

  2. #2
    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
    c'est plus compliqué à faire mais plutôt que d'ajouter des OR tu devrais affiner un IN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT X, Y  FROM t1
    WHERE (t1.X IN ('aaa','bbb','ccc') AND t1.Y IN ('1','2','3'))
    L'idéal étant bien entendu de créer une table temporaire que tu renseignes et mettre une clause WHERE fixe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT X, Y  FROM t1, t1_filter
    WHERE (t1.X,t1.Y) = (t1_filter.X,t1_filter.Y)

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Par défaut
    Citation Envoyé par orafrance Voir le message
    c'est plus compliqué à faire mais plutôt que d'ajouter des OR tu devrais affiner un IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT X, Y  FROM t1
    WHERE (t1.X IN ('aaa','bbb','ccc') AND t1.Y IN ('1','2','3'))
    Je ne pense pas qu'il puisse utiliser la clause IN car au maximum elle peut prendre 1 000 valeurs brutes.

    Le mieux est donc la table temporaire

  4. #4
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 32
    Par défaut
    J'avais pensé à la création d'une table temporaire pour y ajouter une clause fixe. Dans ce cas là, il va y avoir des ajouts au début pour y insérer les lignes et au fur et à mesure, on en supprimera certaines.

    Est ce que çà ne va pas être trop pénalisant, sur un long traitement ?


    Ensuite, pour l'exemple que tu as donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT X, Y  FROM t1
    WHERE (t1.X IN ('aaa','bbb','ccc') AND t1.Y IN ('1','2','3'))
    est ce que ça ne va pas me sortir toutes les lignes ?
    par exemple :
    - aaa 1
    - aaa 2
    - aaa 3
    - bbb 1
    - bbb 2
    - bbb 3
    - ccc 1
    - ccc 2
    - ccc 3

  5. #5
    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 sebb84 Voir le message
    Est ce que çà ne va pas être trop pénalisant, sur un long traitement ?
    Beaucoup moins que le "plantage" de la session

    Citation Envoyé par sebb84 Voir le message
    est ce que ça ne va pas me sortir toutes les lignes ?
    In the test we trust

    Mais oui

  6. #6
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 32
    Par défaut
    Merci bien pour les réponses,

    je vais de ce pas tester ....

  7. #7
    Expert confirmé 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
    Par défaut
    Citation Envoyé par sebb84 Voir le message
    Bonjour,

    Mon programme construit un select avec une clause "Where" variable. Le problème est que celle-ci peut atteindre plusieurs milliers de lignes. Voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select X, Y  from t1
    where (t1.X = 'aaa' and t1.Y = '1')
    OR
    (t1.X = 'bbb' and t1.Y = '2')
    OR
    (t1.X = 'ccc' and t1.Y = '3')
    OR 
    ....
    Vous comprendrez les OR pouvant atteindre 100 000 lignes peuvent être trés lent lors de l'exécution de la requête, voire même oracle plante !
    Il faut savoir que la clause Where sera affinée au fur et à mesure de l'exécution.

    Si vous avez des idées à m'apporter pour améliorer tout çà.

    Merci

    Séb
    Ca a l'air d'un problème mal posé et le contexte n'est pas clair.
    Est-ce que n'est pas plus simple de tout sélectionner et ensuite gérer les OR dans la suite du traitement ?

  8. #8
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 32
    Par défaut
    Ca a l'air d'un problème mal posé et le contexte n'est pas clair.
    Non pas du tout, orafrance a trés bien répondu !
    Est-ce que n'est pas plus simple de tout sélectionner et ensuite gérer les OR dans la suite du traitement ?
    Bien évidement que ceci est un exemple plus simple que dans la réalité afin de pouvoir exposer mon problème. Afin d'éviter de retourner toutes la base à chaque fois que je vais effectuer un select pour filtrer les enregs de départ.
    C'est une solution pour avoir directement la liste utile.

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