115 Pratiques d'écoconception d'applications à architecture web, et plus...
Source CNUMR [BP_072_fr]GR491 - BACK-END 1. Réduire l'impact des données de leur stockage et accès

Recommandation équivalente

Éviter d’effectuer des requêtes SQL à l’intérieur d’une boucle

Identifiants

GreenITV2V3V4
557172

Catégories

Cycle de vieTiersResponsable
3. Réalisation (fabrication / développement)DatacenterArchitecte Logiciel/Développeur

Indications

Degré de prioritéMise en oeuvreImpact écologique
333
Ressources Economisées
Processeur / Mémoire vive / Réseau

Description

Les requêtes SQL à l’intérieur d’une boucle posent de gros problèmes de performance, et ce d’autant plus si le(s) serveur(s) SQL n’est (ne sont) pas sur la machine locale. En effet, ces serveurs sont optimisés pour traiter plusieurs sélections, insertions ou modifications dans une seule requête ou une seule transaction.

Mal utilisées, ces requêtes consomment inutilement des cycles CPU, de la mémoire vive et de la bande passante.

Exemple

Ne pas écrire :

foreach ($userList as $user) {
    $query = 'INSERT INTO users (first_name,last_name) VALUES("'. $user['first_name'] .'", "'. $user['last_ name'] .'")';
    mysql_query($query);
}

mais plutôt :

$userData = array();
foreach ($userList as $user) {
    $userData[] = '("'. $user['first_name'] .'", "'.
    $user['last_name'] .'")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES'. implode(',', $userData); mysql_query($query);

Principe de validation

Le nombre …est inférieur ou égal à
de requêtes SQL à l’intérieur d’une boucle0