Dernière petite chose, on me demande souvent si les contraintes (par exemple intégrité référentielle) c'est pas contre performant... Oui cela demande du traitement supplémentaire lors des INSERT / UPDATE. MAIS... les meilleurs moteurs des SGBD relationnels savent en tirer un parti très puissant qui permet d'accélérer notablement les traitements. Et je vais vous donner un exemple spectaculaire...
Soit la requête suivante :
1 2 3 4 5
| SELECT ...
FROM T_CLIENT C
FULL OUTER JOIN T_FACTURE F
ON C.CLI_ID = F.CLI_ID
WHERE F.CLI_ID = 53 |
Avec 1 000 clients, 50 000 factures
Imaginons que le client 53 n'existe pas (ni client ni facture). S'il n'y a pas d'intégrité référentielle il faudra faire une recherche du client dans les factures puis une recherche des clients dans les clients et joindre tout cela => 51 000 lignes lues si pas d'index.
Maintenant que va faire le moteur s'il y a une intégrité référentielle sur CLI_ID entre les deux tables et que le moteur SQL est bien pensé ?
Il ira juste voir
D'ABORD dans les clients et s'il ne trouve pas il s'arrête immédiatement puisqu'il sait que grâce à la contrainte d'intégrité référentielle il n'est pas possible que cette référence de client soit présente dans la table des factures => 1 000 lignes lues si pas d'index
A votre avis faut-il ou pas mettre des intégrité référentielles si vous voulez obtenir des performances ???
Il en est de même généralement avec toutes les autres contraintes. Par exemple, mettre une contrainte CHECK value >= 0 sur des colonnes prix, quantité, dimensions... fera que si jamais vous faites une requête du style :
Alors la réponse sera instantanée car il n'y aura même pas besoin de lire les données pour retourner un résultat vide !
Partager