Vous n'êtes pas identifié(e).

#1 31/01/2012 22:54:58

ilrico
Membre

count() ou champ dans table

Bonjour,

Supposons que j'ai une table1 avec des objets sur chaque ligne, et une table2 avec une categorie sur chaque ligne (name, id)
Et une tableC de correspondance (objet_id, categorie_id)

Je cherche a afficher le nombre d'objet dans chaque catégorie.

Qu'est ce qui est le plus efficace sur long terme (a noter qu'il peut y avoir plusieurs millions de lignes dans la table de correspondance) ?

- faire une jointure table2 et tableC avec un SELECT name, count(tableC.object_id) FROM table2, tableC where categorie_id = table2.id ?
- ou ajouter une colonne num_objet integer dans la table2 et incrémenter (resp. soustraire) cette colonne à chaque fois qu'on affecte un objet à une catégorie (resp. qu'on détruit un objet) ?

plus généralement ma question porte sur l'interet de stocker une information type count() dans le champ d'une table...


merci d'avance !

Hors ligne

#2 31/01/2012 23:07:14

gleu
Administrateur

Re : count() ou champ dans table

La première solution sera plus lente lors d'un SELECT count, alors que la deuxième ralentira toute modification sur les tables.  De plus, si comme il s'agit d'une information calculée, si quelqu'un la modifie, son contenu peut ne plus correspondre à la réalité. Bref, sauf pour les cas où cette optimisation apporte un plus quantifié, il vaut mieux faire le count à chaque fois.

Chercher à optimiser sans savoir s'il y a réellement un problème est une grosse erreur parce qu'on s'embarque sur des machines à gaz qui ont plus de chances de ralentir le système que de l'accélérer.


Guillaume.

Hors ligne

#3 01/02/2012 00:10:12

ilrico
Membre

Re : count() ou champ dans table

ok merci pour cette réponse rapide (et le conseil final plein de sagesse, que je vais m'efforcer à suivre)

Hors ligne

Pied de page des forums