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

Oracle Discussion :

Comment obliger une requette à passer par un index précis ?


Sujet :

Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut Comment obliger une requette à passer par un index précis ?
    Bonjour les forumistes... , la question est dans le titre...
    Je dois analyser une requette de ouf qui prend squelques 10 minutes à s'effectuer... en faisant l'EXPLAIN, je vois qu'il ne passe pas par un Index que j'ai créé recemment et qui, d'après moi, devrait mieux correspondre à la demande... Il faut dire aussi que la table à analyser est très mal fichue... pas d'index primaire... des index secondaires pas toujours bien à propos etc..
    De plus, la requette utilisés est générée par un logiciel et nous ne pouvons pas modifier...
    La solution serait de repenser la table mais je m'y attelerait dans un deuxièlme temps... Alors, comment obliger Oracle à passer par mon IndexA alors qu'en ce moment, il passe par l'IndexB qui donne des temps de réponse catastrophiques ?
    Avez-vous une solution ?

  2. #2
    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
    Les statistiques sont-elles à jour ?

    Le logiciel permet-il un mode "étendu" qui permettrait de rajouter des hints (GENIO le fait ) ?

    Sinon s'il y a une solution ça m'intéresse, je me bats sans arrêt avec des problèmess comme ça...
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    J'avais oublié de dire que les stats étaient à jour...

    Quand vous dites :

    Le logiciel permet-il un mode "étendu" qui permettrait de rajouter des hints
    Qu'est-ce qu'un 'mode 'étendu qui permettrait de rajouter des Hints' '
    J'ai cherché sur les docs ce qu'était un Hint, mais je n'ai rien compris !

    Cordialement

  4. #4
    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
    Par exemple disons que cette requête soit très longue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE1 G_T1, TABLE2 G_T2 WHERE G_T1.ID=G_T2.ID
    en utilisant cette requête à la place ça sera plus rapide (dans un cas précis, ce n'est pas une généralité) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT /*+ use_hash (G_T1 G_T2) */ * FROM TABLE1 G_T1, TABLE2 G_T2 WHERE G_T1.ID=G_T2.ID
    Mais évidemment pour pouvoir insérer ce hint, il faut pouvoir rajouter des informations "à la main" dans la requête générée par l'outil.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  5. #5
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Ok, je vais me renseigner..
    En fait mon problème est le suivant :
    Nous avons une table de 30 000 000 de rows qui n'a pas de clé primaire...
    Imaginez :
    RUB1
    RUB2
    RUB3

  6. #6
    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
    Et ?
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  7. #7
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Je reprends ...

    En fait mon problème est le suivant :
    Nous avons une table de 30 000 000 de rows qui n'a pas de clé primaire... et qui est alimentée tous les mois par un batch !

    Sur cette table sont attachés 4 Index dont 'le plus determinant' est composé des deux premiere rubriques de la table : RUB1 Number (4) et RUB2 Number (2) et... RUB5 (5em rubrique de la table et RUB10 (10em rubrique de la table)...
    Pas gégé hein ?

    Quand on me demande d'optmiser une requette de la sorte, je réponds ça :
    1°)

  8. #8
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Je reprends ...

    En fait mon problème est le suivant :
    Nous avons une table de 30 000 000 de rows qui n'a pas de clé primaire... et qui est alimentée tous les mois par un batch !

    Sur cette table sont attachés 4 Index dont 'le plus determinant' est composé des deux premiere rubriques de la table : RUB1 Number (4) et RUB2 Number (2) et... RUB5 (5em rubrique de la table)... RUB10 (10em rubrique de la table)... etc...
    Pas gégé hein ?

    Quand on me demande d'optmiser une requette qui utilise cette table (et qui consomme énorùmément) , je réponds que c'est impossible car :

    1°) Même si la requette utilise l'index le + déterminant, étant donné que la table n'est pas triée, en deux 'coups' de select, on peut aller chercher d'abord une row qui se trouve en 30 millionième position et juste après, une autre qui loge en première position de la table...
    Ai-je raison ?

    2°) Si je demande à trouver une unicité sur la table afin de créer une clé primaire, est-ce une bonne solution ? (L'index primaire sera, très volumineux, car l'unicité doit passer par une dizaines de rubriques)

    Merci pour vos réponses !

  9. #9
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Excuse pour les deux messages envoyés à tort... il faut lre le dernier !

  10. #10
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Une remarque en passant...
    Tu peux éditer tes messages ou même les supprimer s'ils ne sont pas pertinents ...
    Dyvim

  11. #11
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Ils nous manque des éléments pour te répondre:
    - Est ce que ta requete passe par l'index que tu mentionnes?
    - Est ce que tu as des index qu'Oracle n'utilise pas pour ce select?
    - Quel est l'explain plan?
    - Comment est configuré l'optimiseur de requete? (CHOOSE ou RULE?)
    - Quelle est ta version d'Oracle?
    - Quel est le code de la requete?
    - Quel est le format de la table?
    Dyvim

  12. #12
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Citation Envoyé par genio
    Quand on me demande d'optmiser une requette qui utilise cette table (et qui consomme énorùmément) , je réponds que c'est impossible...
    Moi j'éviterais toujours de dire çà ... professionellement parlant....
    Citation Envoyé par genio
    Même si la requette utilise l'index le + déterminant, étant donné que la table n'est pas triée, en deux 'coups' de select, on peut aller chercher d'abord une row qui se trouve en 30 millionième position et juste après, une autre qui loge en première position de la table...
    Ai-je raison ?
    Si tes index ne sont pas utilisés, c'est pire que çà... C'est toute la table qu'il va falloir scanner à chaque fois que tu veux une info.
    Citation Envoyé par genio
    Si je demande à trouver une unicité sur la table afin de créer une clé primaire, est-ce une bonne solution ? (L'index primaire sera, très volumineux, car l'unicité doit passer par une dizaines de rubriques)
    J'aurais tendance à dire que toute table doit disposer d'une clef primaire mais cette norme Merise n'est que trop rarement respectée.
    Cela peut s'expliquer surtout dans le cas de tables à gros volume... Une dénormalisation choisie est quelquefois une bonne chose.
    Sinon pour le volume tu as raison il sera sans doute important. Cela pourrait aussi plomber les performances de ton batch d'insertion (et oui pour chaque ligne il faudra vérifier l'unicité et en plus insérer dans l'index).
    Il faudra sans doute faire des tests exhaustifs pour décider ce qui est le mieux.
    Dyvim

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    Ta table est elle partitionnée?

    Si non, pense à le faire. A 30 millions de lignes, il faut y songer serieusement !

Discussions similaires

  1. Réponses: 12
    Dernier message: 06/10/2006, 09h26
  2. Comment modifier une BufferedImage alimenté par un Thread
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 02/08/2006, 15h04
  3. [c#] Comment créer une icone reconnaisable par VS2005
    Par padodanle51 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/04/2006, 11h44
  4. [Interbase]Comment créer une source ODBC par programme ?
    Par touhami dans le forum Bases de données
    Réponses: 1
    Dernier message: 13/03/2006, 16h40
  5. Réponses: 1
    Dernier message: 01/11/2005, 02h29

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