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

PHP & Base de données Discussion :

Forcer l'exécution d'une requête


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Cobol sur Mainframe et Unix AIX
    Inscrit en
    Mars 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cobol sur Mainframe et Unix AIX

    Informations forums :
    Inscription : Mars 2012
    Messages : 196
    Par défaut Forcer l'exécution d'une requête
    Bonjour,

    Je désire faire une requête (visible uniquement par moi, pas par les utilisateurs), mais il y a un message d'erreur m'indiquant que ça risque de durer trop longtemps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur : SQLSTATE[42000]: Syntax error or access violation: 1104 The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay
    comment faire pour forcer l'exécution et ne pas tenir compte de cette erreur ?

    En local, je n'ai pas de pb mais sur mon hébergeur, ça coince.
    L'hébergeur est Online.net

    voici mon appel :
    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
     
    $Req = "
    SELECT b.Libelle_Menu_niv1 as 'Lib_Page', b.Page, count(*) as 'Nb'
      FROM scf_log a, scf_menu_2_niv1 b
     WHERE a.Page = b.Page
     GROUP BY b.Libelle_Menu_niv1, b.Page
     
     UNION ALL
     
     SELECT b.Libelle_Menu_niv2, b.Page, count(*)
      FROM scf_log a, scf_menu_2_niv2 b
     WHERE a.Page = b.Page
     GROUP BY b.Libelle_Menu_niv2, b.Page
     
     UNION ALL
     
     SELECT b.Libelle_Menu_niv3, b.Page, count(*)
      FROM scf_log a, scf_menu_2_niv3 b
     WHERE a.Page = b.Page
     GROUP BY b.Libelle_Menu_niv3, b.Page
     
     UNION ALL
     
     SELECT b.Libelle_Menu_niv4, b.Page, count(*)
      FROM scf_log a, scf_menu_2_niv4 b
     WHERE a.Page = b.Page
     GROUP BY b.Libelle_Menu_niv4, b.Page
     
     ORDER by 3 DESC";
    try {
    	$dbh = $GLOBALS['bdd']->query($Req);
    	$Pages_Log = $dbh->fetchAll();
    }
    catch (PDOException $e) {
    	echo "<h4><br>La requete est : ".$Req;
    	die('<br><strong>Erreur : ' . $e->getMessage()) . "</strong></h4>";
    }
    Merci pour votre aide

    Bonne journée,

    Eddy

  2. #2
    Membre émérite
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 57
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Par défaut
    Bonsoir Eddy,

    En fait, ce n'est pas une question de durée d'exécution. Le paramétrage sur ton serveur utilise une variable système qui limite (SQL_BIG_SELECTS=OFF) le nombre de lignes ou combinaisons de lignes dans une requête (maximum fixé par MAX_JOIN_SIZE).

    Je suppose que tu es conscient que la norme attends de préférence des jointures ?
    Utiliser INNER JOIN si c'est possible, ou des index, peut suffire à faire disparaître ce message, et la requête serait plus efficiente.

    Je t'invite à consulter ce fil du forum et les conseils de Cinephil.

    Si par extraordinaire ta requête est légitime : comme le message le précise, il faut que tu modifies l'une de ces variables système avant ton fetchAll.
    Par exemple avec ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET SESSION SQL_BIG_SELECTS=1
    Ou bien en augmentant la valeur de max_join_size.

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    salut, essaie cela.
    Indexes du type id auto-increment et normaux sur tous tes Libelle_Menu_nivn et Page, jointures et tables temporaires.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    <?php
    $sql1="create temporary table t1
    SELECT b.Libelle_Menu_niv1 as 'Lib_Page', b.Page, count(b.id) as 'Nb'
    FROM scf_log a
    inner join scf_menu_2_niv_1 b on a.Page=b.Page
    GROUP BY b.Libelle_Menu_niv1, b.Page;";
     
     
    $sql2="create temporary table t2 
    SELECT b.Libelle_Menu_niv2, b.Page, count(b.id) as 'Nb'
    FROM scf_log a, scf_menu_2_niv2 b
    WHERE a.Page = b.Page
    GROUP BY b.Libelle_Menu_niv2, b.Page;";
     
     
     
    $sql3="create temporary table t3
    SELECT b.Libelle_Menu_niv3, b.Page, count(b.id) as 'Nb'
    FROM scf_log a
    inner join scf_menu_3_niv_3 b on a.Page=b.Page
    GROUP BY b.Libelle_Menu_niv3, b.Page;"
     
     
     
    $sql4="create temporary table t4
    SELECT b.Libelle_Menu_niv4, b.Page, count(b.id) as 'Nb'
    FROM scf_log a
    inner join scf_menu_4_niv_4 b on a.Page=b.Page
    GROUP BY b.Libelle_Menu_niv4, b.Page;";
     
     
    $sql_all="select t1.*
    UNION ALL
    select t2.*
    UNION ALL
    select t3.*
    UNION ALL
    select t4.*
    ORDER by 'Nb' DESC;";
     
    try {
    	$GLOBALS['bdd']->exec($sql1);
      $GLOBALS['bdd']->exec($sql2);
      $GLOBALS['bdd']->exec($sql3);
      $GLOBALS['bdd']->exec($sql4);
      $result = $GLOBALS['bdd']->query($sql_all);
    	$Pages_Log = $result->fetchAll(PDO::FETCH_ASSOC);
    }
    catch (PDOException $e) {
    	echo $e->getMessage();
    }
    En local, je n'ai pas de pb
    Genre ? Réponse immédiate ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

Discussions similaires

  1. [AC-2010] Forcer l'exécution d'une requête d'action
    Par bokharisaad dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/04/2013, 10h22
  2. Réponses: 9
    Dernier message: 19/02/2013, 19h29
  3. Forcer le choix du plan d'exécution d'une requête
    Par hmechbal dans le forum Oracle
    Réponses: 5
    Dernier message: 20/01/2011, 23h28
  4. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  5. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48

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