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

Requêtes MySQL Discussion :

Recherche AdresseIP dans Plage d'adresses


Sujet :

Requêtes MySQL

  1. #21
    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 : 47
    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
    La requête a été lancée sur une table contenant un peu moins de 9000 Clients et sa table correspondante contenant environ 380 Réseaux
    Au bout de 15 min les résultats ne sont toujours pas affichés, il faut savoir que j'ai volontairement mis un timeout de 30min afin de savoir combien de tps les requêtes peuvent durer.

    Alors en lançant cette requête sur environ 50000 Clients et 1800 Réseaux, je n'ose pas imaginer ce que ça donnera.

  2. #22
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    La requête a été lancée sur une table contenant un peu moins de 9000 Clients et sa table correspondante contenant environ 380 Réseaux
    Au bout de 15 min les résultats ne sont toujours pas affichés, il faut savoir que j'ai volontairement mis un timeout de 30min afin de savoir combien de tps les requêtes peuvent durer.

    Alors en lançant cette requête sur environ 50000 Clients et 1800 Réseaux, je n'ose pas imaginer ce que ça donnera.
    commencer par vérifier que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT C1.AdresseIP
              FROM t_Clients AS C1, 
                     t_Serveurs AS R1
              WHERE (C1.AdresseIP_Traitee < R1.AdresseDebutPlage_Traitee) OR (C1.AdresseIP_Traitee > R1.AdresseFinPlage_Traitee)
    fonctionne correctement…

    votre "distinct" sur un champ calculé avec "concat, left et C°" est un tueur de perfs…

  3. #23
    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 : 47
    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,

    Je viens de tester cette requête et celle-ci me donne les adresses comprises dans les plages IP.
    Pour des pb de confort et pour savoir si celle-ci retourne les bonnes valeurs ; dans un 1er tps, je l'ai testée sur une table ne contenant que environ 150 clients et 50 Réseaux.
    J'en perds vraiment mon latin.

  4. #24
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    Bonjour,

    Je viens de tester cette requête et celle-ci me donne les adresses comprises dans les plages IP.
    Pour des pb de confort et pour savoir si celle-ci retourne les bonnes valeurs ; dans un 1er tps, je l'ai testée sur une table ne contenant que environ 150 clients et 50 Réseaux.
    J'en perds vraiment mon latin.
    çà c'est normal…
    puisqu'on travaille sur le produit des 2 tables, il suffit que l'adresse IP d'un client ne soit pas dans un des ranges pour que le client apparaisse dans le résultat…

    la question à tester concernait uniquement la vitesse sur le DISTINCT…

    maintenant essayez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT distinct C1.AdresseIP_traitee
              FROM t_Clients AS C1, 
                     t_Serveurs AS R1
              WHERE C1.AdresseIP_Traitee BETWEEN R1.AdresseDebutPlage_Traitee AND R1.AdresseFinPlage_Traitee
    vous ne devriez avoir que les clients dont l'IP est dans un range…

  5. #25
    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 : 47
    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
    J'ai essayé ceci à l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT C1.Domaine, C1.Ordinateur, C1.AdresseIP, C1.AdresseIP_Traitee
    FROM t_Clients AS C1,
         t_ous_Reseaux AS R1
    WHERE (C1.AdresseIP_traitee) NOT IN 
          (
            SELECT C1.AdresseIP_traitee                                                  
            FROM t_Clients AS C1, 
                 t_Reseaux AS R1
            WHERE  C1.AdresseIP_traitee BETWEEN R1.AdresseDebutPlage_traitee AND R1.AdresseFinPlage_traitee
          )
    Il aura fallut un peu moins de 3s pour monter les plusieurs dizaines de clients de la tables contenant pus de 9000 Clients associée à sa table contenant presque 400 Réseaux.

    Je vais essayer en mettant non pas une table mais la vue regroupant toutes les tables.

  6. #26
    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 : 47
    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
    J'ai fait un test pour connaitre la différence de vitesses de traitement de la requête :

    Test effectuée sur une :
    - t_Clients contenant 8790 Clients
    - t_Reseaux contenant 392 Réseaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT C1.AdressesReseaux
    FROM t_Clients AS C1,
         t_Reseaux AS R1
    WHERE (C1.AdresseIP_traitee) NOT IN 
          (
            SELECT C1.AdresseIP_traitee                                                  
            FROM t_Clients AS C1, 
                 t_Reseaux AS R1
            WHERE  C1.AdresseIP_traitee BETWEEN R1.AdresseDebutPlage_traitee AND R1.AdresseFinPlage_traitee
          )
    Résultat de phpMyAdmin :
    Affichage des enregistrements 0 - 29 (45 total, Traitement en 20.5258 sec.)

    La même requête en enlevant le "DISTINCT" donne :
    Affichage des enregistrements 0 - 29 (156 016 total, Traitement en 0.0096 sec.)
    Le tps d'affichage était identique (à peu de choses près), soit assez long mais encore raisonnable. (vingtaine de secondes environ)

    Du coup, se pose maintenant la question de savoir comment optimiser ceci afin de traiter les 50000 Clients et 1800 Réseaux dans des conditions raisonnables.

    En tout cas, on a pas mal avancé et c'est cool ça.
    Ce qui aura aussi permis d'apprendre certaines choses.

  7. #27
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    essayez une solution qui évite le NOT IN …

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select IP 
    from (select inet_ntoa(c.adresseIP) as IP, (
        select (count(*)>0) 
        from t_reseaux r 
        where c.adresseIP between r.adresseDebutPlage and  r.adresseFinPlage
        ) as inrange 
      from t_clients c
      ) as A 
    where inrange = 0 ;
    (les champs d'adresse IP devant être les int évidemment pas les varchar()… n'oubliez pas d'adapter à vos noms de champs…)

  8. #28
    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 : 47
    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'essayer la 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
     
    SELECT IP 
    FROM 
         (
           SELECT C.AdressesReseaux AS IP, 
           (
                  SELECT (count(*)>0) 
                  FROM t_Reseaux R 
                  WHERE c.adresseIP_traitee BETWEEN r.adresseDebutPlage_traitee AND  r.adresseFinPlage_traitee
           ) AS inrange 
           FROM t_Clients c
         ) AS A 
    WHERE inrange = 0 ;
    Celle-ci fonctionne vraiment rapidement, ça n'a rien à voir avec les autres précédentes.
    Par contre, je ne la comprends pas trop. Et qd je l'a teste sur les tables une par une ça va mais comment faire pour la faire exécuter sur la totalité de la base ?
    J'ai les champs "Gestionnaire" et "Serveurs" en commun dans les 2 vues (qui globalisent toute la base) v_ListeClients et v_Plages_Reseaux
    Je pense qu'il faut mettre une jointure mais je ne sais pas trop où et comment la mettre dans cette requête pour que celle-ci fonctionne correctement. J'dois dire que j'ai pensé à faire 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
     
    SELECT IP 
    FROM 
         (
           SELECT C.AdressesReseaux AS IP, 
           (
                  SELECT (count(*)>0) 
                  FROM v_plages_reseaux R 
                  WHERE c.adresseIP_traitee BETWEEN r.adresseDebutPlage_traitee AND  r.adresseFinPlage_traitee
                  AND c.Gestionnaire = r.Gestionnaire
                  AND c.Serveur = r.serveur
           ) AS inrange 
           FROM v_listeclients c
         ) AS A 
    WHERE inrange = 0 ;
    Mais j'ai l'impression que là du coup, ça me remonte d'autres valeurs que je n'ai pas si je ne mets pas ces 2 jointures et que je ne traite qu'une seule table.

    Les 2 vues étant des SELECT ... UNION ... des différentes tables concernées.

    En tout cas, vraiment merci pour l'aide, j'avance vraiment maintenant

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/08/2014, 23h24
  2. Macro pour recherche valeur dans plage de cellules sur 2 colonnes.
    Par bipol51430 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2014, 10h43
  3. recherche sur une plage d'adresse IP
    Par Elessar01 dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/03/2010, 08h32
  4. Recherche dans plage de cellules
    Par BATiViR dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/03/2007, 13h31
  5. Recherche dans plage de valeur :
    Par lafouine dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/04/2005, 11h38

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