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

Administration MySQL Discussion :

[Pb Requête] Out of memory


Sujet :

Administration MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut [Pb Requête] Out of memory
    Bonjour à tous,

    Me voilà confronté depuis toute une journée à un problème de taille : un bon vieu out of memory !

    J'ai essayé tant bien que mal de paramétrer mon serveur (pour information, c'est un serveur situé en local) mais sans succès. L'exécution d'une requête semble poser problème. Je suppose que ce qu'elle retourne est bien trop gros pour le serveur.

    Voici la configuration de la machine sur lequel il y a le serveur :
    - Proc : Core 2 Duo 2.53 Ghz
    - RAM : 3 Go
    - OS : Windows XP
    Voici la requête en question :
    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
    $sql = 'SELECT DISTINCT `'. $tableREFERENTIELS['REF_BEARER'] .'`.`Lien` AS LIEN,
    			`'. $tableREFERENTIELS['REF_BEARER'] .'`.`Type_Circuit` AS BEARER_TYPE,	
    			`'. $tableREFERENTIELS['BEARER_RO'] .'`.`TS-MSBRO_MSBtimeslot` AS BEARER_TS,							
    			`'. $tableREFERENTIELS['BEARER_RO'] .'`.`TS-MSBRO_MSBname` AS BEARER,
    			`'. $tableREFERENTIELS['BEARER_RO'] .'`.`TS-MSBRO_ROname` AS RO,
    			`'. $tableREFERENTIELS['HT_RO'] .'`.`TS-ROHOT_ROtimeslot` AS RO_TS,
    			`'. $tableREFERENTIELS['HT_RO'] .'`.`TS-ROHOT_HOTname` AS HT,
    			`'. $tableREFERENTIELS['REF_HT'] .'`.`Circuit_Protection_Name` AS HT_PROTECTION,								
    			`'. $tableREFERENTIELS['LT_HT'] .'`.`TS-HOTLOT_LOTname` AS LT,
    			`'. $tableREFERENTIELS['LT_HT'] .'`.`TS-HOTLOT_HOTtimeslot` AS HT_TS,
    			`'. $tableREFERENTIELS['REF_LT'] .'`.`Circuit_Protection_Name` AS LT_PROTECTION,								
    			`'. $tableREFERENTIELS['LP_LT'] .'`.`TS-LOTLOP_LOPname` AS LP,
    			`'. $tableREFERENTIELS['LP_LT'] .'`.`TS-LOTLOP_LOTtimeslot` AS LT_TS,
    			`'. $tableREFERENTIELS['PC_LP'] .'`.`TS-LOPPDHC_PDHCname` AS PC,
    			`'. $tableREFERENTIELS['PC_LP'] .'`.`TS-LOPPDHC_LOPtimeslot` AS LP_TS,
    			`'. $tableINGENIERIE['CORRESPONDANCE_PC'] .'`.`DEBIT_E1` AS PC_DEBIT,								
    			`'. $tableREFERENTIELS['REF_PC'] .'`.`PDHC_Status` AS PC_ETAT
    		FROM `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['REF_BEARER'] .'`, 
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['BEARER_RO'] .'`, 
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['HT_RO'] .'`, 
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['LT_HT'] .'`, 
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['LP_LT'] .'`, 
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['PC_LP'] .'`, 
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['REF_PC'] .'`,
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['REF_HT'] .'`,
    			 `'. $bddREFERENTIELS .'`.`'. $tableREFERENTIELS['REF_LT'] .'`,
    			 `'. $bddINGENIERIE .'`.`'. $tableINGENIERIE['CORRESPONDANCE_PC'] .'`
    		WHERE `'. $tableREFERENTIELS['REF_BEARER'] .'`.`Circuit` = `'. $tableREFERENTIELS['BEARER_RO'] .'`.`TS-MSBRO_MSBname` AND
    			  `'. $tableREFERENTIELS['BEARER_RO'] .'`.`TS-MSBRO_ROname` = `'. $tableREFERENTIELS['HT_RO'] .'`.`TS-ROHOT_ROname` AND
    			  `'. $tableREFERENTIELS['HT_RO'] .'`.`TS-ROHOT_HOTname` = `'. $tableREFERENTIELS['LT_HT'] .'`.`TS-HOTLOT_HOTname` AND
    			  `'. $tableREFERENTIELS['LT_HT'] .'`.`TS-HOTLOT_LOTname` = `'. $tableREFERENTIELS['LP_LT'] .'`.`TS-LOTLOP_LOTname` AND
    			  `'. $tableREFERENTIELS['LP_LT'] .'`.`TS-LOTLOP_LOPname` = `'. $tableREFERENTIELS['PC_LP'] .'`.`TS-LOPPDHC_LOPname` AND
    			  `'. $tableREFERENTIELS['PC_LP'] .'`.`TS-LOPPDHC_PDHCname` = `'. $tableREFERENTIELS['REF_PC'] .'`.`PDHC_Name` AND
    			  `'. $tableREFERENTIELS['HT_RO'] .'`.`TS-ROHOT_HOTname` = `'. $tableREFERENTIELS['REF_HT'] .'`.`HOT_Name` AND
    			  `'. $tableREFERENTIELS['LT_HT'] .'`.`TS-HOTLOT_LOTname` = `'. $tableREFERENTIELS['REF_LT'] .'`.`LOT_Name` AND
    			  `'. $tableREFERENTIELS['REF_PC'] .'`.`PDHC_BandWidth` = `'. $tableINGENIERIE['CORRESPONDANCE_PC'] .'`.`DEBIT`';
    Voici le fichier de configuration My.ini :
    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
    sql-mode=
    max_connections=100
    query_cache_size=64M
    table_cache=1024
    table_open_cache = 1024
    tmp_table_size=512M
    thread_cache_size=16
    myisam_max_sort_file_size=100G
    myisam_sort_buffer_size=128M
    key_buffer_size=768M
    max_allowed_packet = 2M
    read_buffer_size=4M
    read_rnd_buffer_size=16M
    sort_buffer_size=4M
    thread_concurrency = 8
    Et pour finir, un échantillon de mon fichier de configuration php.ini dans le cas où vous auriez des idées ^^
    Ce que j'ai fait :
    - Tentative de changement de moteur par défaut : InnoDB au lieu de MySIAM. (malgré que MySIAM semble plus adapter pour le type de requêtes que j'exécute)
    - Tentative de réécriture de la requête en utilisant de simple JOIN au lieu de faire mes jointures dans la condition WHERE.
    - Memory limit : passage de 1048M à -1 pour laisser le serveur gérer la chose.
    - Niveau code PHP : dans l'ensemble de mes scripts, dès qu'une variable n'est plus utilisée, je libère la mémoire comme il se doit.
    - Création d'index sur chaque attribut intervenant dans la jointure

    Je dois avouer que malgré les heures passées sur le net à chercher une aide utile, je n'ai pas su trouver bonheur. Je ne suis pas expert en matière de configuration de serveurs, alors si vous avez mieux, proposez.

    A titre informatif, je travaille avec des centaines de milliers d'enregistrement afin que vous puissiez juger la chose.

    Je reste disponible pour toute question. N'hésitez pas si quelque chose n'est pas clair.
    Merci par avance.

    Cordialement,
    Morgan.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut
    Pour information, j'ai trouvé une solution à mon problème.

    L'erreur provient du fait que ma requête retourne beaucoup trop de résultats. Pour cette requête en particulier, elle retourne 5 000 000 de résultats, sachant qu'il n'y a aucun doublon.

    Pour pouvoir exécuter ma requête correctement, j'ai du utiliser l'astuce qui consiste à ne pas mettre la table en cache grâce à la fonction mysql_unbuffered_query.
    La principale contrainte est qu'on ne peut pas utiliser les résultats retournés, on ne peut pas les exploiter via des fonctions telles que mysql_fetch_array.

    Pour contrer la chose, il m'a suffit de modifier ma requête de la manière qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO ...
    SELECT ...
    Ainsi, l'insertion se fait de masse et non ligne par ligne ... Cela reste la meilleure solution quand on a un nombre de résultats beaucoup trop élevé pour mysql.

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

Discussions similaires

  1. Out of memory sur une requête
    Par guismo45 dans le forum Administration
    Réponses: 12
    Dernier message: 24/12/2008, 18h22
  2. [C++] [gcc] out of memory
    Par fxp17 dans le forum GCC
    Réponses: 5
    Dernier message: 06/01/2006, 10h29
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

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