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

 MySQL Discussion :

Optimiser Requêtes entre plusieurs tables


Sujet :

MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut Optimiser Requêtes entre plusieurs tables
    Bonjour,

    Comment je pourrais optimiser cette requête ?

    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
    27
    28
    29
     
    SELECT *
    FROM t_DNS_UA as T1
    WHERE NOT EXISTS ( SELECT NULL
              		      FROM  t_Server2 as T2,
    				       t_Server3 as T3,
                                           t_Server4 as T4,
    				       t_Server5 as T5,
    				       t_Server6 as T6,
    				       t_Server7 as T7,
    				       t_Server8 as T8
                                  WHERE     T1.AdresseIP LIKE T2.AdresseIP
    				       OR T1.AdresseIP LIKE T3.AdresseIP
    				       OR T1.AdresseIP LIKE T4.AdresseIP
    				       OR T1.AdresseIP LIKE T5.AdresseIP
    				       OR T1.AdresseIP LIKE T6.AdresseIP
    				       OR T1.AdresseIP LIKE T7.AdresseIP
    				       OR T1.AdresseIP LIKE T8.AdresseIP
                                           AND ( 
                                                    T1.Etat LIKE 'Activé'
                                             AND T2.Etat LIKE 'Activé'
                                             AND T3.Etat LIKE 'Activé'
                                             AND T4.Etat LIKE 'Activé'
                                             AND T5.Etat LIKE 'Activé'
                                             AND T6.Etat LIKE 'Activé'
                                             AND T7.Etat LIKE 'Activé'
                                             AND T8.Etat LIKE 'Activé'
                                  )
                       );
    Cette requête doit retourner tous les enregistrements de la Table "DNS" où "l'adresse IP" n'existe pas aucune des tables "Serveur" dont l'état est indiqué "Activé".

    Merci pour votre rapide aide.
    Cette requête est excessivement lente et ce n'est pas top.

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Quels index sont déclarés sur ces tables ?

    L'emploi de LIKE est-il obligatoire sur la colonne etat ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Il y a plusieurs remarques à formuler.
    - Utilisation de LIKE au lieu de =
    - La série de OR peut être remplacée par IN
    - Produit cartésien des 7 tables
    - Certainement une grosse erreur de conception en amont.

    Vous pouvez simplifier en deux temps avec une vue par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE VIEW AS listeServeur AS
      SELECT AdresseIP, Etat FROM t_Server2
      UNION
      SELECT AdresseIP, Etat FROM t_Server3
      UNION
      SELECT AdresseIP, Etat FROM t_Server4
      UNION
      SELECT AdresseIP, Etat FROM t_Server5
      UNION
      SELECT AdresseIP, Etat FROM t_Server6
      UNION
      SELECT AdresseIP, Etat FROM t_Server7
      UNION
      SELECT AdresseIP, Etat FROM t_Server8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM t_dns_ua AS T1
    WHERE NOT EXISTS (
      SELECT *
      FROM listeServeur AS T2
      WHERE T1.AdresseIP = T2.AdresseIP
        AND T2.Etat = 'Activé'
    )

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    Bonjour,
    Merci pour vos réponses.
    Alors je vais répondre dans l'ordre, l'utilisation de LIKE n'est pas obligatoire et il n'y a pas d'index.
    D'ailleurs, étant complètement newbee, je pense que ma base est loin d'être optimisée mais je ne sais pas comment faire alors...
    Sinon je ne comprends pas la différence entre LIKE et = dans ce contexte.
    Merci pour vos infos.

    Pour la création de la vue, je viens de le faire et il y a une erreur dans la requête, ce n'est pas CREATE VIEW AS Vue AS Table mais CREATE VIEW Vue AS Table.
    (cette remarque juste pour ceux qui liraient ce topic afin qu'ils fassent la correction et ne se prennent pas la tête)

    Et sinon juste au passe, comme je le disais je suis newbee donc niveau bien utiliser correctement les requêtes j'ai encore pas mal de choses à apprendre surtout que ce n'est pas mon domaine, je m'autoforme alors...

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    Je viens d'utiliser la requête suite à la création de la vue et celle-ci me retourne bien les infos recherchées. Merci
    Par contre j'aurai une question sur cette fonctionnalité qu'est la vue, comment ça marche ?
    C'est entièrement dynamique ?? Les données de la vue sont récupérées dynamiquement dans les autres table qd on accède à la vue ou il faut réinjecter les données de tps en tps qd les données des autres tables évoluent ??
    Qu'elle est l'intérêt des vue et des tables ainsi que des index ?
    Merci pour ces infos qui pourraient m'aider pour l'avenir de mon projet.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    D'ailleurs, étant complètement newbee, je pense que ma base est loin d'être optimisée mais je ne sais pas comment faire alors...
    Tu as tout ce qu'il te faut pour bien te former au SQL sur le site de SQLPro.
    Commence par la modélisation Merise puis enchaîne avec le SQL de A à Z.

    Citation Envoyé par Korben-Dallas Voir le message
    Par contre j'aurai une question sur cette fonctionnalité qu'est la vue, comment ça marche ?
    Réponse encore chez SQLPro.
    En résumé, une vue est une requête enregistrée en BDD et qui retourne une structure semblable à une table et qui peut à son tour être requêtée comme une table.

    C'est entièrement dynamique ??
    Oui. Mais il faut écrire la requête de la vue quand même !

    Les données de la vue sont récupérées dynamiquement dans les autres table qd on accède à la vue
    Oui.

    Qu'elle est l'intérêt des vue et des tables ainsi que des index ?
    Dans l'ordre :
    1) Les tables servent à enregistrer physiquement les données d'une manière organisée.
    2) Les vues permettent de limiter l'accès aux données et/ou de faciliter l'écriture de requêtes répétitives à jointures.
    3) Les index servent à optimiser les temps de traitement parce que le SGBD cherche d'abord dans les index les valeurs qui l'intéressent pour les jointures ou les valeurs qui lui sont demandées.

    Bonne lecture chez SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    OK Merci pour l'info.
    Il est vrai que j'avais été voir sur MySQL et SQL Server (les 2 types de SQL que j'utilise) mais je n'avais pas été voir ce SQL Pro.
    Et puis, il y a tellement de choses à comprendre et à chercher qu'on ne sait pas forcément par où commencer lorsqu'on débute et que le SGBD n'est pas son domaine de prédilection.
    Bon sinon je vais donc aussi mettre ce topic en résolu.

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

Discussions similaires

  1. [1.x] Flux RSS + requête entre plusieurs tables liées
    Par blasil64 dans le forum Symfony
    Réponses: 3
    Dernier message: 09/01/2010, 10h30
  2. [Requête] Sommes entre plusieurs tables
    Par Ithilien dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 05/01/2007, 15h34
  3. [SQL] Une requête dans plusieurs tables
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2005, 16h23
  4. [Débutant] requete entre plusieurs tables
    Par xufux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 14h00
  5. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25

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