Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/09/2011, 17h10   #1
Invité régulier
 
Omar EL IDRISSI
Inscription : juillet 2008
Messages : 8
Détails du profil
Informations personnelles :
Nom : Omar EL IDRISSI
Localisation : France

Informations forums :
Inscription : juillet 2008
Messages : 8
Points : 9
Points : 9
Par défaut Simple Recherche LIKE très lente

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%'
La c'est OK ! Le serveur répond en moins d’1ms.

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 comprends que cette requête est plus compliquée que la première, mais un tel temps de réponse est loin d’être tolérable sachant que je suis contraint d'un timeOut de 30 s.

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.
omar_elid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 19h19   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
le fait d'avoir un % en début et un % en fin empêche d'utiliser les index.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 19h24   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/09/2011, 22h12   #4
Membre Expert
 
Avatar de pachot
 
Homme Franck Pachot
DBA Oracle
Inscription : novembre 2007
Messages : 706
Détails du profil
Informations personnelles :
Nom : Homme Franck Pachot
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : DBA Oracle
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2007
Messages : 706
Points : 1 645
Points : 1 645
Bonjour,

Citation:
Envoyé par omar_elid Voir le message
Bonjour,
Je n’arrive pas à déceler l'origine du problème
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 ...
pachot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 23h57   #5
Invité régulier
 
Omar EL IDRISSI
Inscription : juillet 2008
Messages : 8
Détails du profil
Informations personnelles :
Nom : Omar EL IDRISSI
Localisation : France

Informations forums :
Inscription : juillet 2008
Messages : 8
Points : 9
Points : 9
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
omar_elid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 09h38   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Oracle Text a des possibilités pour indexer des mots.
>pachot
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 10h58   #7
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
Code :
SELECT count(*) FROM REFCLPPP00 WHERE CLPNOMCLIP LIKE '%touir%'
Plusieurs approches :

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> SELECT count(*) FROM t WHERE txt LIKE '%toui%';
  COUNT(*)
----------
        24
Elapsed: 00:00:00.04
SQL> CREATE INDEX fbi ON t(case when txt LIKE '%toui%' then 1 end);
 
INDEX created.
SQL> SELECT count(*) FROM t WHERE case when txt LIKE '%toui%' then 1 end=1;
  COUNT(*)
----------
        24
Elapsed: 00:00:00.01
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 14h48   #8
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h31   #9
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par Yanika_bzh Voir le message
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 ?
Je ne comprends pas votre réponse.

Voulez vous dire que le temps de réponse de la requête dépend du temps de création de l'index!!!!!
__________________
Bien Cordialement
www.hourim.wordpress.com
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h45   #10
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h54   #11
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par Yanika_bzh Voir le message
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 = ?

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.
__________________
Bien Cordialement
www.hourim.wordpress.com
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h00   #12
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par Mohamed.Houri Voir le message
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.
Ca limite quand meme les fonctions de recherche :

Code :
CREATE INDEX fbi ON t(case when txt LIKE '%toui%' then 1 end);
Ok pour rechercher toui dans la chaine,
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h05   #13
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
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 :
1
2
3
4
5
case 
  when t LIKE '%tata%' then 1 
  when t LIKE '%titi%' then 2
  when t LIKE '%toto%' then 3
end
et tester si le case indexer vaut 1 ou 2 ou 3.


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
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h10   #14
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 11h29   #15
Invité régulier
 
Omar EL IDRISSI
Inscription : juillet 2008
Messages : 8
Détails du profil
Informations personnelles :
Nom : Omar EL IDRISSI
Localisation : France

Informations forums :
Inscription : juillet 2008
Messages : 8
Points : 9
Points : 9
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 mathématiquement on aura n(n+1)/2 = 36 indexes créé.

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.
omar_elid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h47   #16
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
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 ));
Ensuite
Code :
1
2
3
4
5
6
 
SELECT count(*) 
FROM REFCLPPP00 
WHERE 1=1
AND length(CLPNOMCLIP ) >= length('touir')
AND CLPNOMCLIP LIKE '%touir%'
Evidemment si le champ CLPNOMCLIP est de la meme longueur pour chaque record alors ça ne sert à rien

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.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 21h45   #17
Invité régulier
 
Omar EL IDRISSI
Inscription : juillet 2008
Messages : 8
Détails du profil
Informations personnelles :
Nom : Omar EL IDRISSI
Localisation : France

Informations forums :
Inscription : juillet 2008
Messages : 8
Points : 9
Points : 9
Oui utiliser un index sur la longueur de la chaîne ca peut optimiser quelques recherches.
omar_elid est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h25.


 
 
 
 
Partenaires

Hébergement Web