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.