|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : août 2008 Messages : 145 ![]() |
Bonjour,
J'ai une big table (>16 millions enregistrements) , quand je fais une requête avec un LIKE sur un champ VARCHAR2(100) avec un rownum < 10 ça rame énormément. Il y a un index unique sur ce champ. Comment puis-je faire pour optimiser le temps de réponse. Merci. |
|
|
00
|
|
|
#2 |
|
Membre régulier
![]() Inscription : septembre 2008 Messages : 84 ![]() |
Bonjour,
Quelle est la version d'Oracle ? De quel genre sont les LIKE ? Si c'est '%critère%', l'index n'est pas utilisé. Si c'est 'critère%' il est utilisé. |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : août 2008 Messages : 145 ![]() |
c'est oracle 10g.
Oui je fesais LIKE '%critere%' , mais maintenant j'ai changé ma requete en LIKE '%critere'. y aura t il une différence de performance ? |
|
|
00
|
|
|
#4 | |
![]() Inscription : décembre 2002 Messages : 2 381 ![]() |
Citation:
Il est exact qu'avec un LIKE '%...' (avec le % en tête), le parcours "dichotomique" normal et intelligent de l'index n'est pas applicable. Mais il reste possible de parcourir intégralement l'index pour voir quelles sont les valeurs qui contiennent la chaîne recherchée, et obtenir l'adresse des lignes correspondantes dans la table. Car dans de nombreux cas, il reste plus économique de parcourir un petit index intégralement, que de parcourir la table intégralement.
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
|
00
|
|
|
#5 |
![]() Inscription : décembre 2002 Messages : 2 381 ![]() |
Non, aucune. Dès lors que le % est en premier, l'utilisation optimale de l'index est impossible. Dans le meilleur des cas, il sera utilisé, mais de manière dégradée. Et dans le pire, il ne sera pas utilisé du tout.
__________________
Consultant / formateur Oracle indépendant Certifié OCP 10g et 11g, sécurité 11g |
|
|
00
|
|
|
#6 | |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Citation:
Dans ton cas, tu peux: - faire un index sur une fonction (F on va dire) qui inverse la chaine (je sais pas si ça existe de base) et faire un - regarder du coté de l'indexation par mot ORACLE-TEXT qui répondra peut etre bcp plus à ton besoin. |
|
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : août 2008 Messages : 145 ![]() |
comment faire pour optimiser à top ma requête
|
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
|
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Pour reprendre mon comm approximatif de toute à l'heure, si tu es sur que tes requêtes seront toujours de la forme "where CHAMP like '%critere' (avec le % rien qu'au début) alors tu peux faire un index sur la fonction reverse:
Code :
CREATE INDEX IDX_REVERSE_CHAMP ON BIG_TABLE (reverse(CHAMP)); Code :
|
||
|
|
10
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
Il n'y pas de fonction Reverse dans la documentation d'Oracle.
|
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 935 ![]() |
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#12 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
![]() Pourtant ça marche chez moi, mais il est vrai que je suis en 11g. Sinon rien n'interdit de faire soit même la fonction (sans oublier de la déclarée "DETERMINISTIC") et de faire un index dessus. |
|
|
00
|
|
|
#13 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
Citation:
|
|
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
Ca marche bien sûr. Mais c'est une fonction non documentée. Pour faire un petit test ça va. Mais ....
|
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
16 millions d'enregistrements c'est vrai que c'est gros mais quand même, c'est quoi "ramer énormément" ?
Tu es sûr que tu utilises l'index ? Sinon bonne solution de remi4444, je pense que tu pourrais effectivement programmer ta propre fonction reverse et l'utiliser.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com