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

Langage SQL Discussion :

Query execution was interrupted


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Query execution was interrupted
    Bonjour,

    je rencontre un problème sur le projet sur lequel je travaille actuellement.
    Pour simplifier, j'ai une table stockant des annonces et une table stockant des villes, dont voici la structure :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    CREATE TABLE IF NOT EXISTS `logsen_annonces_services_a_domicile` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `date` date NOT NULL,
      `user_id` int(11) NOT NULL,
      `niveau` tinyint(1) NOT NULL,
      `paiement` tinyint(1) NOT NULL,
      `etablissement_nom` varchar(200) NOT NULL,
      `etablissement_adresse` varchar(200) NOT NULL,
      `etablissement_region_id` int(11) NOT NULL,
      `etablissement_departement_id` int(11) NOT NULL,
      `etablissement_ville_id` int(11) NOT NULL,
      `etablissement_telephone` varchar(20) NOT NULL,
      `etablissement_photo` varchar(200) NOT NULL,
      `etablissement_logo` varchar(200) NOT NULL,
      `etablissement_video` varchar(200) NOT NULL,
      `etablissement_plaquette` varchar(200) NOT NULL,
      `etablissement_contact` varchar(200) NOT NULL,
      `etablissement_statut_juridique` tinyint(4) NOT NULL COMMENT 'table listes_statuts_juridiques',
      `accepte_cesu` tinyint(1) NOT NULL,
      `type_prestataire` tinyint(4) NOT NULL COMMENT 'table listes_types_prestataires',
      `type_agrement` tinyint(4) NOT NULL COMMENT 'table listes_types_agrements',
      `certification` tinyint(4) NOT NULL COMMENT 'table listes_certifications',
      `certification_custom` varchar(200) NOT NULL,
      `presentation` text NOT NULL,
      `jours_ouverture` text NOT NULL,
      `horaires` text NOT NULL,
      `promotion` text NOT NULL,
      `video_offre_speciale` varchar(250) NOT NULL,
      `telephone_hits` int(11) NOT NULL,
      `statut` tinyint(1) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1440 ;
     
    CREATE TABLE IF NOT EXISTS `logsen_geo_villes` (
      `id` int(255) NOT NULL AUTO_INCREMENT,
      `departement_id` varchar(5) NOT NULL,
      `nom` varchar(255) NOT NULL,
      `nom_originel` varchar(255) NOT NULL,
      `cp` varchar(255) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `cp` (`cp`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=36828 ;
    Et voici la requête qui me pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ANNONCES.* 
    FROM logsen_geo_villes VILLES, logsen_annonces_services_a_domicile ANNONCES 
    WHERE ANNONCES.statut = 1 
    AND ((VILLES.id = ANNONCES.etablissement_ville_id AND VILLES.cp = "76600") OR (ANNONCES.etablissement_departement_id = "76")) 
    GROUP BY ANNONCES.id LIMIT 0, 10
    Cette requête me retourne l'erreur suivante : Query execution was interrupted

    J'ai essayé en virant soit le test sur la ville :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ANNONCES.* 
    FROM logsen_geo_villes VILLES, logsen_annonces_services_a_domicile ANNONCES 
    WHERE ANNONCES.statut = 1 
    AND ((VILLES.id = ANNONCES.etablissement_ville_id AND VILLES.cp = "76600")) 
    GROUP BY ANNONCES.id LIMIT 0, 10
    Soit le test sur le departement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ANNONCES.* 
    FROM logsen_geo_villes VILLES, logsen_annonces_services_a_domicile ANNONCES 
    WHERE ANNONCES.statut = 1 
    AND ((ANNONCES.etablissement_departement_id = "76")) 
    GROUP BY ANNONCES.id LIMIT 0, 10
    et ces 2 requêtes fonctionnent, elle me retournent 22 et 6 résultats. Rien de faramineux donc..
    Par contre ma table des villes comportent environ 36000 entrées.
    Auriez-vous une idée d'où peut venir le problème ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  ANNONCES.* 
    FROM    logsen_annonces_services_a_domicile ANNONCES 
    WHERE   ANNONCES.statut = 1 
        AND (   ANNONCES.etablissement_departement_id = '76'
            OR  EXISTS
                (   SELECT  NULL   
                    FROM    logsen_geo_villes VILLES
                    WHERE   VILLES.id = ANNONCES.etablissement_ville_id
                        AND VILLES.cp = '76600'
                )
            )
    ORDER BY ANNONCES.id
    LIMIT   0, 10
    Au passage, ton GROUP BY ne servait à rien et un SGBD respectant la syntaxe SQL aurait du refuser cette clause.

  3. #3
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Si je veux faire une jointure externe sur une table commentaires liée à ma table d'annonce, je suis par contre obligé de faire un GROUP BY ? dans ce genre la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  ANNONCES.*, (SUM(note_encadrement) + SUM(note_animations) + SUM(note_proprete) + SUM(note_cadre) + SUM(note_restauration) + SUM(note_soins)) / COUNT(COMMENTAIRES.id) / 6 AS note
    FROM    logsen_annonces_services_a_domicile ANNONCES
    LEFT OUTER JOIN logsen_commentaires COMMENTAIRES ON COMMENTAIRES.parent_id = 0 AND COMMENTAIRES.annonce_id = ANNONCES.id AND COMMENTAIRES.annonce_type = 6 
    WHERE   ANNONCES.statut = 1 
        AND (   ANNONCES.etablissement_departement_id = '76'
            OR  EXISTS
                (   SELECT  NULL   
                    FROM    logsen_geo_villes VILLES
                    WHERE   VILLES.id = ANNONCES.etablissement_ville_id
                        AND VILLES.cp = '76600'
                )
            )
    GROUP BY ANNONCES.id
    ORDER BY note DESC
    Cette requête fonctionne également très bien.
    Pourrais-tu m'expliquer qu'est ce qui bouffait autant de mémoire dans ma requête originelle ? Je n'arrive pas à comprendre pourquoi SQL n'arrivait pas à la traiter alors qu'elle semble assez simple.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Il faudrait regarder les plans d'exécution des 2 requêtes (celle qui passe et l'autre) pour comprendre où l'optimiseur s'est trompé et n'a pas choisi le chemin optimal.

  5. #5
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Il faudrait regarder les plans d'exécution des 2 requêtes (celle qui passe et l'autre) pour comprendre où l'optimiseur s'est trompé et n'a pas choisi le chemin optimal.
    Comment regarde fait-on un plan d'execution de requete ? phpmyadmin le fait ? Il faut un logiciel special ?

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il me semble que dans votre requête initiale qui pose souci, votre condition de jointure n'est pas bien placée, et que vous pouvez avoir un produit cartésien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (VILLES.id = ANNONCES.etablissement_ville_id ...) OR (ANNONCES.etablissement_departement_id = "76")
    donc N annonces fois 36000 villes, ça peut commencer à pas plaire a MySQL...

    Utilisez les jointures normalisées, vos requêtes n'en seront que plus lisibles

Discussions similaires

  1. Query execution was interrupted
    Par widi70 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 11/12/2014, 16h24
  2. Réponses: 2
    Dernier message: 15/08/2013, 18h41
  3. [MySQL] Erreur : Query was empty(execution plusieurs requetes)
    Par fred619 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/05/2011, 00h06
  4. Série de query réalisés sans interruption ?
    Par Sergejack dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 27/08/2009, 11h03
  5. Réponses: 8
    Dernier message: 19/07/2004, 14h34

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