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

Administration Oracle Discussion :

Requête sur grosse table ne veut pas utiliser l'index approprié


Sujet :

Administration Oracle

  1. #21
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    c'est qoui le resultat de
    sho parameter optimizer_mode

    Sinon

    optimizer_index_caching 0
    optimizer_index_cost_adj 100

    ==> favorise les FULL TABLE SCAN

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  2. #22
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Le paramètrage est normal. Oracle devrait choisir le bon index, mais dans cette situation il préfère le FTS.

    Essaye de reconstruire l'index sur un autre tablespace dedié aux indexes.

  3. #23
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Citation Envoyé par fatsora Voir le message
    c'est qoui le resultat de
    show parameter optimizer_mode
    les résultat est : ALL_ROWS

    j'ai l'impression qu'on approche une piste là

    optimizer_index_caching 0
    optimizer_index_cost_adj 100

    ==> favorise les FULL TABLE SCAN
    que ça favorise les full table scan je veux bien mais là quand même j'ai un index sur un champ et une requete avec une clause sur ce même champ !!! Je comprend pas qu'est-ce que j'ai de mal paramètrè dans oracle pour qu'il prèfère un full scan à l'utilisation de l'index !!!!

    C'est la taille trop grosse de l'index qui lui ferait préférer un full scan ?!

    Quel paramétrage me conseillez vous ? Mon paramètrage oracle il est simple : tout par défaut

  4. #24
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    BOn OK

    dans les base OLTP

    ptet bien
    all_rows a changer en first_rows

    alter session set optimizer_mode=first_rows

    mais dans la mesure ou la requete between utlise l'idex ....

    fait voir le pour et le contre

    entre
    changer un parametre c'est pour toute la base ...
    et
    changer la requete

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  5. #25
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Ce que j'aimerais bien comprendre c'est pourquoi il réagit comme ça (oui je sais je suis chiant j'aime bien comprendre )

    Je vais essayer de changer l'index de tablespace mais je comprend pas comment oracle en arrive à préferer un full scan à un index sur une table de 15 million de rows !!!

  6. #26
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    -Pourquoi ça marche avec le between et pas avec ">" "<" ?
    C'est une question de sélectivité.
    Avec un between, l'optimiseur estime qu'il va ramener 0,25% des lignes de la table => index recherché
    Avec > ou <, la sélectivité n'est que de 5% (je ne rentre pas dans les détails).

  7. #27
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Citation Envoyé par fatsora Voir le message
    ...changer un parametre c'est pour toute la base ...
    A partir de la 10g release 2, le hint opt_param permet de positionner un paramètre au niveau requête.
    Voir note Metralink 377333.1

    De toute façon, le changement de code est préférable.

  8. #28
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    changement de tablespace de l'index et aucun changement sur le plan d'exécution de ma requête !!!

    C'est pas tant le problème de changer ma requête avec un between qui me chagrinne c'est le fait que je trouve qu'oracle ne réagit pas "normalement" avec une requête ultra simple... et je me dis que comprendre et résoudre ce problème m'aidera surement pour la suite...

  9. #29
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    ok 13thFloor je comprends mieux. Je chercherais plus de documentation sur le sujet car ça m'intéresse et j'ai l'impression que je passe à coté de quelque chose dans ma compréhension d'oracle...

    En tous cas merci à tous ceux qui se sont décarcassés pour me trouver une solution

    et si vous avez des article sur le sujet n'hésitez pas

  10. #30
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Citation Envoyé par neo.51 Voir le message
    Ce que j'aimerais bien comprendre c'est pourquoi il réagit comme ça (oui je sais je suis chiant j'aime bien comprendre )

    Je vais essayer de changer l'index de tablespace mais je comprend pas comment oracle en arrive à préferer un full scan à un index sur une table de 15 million de rows !!!
    2 raisons :
    1) le plan d'exécution est réutilisé. L'optimiseur n'analyse plus la requête puisqu'il l'a déjà fait SAUF si tu recalcules les statistiques sur la table avec invalidation des curseurs contenant cette table (ou si tu vides la zone mémoire contenat les plans d'exécution : alter system flush shared_pool
    2) le coût (lecture de l'index+lignes de la table) est supérieur à celui de la lecture complète de la table.

  11. #31
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Citation Envoyé par 13thFloor Voir le message
    2 raisons :
    1) le plan d'exécution est réutilisé. L'optimiseur n'analyse plus la requête puisqu'il l'a déjà fait SAUF si tu recalcules les statistiques sur la table avec invalidation des curseurs contenant cette table (ou si tu vides la zone mémoire contenat les plans d'exécution : alter system flush shared_pool
    2) le coût (lecture de l'index+lignes de la table) est supérieur à celui de la lecture complète de la table.
    Je suis d'accord avec toi, ca peut venir de ça.

  12. #32
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Citation Envoyé par 13thFloor Voir le message
    -Pourquoi ça marche avec le between et pas avec ">" "<" ?
    C'est une question de sélectivité.
    Avec un between, l'optimiseur estime qu'il va ramener 0,25% des lignes de la table => index recherché
    Avec > ou <, la sélectivité n'est que de 5% (je ne rentre pas dans les détails).
    Par contre la je ne suis pas sûre. Internalement oracle transforme le BETWEEN en > AND <, ce qui revient au même. Même le fait d'indiquer > AND < lui évite de faire cette transaformation.

    Si le plan d'execution a été changé en modifiant > AND < en BETWEEN c'est par ce que le plan d'execution de la première requête était deja dans la memoire.

  13. #33
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Bon je comprend plus bien ce qu'il se passe là. Mes différent test sont bizzares :

    ->Si je fais un count en utilisant between ou > < pour retourner 0,4% des rows il utilise l'index.(57833/12257445).
    ->Si je fais un betwenn ou > < pour retourner 0,9% des rows il me fait encore un full scan !!! (119918/12257445).

    Bref je sais pas comment il fait son compte mais en tous cas de mon coté l'utilisation de l'index divise les temps de réponse par 10 !!!

    édit :
    Par contre la je ne suis pas sûre. Internalement oracle transforme le BETWEEN en > AND <, ce qui revient au même. Même le fait d'indiquer > AND < lui évite de faire cette transaformation.

    Si le plan d'execution a été changé en modifiant > AND < en BETWEEN c'est par ce que le plan d'execution de la première requête était deja dans la memoire.
    Je confirme, j'ai changé les valeurs pour ne pas utiliser le plan d'exécution.

  14. #34
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Si tu veut vraiement favoriser l'index, alors dans ce cas il faut modifier le paramètre : optimizer_index_cost_adj par exemple 70 au lieu de 100 pour commencer.

  15. #35
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    70 ça suffit pas 50 c'est bon. quels pourrait-être les incovénients de la modification de ce paramètre ?

  16. #36
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Citation Envoyé par bouyao Voir le message
    Si tu veut vraiement favoriser l'index, alors dans ce cas il faut modifier le paramètre : optimizer_index_cost_adj par exemple 70 au lieu de 100 pour commencer.
    Oula, j'en connais un qui va réagir, n'est-ce pas Orafrance ?

    Pour inciter encore à utiliser l'index sans altérer les paramètres qui ont un impact sur les performances et l'indexation, un histogramme peut être nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    exec dbms_stats.gather_table_stats( 
    ownname=> 'schéma', 
    tabname=> 'POINTGPS , 
    estimate_percent=> DBMS_STATS.AUTO_SAMPLE_SIZE, 
    cascade=> DBMS_STATS.AUTO_CASCADE, 
    degree=> null, 
    no_invalidate=> DBMS_STATS.AUTO_INVALIDATE, 
    granularity=> 'AUTO', 
    method_opt=> 'FOR ALL COLUMNS SIZE AUTO');

  17. #37
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    On peut vérifier le bon paramètrage de optimizer_index_cost_adj en lançant ce script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    col c1 heading 'Average Waits for|Full Scan Read I/O'        format 9999.999
    col c2 heading 'Average Waits for|Index Read I/O'            format 9999.999
    col c3 heading 'Percent of| I/O Waits|for Full Scans'        format 9.99
    col c4 heading 'Percent of| I/O Waits|for Index Scans'       format 9.99
    col c5 heading 'Starting|Value|for|optimizer|index|cost|adj' format 999
     
     
    select
       a.average_wait                                 c1,
       b.average_wait                                  c2,
       a.total_waits /(a.total_waits + b.total_waits)  c3,
       b.total_waits /(a.total_waits + b.total_waits)  c4,
       (b.average_wait / a.average_wait)*100           c5
    from
       v$system_event  a,
       v$system_event  b
    where
       a.event = 'db file scattered read'
    and
       b.event = 'db file sequential read'
    ;
    Je n'incite pas a changer ce paramètre qui influence totalement l'optimiseur.
    Attention sur certains version 10g une valeur très bas peut mener à un bug qui oblige l'optimiseur a choisir FTS au lieu de l'Index Full Scan.
    Sinon, tu peut diminuer le db_file_multiblock_read_count à 8 au lieu de 16, mais tous ça dépend de l'utilisation de la base.

  18. #38
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Donc la valeur C5 serait la valeur optimale pour mon paramètre optimizer_index_cost_adj ?

Discussions similaires

  1. [AC-2007] Requête sur 2 tables mais je ne sais pas comment la faire ?
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/01/2012, 00h01
  2. Réponses: 14
    Dernier message: 03/04/2008, 01h44
  3. Réponses: 13
    Dernier message: 29/01/2008, 15h28
  4. Requête sur grosses tables
    Par Marc_Bad dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 26/10/2007, 08h34
  5. Besoin d'aide pour requête sur grosse table
    Par Fabouney dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2006, 09h01

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