|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Omar EL IDRISSIInscription : juillet 2008 Messages : 8 ![]() |
Bonjour,
Mon problème est relatif au temps d'exécution des requêtes de recherche. En effet, par exemple lorsque j'exécute la requête suivante : Code :
SELECT count(*) FROM REFCLPPP00 WHERE CLPNOMCLIP LIKE 'touir%' Tandis que, si j'ajoute un "%" à gauche du mot à chercher, la requête prend une décennie pour s'exécuter ( une moyenne d'1min30s). Code :
SELECT count(*) FROM REFCLPPP00 WHERE CLPNOMCLIP LIKE '%touir%' Je n’arrive pas à déceler l'origine du problème, est-ce que je dois modifier une propriété d'oracle ? Merci, d'avance. À noter que : le champ CLPNOMCLIP est indexé. La table comporte 1894277 entrées. |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
le fait d'avoir un % en début et un % en fin empêche d'utiliser les index.
|
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() |
La collation influence largement le travail du processeur lors de ce type de recherche.
Quelle est la COLLATION de votre colonne CLPNOMCLIP? Tester une comparaison avec COLLATION BINAIRE?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
01
|
|
|
#4 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour,
C'est juste normal pour un index. Imagines que tu doives chercher dans un dictionnaire tous les mots qui commencent par 'touir' : ça ira très vite. Imagines que tu doives chercher tous les mots qui contiennent 'touir' ... il faudra lire toutes les pages... Oracle Text a des possibilités pour indexer des mots. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Omar EL IDRISSIInscription : juillet 2008 Messages : 8 ![]() |
Merci pour vos réponses.
iberserk si vous parlez de la Collation NLS_SORT, elle est en binaire. StringBuilder je confirme que dans le cas d'une recherche avec l'indexation simple n’optimise en aucun cas le temps d’exécution des requêtes. pachot, je vais suivre cette piste, d'après une première recherche je pense que c'est le bout de file de la solution, j' approfondirai mes connaissances sur Oracle Text indexation. je vais vous tenir au courant demain mon avancement |
|
|
00
|
|
|
#6 | |
|
Membre Expert
![]() |
Citation:
Je ne connais pas ORACLE parfaitement mais le FULLTEXT (puisque c'est de ca qu'il s'agit) ne permet pas de reproduire tout ce que peut faire un LIKE %%. Par exemple une recherche sur an ne retournera pas intervenant... Mais si vos recherches portent sur des mots, c'est votre solution en effet.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#7 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 926 ![]() |
Code :
SELECT count(*) FROM REFCLPPP00 WHERE CLPNOMCLIP LIKE '%touir%' 1) tu sais (mais Oracle ne le sait pas) que seulement peu de mots contiennent touir, donc tu utilises un hint --> http://laurentschneider.com/wordpres...me-likebc.html 2) tu cherches toujours sur '%touir%', tu crées un fbi Code :
|
||
|
00
|
|
|
#8 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
L'idée est interessante, mais le resultat du temps de requetage de la solution prend aussi en compte le temps de creation de l'index ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#9 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Voulez vous dire que le temps de réponse de la requête dépend du temps de création de l'index!!!!! |
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Non je n'affirme rien, je voulais juste savoir quel etait le temps total Creation de l'index + requete select, car il faut bien créer l'index non ?
Pour résumer Cas A Requete (Non indexée) X secondes Cas B Creation d'un index : Y Secondes Requete (indexée) : Z Secondes. Y+Z = ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#11 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
On créé l'index une seule fois et on fait des selects plusieurs fois. Il faut plutôt parler de la pénalité lors de l'insert/update/delete que nous ajoutons par la création d'un index et non sur la pénalité de celui-ci lors d'un select. |
|
|
|
00
|
|
|
#12 | |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Citation:
Code :
CREATE INDEX fbi ON t(case when txt LIKE '%toui%' then 1 end); Mais si apres je veux chercher uoit dans la chaine ? il faut que je refasse un index ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
|
00
|
|
|
#13 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 926 ![]() |
si l'on cherche toujours la même chaine (touir), alors ça va. Sinon ce n'est pas la bonne approche
dans le cas où on checher tata, titi ou toto, à tours de role, on pourrait faire un Code :
Bien sûr la meilleures façon d'augmenter la performance d'une application qui fait toujours des like '%xxx%' c'est de ne pas faire le like |
||
|
00
|
|
|
#14 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
je suis d'accord
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#15 |
|
Invité régulier
![]() Omar EL IDRISSIInscription : juillet 2008 Messages : 8 ![]() |
Bonjour,
en essayant d'optimiser le temps de réponse des requêtes LIKE "%%". Je me suis intéressé à l'idée proposée par "pachot" celle de Oracle Text. Conclusion, Oracle Text crée des indexes sur les mots qui constituent le champ en question. Par exemple : si on a un prénom Jean MARC, Oracle Text va créer un index sur Jean et un autre sur Marc. Par concéquent, cette méthode s'avère fructueuse pour notre cas. Ayant grand espoir, j'ai trouvé sur la doc officielle d'oracle qu’on peut configurer la création de l index en lui spécifiant des paramètres précisément le "SUBSTRING" = TRUE. Dans ce cas, et pour le même exemple Oracle va créer des indexes sur toutes les combinaisons possibles de la chaine de caractère, ainsi on aura : j,e,a,n,m,a,r,c,Je,ea,an,ma,ar,rc,jea,ean,anm,.... enfin ne croyez pas que je vais tout écrire Faisant le calcul pour 1894277 données : 2000000*36 = 72 000 000 indexes Curieux, je l ai exécuté et le serveur à planter aère 13 minutes d'indexation ..Enfin Merci à vous, je pense qu'il faut revoir la contrainte de 30s que d'essayer d'optimiser le temps d'exécution des requêtes LIKE "%%". Tout de même si vous avez d'autres propositions je suis preneur. |
|
|
00
|
|
|
#16 | ||
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
Bonjour,
Dans le cas d'un tu ne pourras pas eviter un fullscan, mais un axe d'optim est de limiter le nombre de lignes sur lesquelles Oracle va scanner. Par exemple creer un FBI sur la longueur de ta chaine : Code :
CREATE INDEX INDX_REFCLPPP00_01 ON REFCLPPP00(length(CLPNOMCLIP )); Code :
Autre exemple, indexer sur la présence des lettres de l'alphabet A->Z. Certain me diront que ce genre d'indexation n'a pas grand interet vu le faible taux de selectivité de l'indexe et que oracle prefera ne pas l'utiliser , et ils n'auront pas tord . Par contre la proba que ton champ contienne à la fois les lettres t,o,u,i et r devient interessante. |
||
|
|
00
|
|
|
#17 |
|
Invité régulier
![]() Omar EL IDRISSIInscription : juillet 2008 Messages : 8 ![]() |
Oui utiliser un index sur la longueur de la chaîne ca peut optimiser quelques recherches.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com