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 :

Principes de base d'optimisation de requête


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Points : 37
    Points
    37
    Par défaut Principes de base d'optimisation de requête
    Bonjour,

    je cherche à optimiser des requêtes SQL trop longues à exécuter.
    Existent t'ils des règles standards pour optimiser une requête SQL du type :
    - l'importance de l'ordre des tables dans les jointures INNER JOIN?
    - préférer une clause IN pour filtrer par rapport à une autre table plutôt qu'une clause INNER JOIN?
    - préférer les jointures dans le WHERE plutôt que dans l'INNER JOIN?
    - l'importance des conditions dans la clause WHERE?

    merci pour ces infos,

    Romu

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    l'important c'est de bien indexer les tables et calculer les stats, après, l'écriture de la requête importe peu.

  3. #3
    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 orafrance Voir le message
    l'important c'est de bien indexer les tables et calculer les stats, après, l'écriture de la requête importe peu.
    Ca c'est vraiment du Saint Graal.

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    C'est à dire ?

    Sinon, pour info : http://www.developpez.net/forums/m2548995-2/

  5. #5
    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 orafrance Voir le message
    C'est à dire ?

    Sinon, pour info : http://www.developpez.net/forums/m2548995-2/
    Oui, d'accord l'optimiseur se debrouille généralement bien! Mais je peux te montrer de requêtes assez simple où "l'écriture de la requête importe", pour exemple parce que elle impose le choix du plan (et je ne parle pas de hints).

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Oui, mais ça ne répond à aucune règle, juste trouver l'ordre qui permettra de trouver le bon plan dans le nombre de permutations autorisée. Enfin... si tu veux répondre à la question initiale, fais donc

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par romu92 Voir le message
    - préférer une clause IN pour filtrer par rapport à une autre table plutôt qu'une clause INNER JOIN?
    Ne pas oublier la clause EXISTS qui peut apporter de net gain de performance, mais bien sûr ça reste du cas par cas.
    A noter que la jointure n'est pas forcément équivalente en terme de résultat.

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    très bon tuto

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Ah oui, super intéressant, merci Skeik

  11. #11
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Enfin, il a tout de même un peu vieilli...

  12. #12
    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 SheikYerbouti Voir le message
    Enfin, il a tout de même un peu vieilli...
    Oui, un peu trop. Il était au point en 2000 je pense. Mais certains choses ont évolue depuis.
    Petit example

    Ne mélangez ni ne comparez des valeurs et des types de données de colonnes car
    l’optimiseur ignorerait l’index.
    Si le type de colonne est NUMBER, n’utilisez pas de guillemets pour encadrer la valeur.
    De même, n’oubliez pas d’encadrer une valeur avec ces guillemets lorsqu’elle est définie
    comme de type alphanumérique.
    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
     
    SQL> set autotrace traceonly explain
    SQL> Select *
     from emp t
      where empno = '7369'  2    3  ;
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2 Card=1 Bytes=3
              7)
     
       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=2 Card=1 Byte
              s=37)
     
       2    1     INDEX (UNIQUE SCAN) OF 'PK_EMP' (UNIQUE)
    Cella ne veut pas dire qu'il faut la faire.

  13. #13
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Cela dépend du noyau utilisé. Ceux qui travaillent encore sur des bases 8 voir même 9 peuvent encore s'inspirer du document.

  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 SheikYerbouti Voir le message
    Cela dépend du noyau utilisé. Ceux qui travaillent encore sur des bases 8 voir même 9 peuvent encore s'inspirer du document.
    Je teste sur une base Oracle 9

    Evitez de coder des sous-requêtes liées dans vos applications. Elles ont un impact négatif sur
    les performances de votre système en consommant beaucoup de ressources CPU.
    La solution consiste à utiliser des vues en ligne (inline views), c'est-à-dire des sous-requêtes
    dans la clause from de l’instruction select, disponible depuis la version 7.3.
    Select e.* from EMP e
    Where e.salary > ( select avg( salary) from EMP i where i.dept_id =
    e.dept_id ) ; -- Mauvais
    Select e.* from EMP e,
    (select i.dept_id DEP, avg(i.salary) SAL from EMP I group by dept_id
    ) EMP_VUE
    where e.dept_id = EMP_VUE.dept_id
    and e.salary > EMP_VUE.SAL ; -- Bon
    En fait c'est un peu plus nuancé.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    JServer Release 9.2.0.5.0 - Production
     
    SQL> set autotrace traceonly explain
    SQL> Select e.* from EMP e
    Where e.sal > ( select avg( sal) from EMP i where i.deptno = e.deptno )
      2    3  ;
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=4 Card=1 Bytes=3
              7)
     
       1    0   FILTER
       2    1     TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=1 Bytes=37)
       3    1     SORT (AGGREGATE)
       4    3       TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=5 Bytes=35)
     
     
     
    SQL> Select e.* from EMP e,
    (select i.deptno DEPTNO, avg(i.sal) SAL from EMP I group by deptno
    ) EMP_VUE
    where e.deptno = EMP_VUE.deptno
    and e.sal > EMP_VUE.SAL
      2    3    4    5    6  ;
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=7 Card=1 Bytes=6
              3)
     
       1    0   HASH JOIN (Cost=7 Card=1 Bytes=63)
       2    1     VIEW (Cost=4 Card=3 Bytes=78)
       3    2       SORT (GROUP BY) (Cost=4 Card=3 Bytes=21)
       4    3         TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=9
              8)
     
       5    1     TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=518)

  15. #15
    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
    Encore une
    N’utilisez pas l’opérateur IS NULL dans une colonne indexée, sinon l’optimiseur ignorera
    l’index.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> Select *
      From emp
     Where empno is Null  2    3  ;
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2 Card=1 Bytes=3
              7)
     
       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=2 Card=1 Byte
              s=37)
     
       2    1     INDEX (RANGE SCAN) OF 'PK_EMP' (UNIQUE)
    Je ne dit pas que cella a un sens ni que le comportement c'est le même si la colonne n'est pas déclaré not null

  16. #16
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Ok mnitu, tu as raison (comme toujours...).
    Donc, chers amis, laissez tomber le lien que je vous indiquais, car je ne tiens pas à voir chacun des concepts indiqués remis en question pour savoir s'il est toujours d'actualité sur une base 9, puis 10g et pourquoi pas 11g pendant qu'on y est.

  17. #17
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Disons qu'Oracle s'est efforcé d'améliorer l'optimiseur mais que ça ne fait pas de mal de garder les fondamentaux comme de comparer des types différents

    Sinon, Mnitu, on attend toujours que tu répondes à la question ce qui serait bien plus constructif que critiquer les nôtres

  18. #18
    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
    Et cella est eronnée ou je le comprends mal.
    Utilisez des index composites. Ceux-ci doivent être classés dans l’ordre décroissant de sélectivité.

  19. #19
    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 SheikYerbouti Voir le message
    Ok mnitu, tu as raison (comme toujours...).
    Donc, chers amis, laissez tomber le lien que je vous indiquais, car je ne tiens pas à voir chacun des concepts indiqués remis en question pour savoir s'il est toujours d'actualité sur une base 9, puis 10g et pourquoi pas 11g pendant qu'on y est.
    Non je n'ai pas toujours raison simplement j'esaie d'argumenter mon point de vue.

  20. #20
    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 orafrance Voir le message
    Disons qu'Oracle s'est efforcé d'améliorer l'optimiseur mais que ça ne fait pas de mal de garder les fondamentaux comme de comparer des types différents

    Sinon, Mnitu, on attend toujours que tu répondes à la question ce qui serait bien plus constructif que critiquer les nôtres
    Salut Orafrance,
    Mon point de vue est bien exprimé dans le lien que tu a posté. Sinon c'est un sujet assez vaste.

    Que faire quand votre requête est trop lente ?

    D'abord, il faut vous poser la question pourquoi elle est lente. Quelle est la vraie cause du problème. Si le pourquoi est inconnu, suggérer de réécrire la requête, ou d'utiliser un hint, ou de la paralléliser etc. n'est pas très productif. Parfois vous pouvez avoir de la chance. Mais même dans ce cas là, vous devez comprendre que si le problème semble « résolu » vous ne savez pas pourquoi et rien ne garantit que le problème ne réapparaisse pas le lendemain. En conséquence, la première étape est toujours de rechercher la racine du problème.
    Je ne vois pas pour quoi " vous critiquer" ça sera "non constructif". Il me semble que j'ai argumenté mes remarques, n'est pas vrai ?

Discussions similaires

  1. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  2. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  3. [principe de base] Objets composés d'objets
    Par brousaille dans le forum JDBC
    Réponses: 11
    Dernier message: 09/02/2005, 19h13
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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