Bonjour à tous,
Cette méthode d'indexation de champ alpha-numérique (texte, mémo, etc...) est intéressante, en terme de temps de réponse.
Prenons l'exemple d'une table Produit :
- Id_Produit (PK)
- Libellé (PK)
...
Contenu :
1 2 3 4 5
| Id_Produit Libellé
123ABC Petits pois
456DEF Orange d'Espagne
789GHI Pois chiche
... |
Cahier des charges :
Rechercher tous les produits dont le libellé contient une chaîne de caractères saisie, où qu'elle soit dans Libellé.
==> exemple : saisie de la chaîne de caractères "poi".
Solution sans indexation :
SELECT Id_Produit, Libellé FROM Produit WHERE Libellé LIKE "*poi*"
==> nous savons tous (ou nous nous doutons tous) que le LIKE "*poi*" est gourmand surtout à cause de l'étoile du début : en effet, le système est obligé de parcourir l'ensemble de la Table pour repérer les enregistrements dont Libellé contient, à n'importe quel endroit, la chaîne de caractères "poi".
Solution avec indexation :
- Création d'une table Produit_IndexLibellé :
- Libellé_Travaillé (PK)
- Id_Produit (PK)
- Ecriture d'un objet programme (module, trigger, etc...) qui, à chaque [création] ou [modification du libellé d'un produit], "décompose" ce libellé de manière à utiliser LIKE "xxx*" (et non LIKE "*xxx*").
Par exemple, à la création du produit 456DEF (Orange d'Espagne), cet objet programme devra effectuer les actions suivantes :
DELETE * FROM Produit_IndexLibellé WHERE Id_Produit="456DEF"
==> suppression de l'ancien index sur le libellé, pour le produit concerné : 456DEF.
Remplissage de la table Produit_IndexLibellé comme suit :
1 2 3 4 5 6 7 8 9 10 11 12 13
| Libellé_Travaillé Id_Produit
orangedespagne 456DEF
rangedespagne 456DEF
angedespagne 456DEF
ngedespagne 456DEF
gedespagne 456DEF
edespagne 456DEF
despagne 456DEF
espagne 456DEF
spagne 456DEF
pagne 456DEF
agne 456DEF
gne 456DEF |
==> 3 caractères étant le nombre de caractères minimum à rechercher.
==> attention à :
- tout convertir en minuscule ;
- remplacer les caractères accentués par le caractère sans accent correspondant ;
- ne prendre en compte que les caractères de "a" à "z" et de "1" à "9" (à adapter) ;
- ne prendre en compte que les caractères de "a" à "z" et de "1" à "9" (à adapter) pour le champ de saisie des caractères à rechercher.
- Donc, en final, dans notre exemple, le contenu complet de Produit_IndexLibellé sera :
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
| Libellé_Travaillé Id_Produit
orangedespagne 456DEF
rangedespagne 456DEF
angedespagne 456DEF
ngedespagne 456DEF
gedespagne 456DEF
edespagne 456DEF
despagne 456DEF
espagne 456DEF
spagne 456DEF
pagne 456DEF
agne 456DEF
gne 456DEF
petitspois 123ABC
etitspois 123ABC
titspois 123ABC
itspois 123ABC
tspois 123ABC
spois 123ABC
pois 123ABC
ois 123ABC
poischiche 789GHI
oischiche 789GHI
ischiche 789GHI
schiche 789GHI
chiche 789GHI
hiche 789GHI
iche 789GHI
che 789GHI |
En recherchant la chaîne de caractères "poi" :
SELECT * FROM Produit WHERE Libellé LIKE "poi*"
trouvera :
1 2 3
| Libellé_Travaillé Id_Produit
pois 123ABC
poischiche 789GHI |
en un temps record... au détriment, bien entendu, de la place disque.
Partager