IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Performance requete SQL


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 184
    Points : 49
    Points
    49
    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.

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut
    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é.

  3. #3
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 184
    Points : 49
    Points
    49
    Par défaut
    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 ?

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    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 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    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 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 184
    Points : 49
    Points
    49
    Par défaut
    comment faire pour optimiser à top ma requête

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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.

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    create index IDX_REVERSE_CHAMP on BIG_TABLE (reverse(CHAMP));
    le type de select qui passera par l'index sera du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from BIG_TABLE where reverse(CHAMP) like reverse('%critere');

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il n'y pas de fonction Reverse dans la documentation d'Oracle.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut


    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.

  13. #13
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Votre exemple point vers un package. Rien à voir avec la fonction reverse en question.

  14. #14
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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 ....

  15. #15
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    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.

Discussions similaires

  1. Performance requetes SQL/JDBC
    Par st20085 dans le forum JDBC
    Réponses: 6
    Dernier message: 24/03/2011, 11h10
  2. Question performance sur requetes sql
    Par shinrei dans le forum ASP
    Réponses: 7
    Dernier message: 19/05/2006, 13h28
  3. Performance requete SQL
    Par billout9 dans le forum Oracle
    Réponses: 4
    Dernier message: 28/11/2005, 21h13
  4. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo