Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

La guerre des étoiles

Dans bien trop de développements, on peut voir apparaître des requêtes avec le sélecteur de champs générique "*" (étoile). Seulement, c'est une très mauvaise habitude que de faire des "SELECT *" dans tous les sens.

Pourquoi, c'est plus court à écrire, non ?

Oui, en effet, mais c'est aussi mauvais pour les performances de votre application. J'explique :

Lorsque vous effectuez une requête sur votre serveur de données, le résultat va transiter sur votre réseau (ou en mémoire partagée). Si votre table contient un grand nombre de champs, ceux-ci vont être transmis à votre application alors qu'ils ne seront pas tous utilisés. Et plus la quantité de données qui transite est importante, plus votre système mettra de temps à répondre.

Cela revient à remplir son chariot de tous les produits du magasin, pour laisser à la caisse ceux dont on n'a pas besoin et payer les autres. Remplir votre chariot risque de vous prendre beaucoup de temps, sans parler de la difficulé à le faire rouler.

Oui, bon, je veux bien, mais quand j'ai vraiment besoin de tous les champs ?

Prenons alors le cas suivant :

Vous avez une table listant tous vos membres (nom, prénom). Sur une page, vous affichez la liste de vos membres en utilisant un "SELECT *". Quelques temps plus tard vous proposez à vos utilisateurs un système d'alerte par SMS. Pour cela, vous allez ajouter un champ téléphone sur 10 caractères. Désormais on en revient au point précédent, c'est à dire que lors de l'affichage des membres, vous n'utilisez pas le numéro de téléphone (heureusement) et vous faites donc transiter des données qui ne seront pas utilisées. Imaginez que vous avez 500 membres, la quantité de données inutiles sera donc de 5.000 octets. En multipliant ça par le nombre de requêtes/jour, cela peut représenter un gâchis important.

Pour certaines tables, je suis certain de ne pas évoluer !

Là arrive pour moi le réel argument allant contre l'utilisation du "SELECT *" ! Ce n'est pas trop une question d'évolutivité ou de performance, mais plutôt une question de lisibilité et de rigueur. En effet, lorsque vous relisez un code contenant un "SELECT *", à moins de connaître par coeur la structure de votre table, vous êtes dans l'incapacité de savoir ce que retourne la requête. Indiquez les champs que vous utilisez, c'est garantir que votre code reste lisible et donc maintenable par les autres, et aussi par vous-même.
Ecrire "SELECT *" est synonyme pour moi de "Je suis faignant, je ne sais pas trop ce qu'il y a dedans, et de toute façon, on s'en fout !"

La guerre des étoiles commence, et l'empire de la rigueur contre attaque !

Par Frédéric Bouchery
ADAM Benjamin 2008 | Admin