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

Contribuez Oracle Discussion :

Demande d'avis sur tutoriel tuning de requêtes


Sujet :

Contribuez Oracle

  1. #1
    Membre averti

    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Points : 306
    Points
    306
    Par défaut Demande d'avis sur tutoriel tuning de requêtes
    Bonjour, j'ai rédigé un article / tuto destiné aux développeurs concernant le tuning de requetes sous Oracle ...

    J'avoue manquer de temps en ce moment mais j'aimerai beaucoup un ou deux retours sur le contenu de ce tuto ...

    url: http://jpg.developpez.com/oracle/tuning/

    merci d'avance
    Pas de question technique par MP SVP.

  2. #2
    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
    D'abord félicitation pour ce tuto que l'on attendait depuis longtemps !

    Je l'ai lu rapidement, et j'ai juste une remarque:
    Chapitre IV-C :
    l'index (NOM,PRENOM,TELEPHONE) ne sera pas utilisable pour une requete ne contenant qu'une clause sur TELEPHONE.
    C'est faux (au moins en 10G) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select prenom, tel
    from t1
    where  tel like '01%';
     
    Operation	Object Name	Rows	Bytes	Cost	Object Node	In/Out	PStart	PStop
     
    SELECT STATEMENT Optimizer Mode=CHOOSE		1  	 	1  	 	      	             	 
      INDEX FULL SCAN	CPTLANG.I_T1	1  	15  	1
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    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
    D'abord Bravo !!!



    en 9I aussi c'est faux

    http://asktom.oracle.com/pls/asktom/...:1156161921465



    ca semble contradictoire le IV -C et IV -D

    Encore une fois bravo, merci a l'initiateur


    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

  4. #4
    Membre averti

    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Points : 306
    Points
    306
    Par défaut
    hmmm merci pour ces réponses !
    Je vais corriger celà car en effet je me contredis juste après. Je préciserai que le skip scan est juste moins performant en règle générale.
    Pas de question technique par MP SVP.

  5. #5
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    et tiens moi au courant quand il est terminé
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  6. #6
    Membre averti

    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Points : 306
    Points
    306
    Par défaut
    bon à priori je n'aurais plus le temps de vraiment le faire évoluer tout de suite, donc allons y, publions.

    http://jpg.developpez.com/oracle/tuning/

    Merci de vos avis, il faut que je rajoute ça dans les remarques.
    je fais la demande de correction ortho.
    Pas de question technique par MP SVP.

  7. #7
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    pour ton article il est vraiment complet, même pour une première approche de l'optimisation
    J'aime bien le style humoristique que tu emploies, ça rend l'article plus "compréhensible par tout le monde" et ça capte mieux l'attention
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  8. #8
    Membre averti

    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Points : 306
    Points
    306
    Par défaut
    merci ça fait plaisir

    j'attends maintenant une relecture ortho et puis ça sera publié

    Pour le ton humoristique, mon but est que ce soit plus sympa à lire sans être lourd, j'espère m'en sortir à ce petit jeu. Le public visé est clairement le développeur, et puis je suis sous les tropiques après tout, ici on va au boulot en jean pas en costard, et on ne se prend pas la tête outre mesure

    Il y a d'autres probélmatiques que je ne me suis pas aventuré à détailler comme les jointures & co mais pour une initiation, il me parait difficile de dire aux gens comment influer sur ces points et faire les bons choix sans tomber dans l'encyclopédie Oracle petit format en 43 volumes illustrés + l'index lui même en 5 volumes de 70 pages (celle que tu crois avoir le bouquin en main mais non, c'est juste l'index ...) .
    Pas de question technique par MP SVP.

  9. #9
    Membre averti

    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Points : 306
    Points
    306
    Par défaut
    Mince j'avais pas vu :



    Beau nombre de messages !!! ça c'est du responsable Oracle, ça donne envie d'adhérer
    Pas de question technique par MP SVP.

  10. #10
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Citation Envoyé par jeepnc Voir le message
    je suis sous les tropiques après tout, ici on va au boulot en jean pas en costard, et on ne se prend pas la tête outre mesure
    Ah lalaaaaa ... Ca fait rêver tout ça ...
    Faire de l'Oracle en chemise hawaïenne le pied
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  11. #11
    Inactif  
    Avatar de Aitone
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3 562
    Points : 4 493
    Points
    4 493
    Par défaut
    Le souci est que developpez compte le nombre de posts en caractère numériques

    Pour Vincent, il y aurait fallu des caractères alphanumériques.
    ........


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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    J'ai lu en diagonale mais ça me parait être un excellent document, au moins pour aider les développeurs à bien débuter et les aider à mieux creuser ces considérations

    Il y a beaucoup de fautes de français mais on pourra remédier à cela grâce à la force rédactionnelle de Developpez.com qui compte quelques spécialistes en la matière qui se feront fort de revoir tout ça

    Dans tous les cas, même s'il est perfectible, ce tutoriel est sans aucun doute une référence qui sera précieuse pour les nombreux visiteurs du site. Je t'adresse donc mes félicitations

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    VII-D : il me semble qu'il est intéressant de rappeler comment Oracle récupère les données :
    - si les données sont dans l'index INDEX ACCESS seulement donc moins d'accés disque
    - si les données sont dans les data INDEX ACCESS pour trouver les blocs et TABLE ACCESS pour ramener les données dans ces blocs. Dans ce cas, il peut être intéressant de se passer de l'accès par l'index (si un gros pourcentage des lignes d'une table est récupéré par exemple)

    J'ai pas vu non plus de passage qui rappelle qu'il faut éviter les raccourcis. Imaginons cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT a.id, b.text, c.complement
    FROM a,b,c
    WHERE a.id = b.a_id
    AND a.id=c.a_id
    S'il existe une colonne b_id dans la table c, la jointure c'est pas obligatoire, puisque fonctionnellement, elle n'apporte rien. En revanche, le CBO peut profiter de l'ajout de la jointure : c.b_id = b.id qui permettra de compléter la chaine de données et si les indexes sont bien posés (FK index) profitera très certainement aux perfs

    Enfin, je t'invite à user voir abuser de liens vers d'autres ressources complémentaires de Developpez.com, par exemple :
    http://oracle.developpez.com/guide/tuning/tkprof/
    http://jaouad.developpez.com/conference-jonathan-lewis/
    http://orafrance.developpez.com/dbahelp/#L3

    Et pourquoi pas, étendre l'objet de ce tuto à quelques considérations PL/SQL (ne pas abuser des curseurs et du traitement ligne à ligne lorsqu'on peut faire un traitement par lot. 1 insert de 100 000 lignes vaut mieux que 100 000 inserts de une ligne )

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    Bonjour,

    Dans le chap. VI vous indiquez

    "Imaginons un cas tout simple de clef étrangère: le champ CA de la table A référence le champ CB de la table B. Nous demandons ici à Oracle de vérifier que la valeur que l'on mettra dans CA existe bien dans CB ... "

    et que lors d'un insert de la table contenant la clé étrangère, il va y avoir un gain. Il me semble que lors de l'insertion, oracle vérifie surtout l'existant dans la table parent. Or la clé étrangère référence forcement une clé primaire, elle même forcement indexé.
    En revanche l'indexation de la clé étrangère sera important lors du "delete" d'une ligne dans la table parent.

    Laurent.

  15. #15
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Citation Envoyé par lallio Voir le message
    . Or la clé étrangère référence forcement une clé primaire, elle même forcement indexé.
    Une clé étrangère doit référencer soit une clé primaire soit un ensemble de colonnes possédant la contrainte unique:



    SQL> select * from v$version;

    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE 10.2.0.1.0 Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production

    SQL>
    SQL> drop table e;
    drop table e
    *
    ERROR at line 1:
    ORA-00942: table or view does not exist


    SQL> drop table p;

    Table dropped.

    SQL>
    SQL> create table p(px int primary key, py int unique);

    Table created.

    SQL>
    SQL> create table e(ex int primary key, ey int references p(py));

    Table created.
    et


    SQL> create table p(px int primary key, py int);

    Table created.

    SQL>
    SQL> create table e(ex int primary key, ey int references p(py));
    create table e(ex int primary key, ey int references p(py))
    *
    ERROR at line 1:
    ORA-02270: no matching unique or primary key for this column-list

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    merci ! Ca m'apprendra à lire en diagonale !

  17. #17
    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
    Bref, il y a certaines choses à corriger, des autres à préciser et malheureusement quelques mythes à combattre.
    1) Attention: les valeurs NULL ne sont pas indexées
    IV-B. Les différents types d'indexes
    B-tree: Les index de type b-tree sont le type d'index par défaut quand on ne précise rien. Comme son nom l'indique l'index b-tree est organisé en arbre, les racines constitués par les valeurs précisée a gauche. En clair, si je crée un index avec (NOM,PRENOM) via la commande
    create index monIndex on individus(NOM,PRENOM) cela crée un index en arbre avec les personnes classées par nom puis par prenom ... Attention: les valeurs NULL ne sont pas indexées
    En fait les choses sont un peu plus nuancés et votre exemple mal choisi. Voici une explication.

  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
    2) VII-B. La fonction qu'on ne voit pas
    Si le champs MONTANT est un NUMBER et qu'on exécute "select * from maTable where montant='1'", on effectue une conversion de type implicite. Oracle fera un TO_CHAR sur le champs, et donc une fonction ...
    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 *
      2    from emp
      3   where empno ='7369';
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2 Card=1 Bytes=7
              8)
     
       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=2 Card=1 Byte
              s=78)
     
       2    1     INDEX (UNIQUE SCAN) OF 'PK_EMP' (UNIQUE)

  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
    2) X. Les indexes ne font pas tout ...
    Mettre des indexes sur une base ne résoudra que partiellement les problèmes de performances... quand on redige une requête il faut aussi penser à ce qu'on demande à oracle ...
    Je vais ici donner un exemple frappant que j'ai pu constater ... imaginons deux tables TA et TB, avec un nombre conséquent de lignes ...
    select TA.a,TA.b,TA.c from TA,TB where TA.a=TB.a;
    Une bien belle jointure que voilà ... mais au fait pourquoi fait-on une jointure ici ? alors qu'on ne ramène rien de TB ??? au final on ne fait que ramener de TA ce qui existe aussi dans TB selon la jointure ...
    Select TA.a,TA.b,TA.c from TA,TB where exists (select 1 from TB where TA.a=TB.a);
    Vous constaterez lors de tables avec de nombreux enregistrements, que celà est quand même bien plus rapide ...
    C’est quoi « nombre conséquent de lignes » 10 000, 1 000 000, 10 000 000 ?
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    drop table bigemp
    /
    drop table bigdept
    /
    CREATE TABLE bigemp (
            empno primary key, ename, job, mgr, hiredate, sal, comm, deptno
    ) AS
    SELECT     empno+x AS empno, ename, job, mgr, hiredate, sal, comm, deptno+x AS deptno
    FROM       emp
    CROSS JOIN    (select level*10000 AS x FROM dual CONNECT BY level <= 100000)
    /
    CREATE TABLE bigdept (
            deptno PRIMARY KEY, dname, loc
    ) AS
    SELECT     deptno+x AS deptno, dname, loc
    FROM       dept
    CROSS JOIN    (select level*10000 AS x FROM dual CONNECT BY level <= 100000)
    /
    exec dbms_stats.gather_table_stats(user, 'BIGEMP')
    exec dbms_stats.gather_table_stats(user, 'BIGDEPT')
     
    Select bigemp.* 
      From bigemp
     Where Exists (Select Null
                     From bigdept
                    Where bigdept.deptno = bigemp.deptno)
    /
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=936 Card=1400000
               Bytes=71400000)
     
       1    0   NESTED LOOPS (SEMI) (Cost=936 Card=1400000 Bytes=71400000)
       2    1     TABLE ACCESS (FULL) OF 'BIGEMP' (Cost=934 Card=1400000 B
              ytes=61600000)
     
       3    1     INDEX (UNIQUE SCAN) OF 'SYS_C0021149' (UNIQUE)
     
     
    Select bigemp.* 
      From bigemp
      Join bigdept on (bigdept.deptno = bigemp.deptno)
    /
     
    SQL>   2    3    4
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=936 Card=1400000
               Bytes=71400000)
     
       1    0   NESTED LOOPS (Cost=936 Card=1400000 Bytes=71400000)
       2    1     TABLE ACCESS (FULL) OF 'BIGEMP' (Cost=934 Card=1400000 B
              ytes=61600000)
     
       3    1     INDEX (UNIQUE SCAN) OF 'SYS_C0021149' (UNIQUE)

  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
    2) IV-C. Les indexes composés :quelques règles
    ...
    Il est également plus efficace d'avoir les valeurs les plus restrictives en début d'index.
    Pourriez-vous la démontrer ? Mois j'ai lu quelque parte comment démontrer le contraire.

Discussions similaires

  1. Demande d'avis sur une requête
    Par minnemo dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2009, 17h08
  2. Demande d'avis sur un bouquin (Deitel)
    Par oodini dans le forum C++
    Réponses: 7
    Dernier message: 26/02/2005, 02h50

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