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 25/11/2010, 11h41   #1
Invité régulier
 
Inscription : août 2008
Messages : 145
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 145
Points : 9
Points : 9
Par défaut Performance requete SQL

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.
cyclopsnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 11h52   #2
Membre régulier
 
Inscription : septembre 2008
Messages : 84
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 84
Points : 88
Points : 88
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é.
spdev666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h38   #3
Invité régulier
 
Inscription : août 2008
Messages : 145
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 145
Points : 9
Points : 9
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 ?
cyclopsnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h48   #4
Rédacteur
 
Inscription : décembre 2002
Messages : 2 381
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 381
Points : 3 254
Points : 3 254
Citation:
Envoyé par spdev666 Voir le message
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é.
Ca n'est pas aussi tranché que ça.
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
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h50   #5
Rédacteur
 
Inscription : décembre 2002
Messages : 2 381
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 381
Points : 3 254
Points : 3 254
Citation:
Envoyé par cyclopsnet Voir le message
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 ?
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
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h54   #6
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Citation:
Envoyé par cyclopsnet Voir le message
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 ?
Dommage ça aurait été l'inverse ça aurait marché.

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
Code :
WHERE F(COLONNE) LIKE F('%critere')
- regarder du coté de l'indexation par mot ORACLE-TEXT qui répondra peut etre bcp plus à ton besoin.
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h54   #7
Invité régulier
 
Inscription : août 2008
Messages : 145
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 145
Points : 9
Points : 9
comment faire pour optimiser à top ma requête
cyclopsnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 14h16   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 307
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 307
Points : 5 796
Points : 5 796
Citation:
Envoyé par cyclopsnet Voir le message
comment faire pour optimiser à top ma requête
Ne l’exécutez pas!

Sérieusement:
1) Commencez par vous assurez que les statistiques sont à jour pour la table/index en question.
2) Postez votre requête telle qu'elle.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 16h35   #9
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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));
le type de select qui passera par l'index sera du style:

Code :
1
2
 
SELECT * FROM BIG_TABLE WHERE reverse(CHAMP) LIKE reverse('%critere');
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/11/2010, 16h49   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 307
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 307
Points : 5 796
Points : 5 796
Il n'y pas de fonction Reverse dans la documentation d'Oracle.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 18h16   #11
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 935
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 935
Points : 17 743
Points : 17 743
http://download.oracle.com/docs/cd/A...w2.htm#1002051

A +
__________________
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 * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 18h21   #12
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175


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.
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 19h30   #13
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 307
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 307
Points : 5 796
Points : 5 796
Votre exemple point vers un package. Rien à voir avec la fonction reverse en question.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 19h32   #14
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 307
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 307
Points : 5 796
Points : 5 796
Citation:
Envoyé par remi4444 Voir le message


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.
Ca marche bien sûr. Mais c'est une fonction non documentée. Pour faire un petit test ça va. Mais ....
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 10h29   #15
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
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.
nuke_y 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 18h14.


 
 
 
 
Partenaires

Hébergement Web