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

Affichage des résultats du sondage: Combien votre base de données contient-elle de tables avec plus de 20 colonnes ? (une seul choix pos

Votants
40. Vous ne pouvez pas participer à ce sondage.
  • Moins de 5%

    24 60,00%
  • Moins de 10%

    4 10,00%
  • Moins de 20%

    5 12,50%
  • PLUS de 20%

    7 17,50%
Optimisations SGBD Discussion :

Petites tables ou grandes tables. . . Quelles conséquences sur les performances ?


Sujet :

Optimisations SGBD

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Beurk ! Pas de VARCHAR dans les clés ! Contre-performant ! En plus, je ne connais pas Oracle, mais si j'interprète correctement ce que je lis dans la doc, NUMBER(38) peut occuper beaucoup plus d'octets qu'un entier donc pas à choisir comme type pour une clé non plus.
    Non en terme de performance tout dépénd du SGBD et sur Oracle ce genre d'affiramtion est fausse ! (même si le choix d'un number(38) peut être discuté) Je vous invite à lire les contributions de Pacman dans Vitesse exécution WHERE = selon type de donnée ainsi que le lien qu'il a posté pour ceux qui connaisse déjà Oracle.
    Citation Envoyé par Waldar Voir le message
    Enfin sur la performance d'un index en fonction de son type (littéral ou numérique), chez Oracle c'est similaire, chez SQL-Server c'est très différent, il n'y a pas de bonne réponse universelle.
    Merci Waldar pour cette contribution plus pragmatique.
    Citation Envoyé par CinePhil Voir le message
    Sauf que le ROWID est en fait une chaîne de caractères donc un index moins performant pour une clé étrangère.
    Non le ROWID est LA méthode d'accès à une table via un index sur Oracle.
    Le ROWID identifie un enregistrement d'une table dans la base de données, à partir de l'adresse physique du bloc et du numéro d'enregistrement dans le bloc. Il est utilisé principalement dans les indexes pour pointer sur l'enregistrement de la table, et dans les tables pour les pointeurs des chained rows. C'est le moyen le plus direct car il permet d'aller directement sur le bloc qui contient l'enregistrement.
    Exemple avec la célèbre table table emp de scott :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE "SCOTT"."EMP"
      (
        "EMPNO" NUMBER(4,0),
        "ENAME" VARCHAR2(10 BYTE),
        "JOB"   VARCHAR2(9 BYTE),
        "MGR"   NUMBER(4,0),
        "HIREDATE" DATE,
        "SAL"    NUMBER(7,2),
        "COMM"   NUMBER(7,2),
        "DEPTNO" NUMBER(2,0),
        CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO"),
        CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
      )
    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 scott.emp where empno = 7839;
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2949544139
    
    --------------------------------------------------------------------------------------
    | Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |        |     1 |    38 |     1   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    38 |     1   (0)| 00:00:01 |
    |*  2 |   INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     0   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------
    C'est évidemment un identifiant interne à Oracle qu'un développeur n'utilisera que très rarement (voir jamais) dans son code.

    Je suis bien évidemment totalement en accord avec le fond de l'article même si l'exemple des numéros de téléphones semblera quelque peu extremiste pour la plus part des lecteurs. Comme d'habitude tout dépend des besoins !

    PS : Tiré d'un autre post que vous avez peut être vu :
    Citation Envoyé par StringBuilder Voir le message
    Je travaille sur un ERP, qui s'appelle Generix.
    Donc pas la peine de le basher sur "son" modèle alors qu'il n'y est pour rien (même s'il semble convaincu par le modèle de l'ERP en question alors que moi même après une très rapide lecture je le suis beaucoup moins...)

  2. #42
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Non le ROWID est LA méthode d'accès à une table via un index sur Oracle.
    Pour être un peu plus précis, le rowid est une pseudo-colonne qui contient l'adresse physique d'une ligne. Les index enregistrent donc les rowid, mais on peut directement accéder à la table si on connait ces derniers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from emp where rowid = '';
    C'est très rapide ainsi !
    Attention toutefois, le rowid n'étant pas une valeur immuable, il est interdit d'en coder "en dur" !

  3. #43
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Attention toutefois, le rowid n'étant pas une valeur immuable, il est interdit d'en coder "en dur" !
    Par "pas immuable", je suppose que tu veux dire que sa valeur peut changer ?

    Dans ce cas, ce n'est pas une bonne clé !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #44
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Tout à fait, c'est pour ça que c'est une pseudocolonne.

    Oracle ne laisse pas le choix, elle existe pour toutes les tables !

  5. #45
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Tout à fait, c'est pour ça que c'est une pseudocolonne.

    Oracle ne laisse pas le choix, elle existe pour toutes les tables !
    Et elle remplace la clé pourrie auto-incrément dénuée de sens qu'on crée habituellement sur les autres SGBD pour "optimiser" la base.

    L'intérêt de cette pseudo colonne, c'est qu'on peut utiliser des clés composites en varchar sans problème comme PK, sans que les performances soient réduites (puisque c'est le ROWID qui est utilisé au final)
    On ne jouit bien que de ce qu’on partage.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Et elle remplace la clé pourrie auto-incrément dénuée de sens qu'on crée habituellement sur les autres SGBD pour "optimiser" la base.
    Pas du tout une clé technique sert à palier la faiblesse des clés fonctionnelles sujettes à modification.
    Une clé fonctionnelle peut être immuable, elle peut alors être une PK.
    Mais si la clé fonctionnelle immuable est composée de multiples colonnes et également FK dans d'autres tables, alors utiliser une séquence pour auto-incrémentée une clé allège l'écriture des jointures ainsi que la quantité de données à stocker.

    Le rowid n'a strictement rien à voir avec les clés.

  7. #47
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Pas du tout une clé technique sert à palier la faiblesse des clés fonctionnelles sujettes à modification.
    Une clé fonctionnelle peut être immuable, elle peut alors être une PK.
    Mais si la clé fonctionnelle immuable est composée de multiples colonnes et également FK dans d'autres tables, alors utiliser une séquence pour auto-incrémentée une clé allège l'écriture des jointures ainsi que la quantité de données à stocker.

    Le rowid n'a strictement rien à voir avec les clés.
    +1
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  8. #48
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    ...
    Non le ROWID est LA méthode d'accès à une table via un index sur Oracle.

    Idem en DB2 for z/OS (on parle de RID) :

    Index pages that point directly to the data in tables are called leaf pages and are said to be on level 0. In addition to data pointers, leaf pages contain the key and record-ID (RID).
    Source :
    DB2 Administration Guide


    Sauf erreur de ma part, il semble que SQL Server ait fait le choix curieux de stocker la clé primaire comme référence à la ligne dans les index secondaires ...

  9. #49
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Pour le ROWID...
    Normal à l'origine Oracle et DB2 (héritier de system R) sont basés sur le même moteur.
    Il existe dans SQL Server mais n'est pas accessible (combinaison de n° de fichier, n° de page dans le fichier et n) de slot de ligne dans la page).

    il semble que SQL Server ait fait le choix curieux de stocker la clé primaire comme référence à la ligne dans les index secondaires ...
    Ce choix n'est pas curieux il est même très intéressant, c'est la notion d'index cluster...
    Effectivement tous les index non cluster reposent sur la valeur de la clef de l'index cluster pour retrouver la ligne originale.
    Cela permet beaucoup de choses, comme par exemple en cas de défragmentation de la table, ne pas toucher aux index !

    A +
    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/ * * * * *

  10. #50
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Et cela permet donc de devoir toujours faire deux accès index au lieu d'un quand tu ne recherches pas sur la PK ?
    Cool !

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  11. #51
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est quoi le problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT j.prj_nom
    FROM projet j
    INNER JOIN personne p ON p.prs_id = j.prj_id_chef
    WHERE p.prs_nom = 'pacmann'
    Je cherche 'pacmann' dans l'index sur prs_nom et je récupère l'identifiant prs_id qui me permet de faire la jointure directement avec la table des projets.

    On s'en fout de savoir que 'pacmann' est dans le fichier 12 page 24 ligne 5 !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #52
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Disons qu'avec un index cluster, la table est dans la PK, l'accès à l'un ou l'autre est équivalent.

    Oracle propose la même fonctionnalité depuis la 8i avec les IOT, fonctionnalité malheureusement sous-utilisée, là où SQL-Server le propose quasiment par défaut.

  13. #53
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Non Cinephil, tu n'as pas compris !
    Faudrait que t'arrêtes vraiment de dire non simplement parce que je ne dis pas "SQLPro, c'est super ton truc".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM person
    WHERE p.prs_nom = 'pacmann'
    Chercher 'pacmann' dans IDX_NOM : récupère <pk_pacmann>.

    Cherche pk_pacmann dans IDX_PK_PERSON : récupère pointeur sur la table.

    Accède à la ligne grâce au pointeur.

    L'étape 2 est, si j'ai compris, l'ajout induit par le système décrit.

    Sinon Waldar, Ok c'est dont une IOT ?

    Mais ça ne change pas grand chose.
    Si on regarde ça :
    http://msdn.microsoft.com/fr-fr/library/ms177443.aspx

    La dernière étape qui accède à la page de données, c'est comme si tu accédais par rowid... l'étape d'au-dessus dans notre cas de recherche : c'est comme si tu avais deux étages d'index, et le troisième étage pour la table.

    Donc tu as parcouru un arbre pour ton premier index, tu reparcours l'arbre pour choper une adresse que tu pourrais déjà avoir.

    Après je dis pas, peut-être que ça s'utilise sur des tables petites en tailles, avec un petit b-tree level...

    [EDIT]
    Et donc Waldar, sur une IOT, les indexes supplémentaires pointent sur la PK au lieu du ROWID ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  14. #54
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il n'y a plus de rowid avec une IOT car il n'y a plus de table, tout est dans l'index !
    La méthode d'accès c'est donc par la PK directement !

    Une petite comparaison toute simple :
    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
    create table pacmann_heap
    (
        pacmann_id   integer      not null
      , pacmann_name varchar2(10) not null
      , constraint pk_pacmann_heap
          primary key (pacmann_id)
    )
    organization heap;
     
    create index ix_pacmann_heap
    on pacmann_heap (pacmann_name);
     
    create table pacmann_iot
    (
        pacmann_id   integer      not null
      , pacmann_name varchar2(10) not null
      , constraint pk_pacmann_iot
          primary key (pacmann_id)
    )
    organization index;
     
    create index ix_pacmann_iot
    on pacmann_iot (pacmann_name);
     
     
    insert into pacmann_heap (pacmann_id, pacmann_name) values (1, 'Pacmann');
    insert into pacmann_heap (pacmann_id, pacmann_name) values (2, 'Régis');
     
    insert into pacmann_iot (pacmann_id, pacmann_name)
    select pacmann_id, pacmann_name from pacmann_heap;
     
    commit;
     
    begin
      dbms_stats.gather_table_stats(user, 'PACMANN_HEAP');
      dbms_stats.gather_table_stats(user, 'PACMANN_IOT');
    end;
    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
    set linesize 125;
     
    select /*+ gather_plan_statistics */  pacmann_id, pacmann_name
      from pacmann_heap
     where pacmann_name = 'Régis';
     
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); 
     
    select /*+ gather_plan_statistics */  pacmann_id, pacmann_name
      from pacmann_iot
     where pacmann_name = 'Régis';
     
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));  
     
     
    select /*+ gather_plan_statistics */  pacmann_id, pacmann_name
      from pacmann_heap
     where pacmann_id = 1;
     
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); 
     
    select /*+ gather_plan_statistics */  pacmann_id, pacmann_name
      from pacmann_iot
     where pacmann_id = 1;
     
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    ---------------------------------------------------------------------------------------------------------                    
    | Id  | Operation                   | Name            | Starts | E-Rows | A-Rows |   A-Time   | Buffers |                    
    ---------------------------------------------------------------------------------------------------------                    
    |   0 | SELECT STATEMENT            |                 |      1 |        |      1 |00:00:00.01 |       2 |                    
    |   1 |  TABLE ACCESS BY INDEX ROWID| PACMANN_HEAP    |      1 |      1 |      1 |00:00:00.01 |       2 |                    
    |*  2 |   INDEX RANGE SCAN          | IX_PACMANN_HEAP |      1 |      1 |      1 |00:00:00.01 |       1 |                    
    ---------------------------------------------------------------------------------------------------------   
    
    ---------------------------------------------------------------------------------------------                                
    | Id  | Operation        | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |                                
    ---------------------------------------------------------------------------------------------                                
    |   0 | SELECT STATEMENT |                |      1 |        |      1 |00:00:00.01 |       1 |                                
    |*  1 |  INDEX RANGE SCAN| IX_PACMANN_IOT |      1 |      1 |      1 |00:00:00.01 |       1 |                                
    ---------------------------------------------------------------------------------------------   
    
    ---------------------------------------------------------------------------------------------------------                    
    | Id  | Operation                   | Name            | Starts | E-Rows | A-Rows |   A-Time   | Buffers |                    
    ---------------------------------------------------------------------------------------------------------                    
    |   0 | SELECT STATEMENT            |                 |      1 |        |      1 |00:00:00.01 |       2 |                    
    |   1 |  TABLE ACCESS BY INDEX ROWID| PACMANN_HEAP    |      1 |      1 |      1 |00:00:00.01 |       2 |                    
    |*  2 |   INDEX UNIQUE SCAN         | PK_PACMANN_HEAP |      1 |      1 |      1 |00:00:00.01 |       1 |                    
    ---------------------------------------------------------------------------------------------------------    
    
    ----------------------------------------------------------------------------------------------                               
    | Id  | Operation         | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |                               
    ----------------------------------------------------------------------------------------------                               
    |   0 | SELECT STATEMENT  |                |      1 |        |      1 |00:00:00.01 |       1 |                               
    |*  1 |  INDEX UNIQUE SCAN| PK_PACMANN_IOT |      1 |      1 |      1 |00:00:00.01 |       1 |                               
    ----------------------------------------------------------------------------------------------    
    Et où est la table IOT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select segment_name, segment_type
      from user_segments
     where segment_name like '%PACMANN%';
     
     
    SEGMENT_NAME         SEGMENT_TYPE        
    -------------------- --------------------
    PACMANN_HEAP         TABLE               
    PK_PACMANN_HEAP      INDEX               
    IX_PACMANN_HEAP      INDEX               
    PK_PACMANN_IOT       INDEX               
    IX_PACMANN_IOT       INDEX
    Nulle part !

  15. #55
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ok, je comprends.
    Pour montrer ce que je voulais dire, je change un peu ton exemple :

    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
     
    SQL> CREATE TABLE pacmann_iot
      2  (
      3      pacmann_id   integer      NOT NULL
      4    , pacmann_name varchar2(10) NOT NULL
      5    , pacmann_name2 varchar2(10) NOT NULL
      6    , constraint pk_pacmann_iot
      7        PRIMARY KEY (pacmann_id)
      8  )
      9  organization INDEX;
     
    Table crÚÚe.
     
    EcoulÚ : 00 :00 :00.02
    SQL> CREATE INDEX ix_pacmann_iot
      2  ON pacmann_iot (pacmann_name);
     
    Index crÚÚ.
     
    SQL> INSERT INTO pacmann_iot (pacmann_id, pacmann_name, pacmann_name2) VALUES (1, 'Pacmann', 'XXXXX');
     
    1 ligne crÚÚe.
     
    EcoulÚ : 00 :00 :00.00
    SQL>
    SQL> INSERT INTO pacmann_iot (pacmann_id, pacmann_name, pacmann_name2) VALUES (2, 'Régis', 'XXXXX');
     
    1 ligne crÚÚe.
    Test :
    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
     
    SQL> EXPLAIN PLAN FOR
      2  SELECT /*+index(a ix_pacmann_iot)*/ *
      3    FROM pacmann_iot a
      4   WHERE pacmann_name = 'Régis';
     
    ExplicitÚ.
     
    EcoulÚ : 00 :00 :00.00
    SQL> SELECT * FROM table(dbms_xplan.display);
     
    PLAN_TABLE_OUTPUT
    ---------------------------------------------------------------------------
     
    -------------------------------------------------------------------------
    | Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)|
    -------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                |     1 |    27 |     1   (0)|
    |*  1 |  INDEX UNIQUE SCAN| PK_PACMANN_IOT |     1 |    27 |     1   (0)|
    |*  2 |   INDEX RANGE SCAN| IX_PACMANN_IOT |     1 |       |     1   (0)|
    -------------------------------------------------------------------------
    Quand tu fais une recherche par index, tu dois en faire une deuxième dans la foulée.
    La différence avec un accès à une table par row_id ?
    C'est que tu reparcours une arborescence.

    Ton scan de PK_PACMANN_IOT s'il est sur 3 étage, on pourrait faire le parallèle avec une table normale et une PK normale, où ton index n'est que sur 2 étage, où tu choppes ton ROWID, et tu as une étape supplémentaire qui te conduit au bloc de données.
    Et il faut faire le test, mais à mon avis quand tu prends une table qui des "grosses" lignes et que tu la mets sous IOT, tu peux te retrouver avec b-tree à pleins d'étages, non ?

    Sous Oracle, on n'utilise pas tout le temps des IOT... parce que ce n'est toujours optimal je suppose
    (Même si les principales raisons sont peut être ailleurs ? Sur les FTS ?)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  16. #56
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Juste une petite précision que j'ai lue en googlant, s'il n'y a pas accès par ROWID, c'est certes parce qu'il n'y a pas de table.

    C'est surtout parce que l'index est soumis à trop "d'opérations de maintenance" dans la mesure où c'est un balanced b-tree index, et qu'il faudrait maintenir la modification de ce rowid...

    Du coup il y a un urowid immuable, mais qui ne permet pas d'accès direct.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  17. #57
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ton exemple est meilleur que le mien, tu as raison de rajouter une colonne.
    J'aurai du y penser en voyant le plan.

    Tu as raison, si le B*Tree de la PK comporte beaucoup d'étage ça augmente le nombre de scans...

    Et on revient directement en relation avec l'article de SQLPro : beaucoup de petites tables limitent justement cet effet !

  18. #58
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Keep cool (pac)man !
    Citation Envoyé par pacmann
    Non Cinephil, tu n'as pas compris !
    Faudrait que t'arrêtes vraiment de dire non simplement parce que je ne dis pas "SQLPro, c'est super ton truc".
    J'ai pas dit non, j'ai dit :
    C'est quoi le problème ?
    Ensuite j'ai tenté, sans doute maladroitement et sans développer assez, d'expliquer comment je pensais que ça se passait.

    Je n'ai pas tout compris à vos explications mais apparemment je n'ai pas encore assimilé tout le mécanisme interne des index. Il est vrai que je n'ai jamais eu besoin de le faire.

    Enfin l'essentiel, dans le cadre de cette discussion, est là :
    Citation Envoyé par Waldar
    Et on revient directement en relation avec l'article de SQLPro : beaucoup de petites tables limitent justement cet effet !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  19. #59
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par Waldar Voir le message
    ... Et on revient directement en relation avec l'article de SQLPro : beaucoup de petites tables limitent justement cet effet !
    Et c'est encore pire avec SQL Server ... Seulement, DB2 (for z/OS et les autres sans doute ... ) ne travaillent pas comme cela et donc l'argument sur les performances (sans être totalement irrecevable) est moins percutant ...

  20. #60
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ok, désolé, j'ai peut-être un peu sur-réagi notamment sur :
    On s'en fout de savoir que 'pacmann' est dans le fichier 12 page 24 ligne 5 !
    ... que j'ai considéré comme un ton que tu n'emploies pas quand tu poses vraiment une question, mais plus une autre formulation de "tu dis n'importe quoi".

    Bref, je suis de toutes façons d'accord sur les bienfaits possibles de "petites" lignes (après à vue d'oeil, je ne serais pas non plus catégorique et accepterais qu'il puisse y avoir des configuration où la "dénormalisation" puisse se justifier).

    Par contre, je maintiens que c'est quand mieux de pouvoir choisir si ta table est index organised ou non
    (Je vais faire quelques tests sur des tables pas trop grosse mais quand même un peu)

    [EDIT] tout à fait d'accord Luc, ça fait un peu l'oeuf et la poule sur le coup

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. Impact sur les performances avec un grand nombre de tables
    Par enila dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 04/08/2011, 15h40
  2. Une grande table VS 2 tables de taille correcte
    Par mikaeru dans le forum Optimisations
    Réponses: 3
    Dernier message: 11/06/2011, 16h17
  3. [AC-2003] séparer une grande table en sous table par année
    Par MatAir dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 25/03/2011, 19h24
  4. Réponses: 3
    Dernier message: 04/01/2011, 15h05
  5. Impact sur les performances d'un grand nombre de tables
    Par thechief dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/07/2010, 16h47

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