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 :

Cluster de tables


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut Cluster de tables
    Bonjour a tous

    (oracle 11g -- windows 2003)

    j'ai un doute, soit 2 tables, article et produit. Ces 2 tables possedent un champs pour le JOIN, dans la tabla article c'est ID varchar2(8) et dans la table produit c'est PRODUIT varchar2(8) aussi.

    le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM article a
    INNER JOIN produit p ON a.id=p.produit
    est present dans multitude de requete
    D'ou l'idée de creer un cluster:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create cluster artprod(id VARCHAR2(8 CHAR));
    create index idx_artprod on cluster artprod;
     
    CREATE TABLE productos_cls
       CLUSTER artprod (id)
       AS SELECT * FROM productos;
     
    CREATE TABLE articulos_cls
       CLUSTER artprod (producto)
       AS SELECT * FROM articulos;

    Si j'execute ceci:

    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
    SQL> select /*+ gather_plan_statistics */ count(1) from articulos a
      2  inner join productos p on a.PRODUCTO=p.ID;
     
     
    Plan de Ejecuci¾n
    ----------------------------------------------------------
    Plan hash value: 175009287
     
    -------------------------------------------------------------------------------------------------
    | Id  | Operation              | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT       |                        |     1 |    18 |   315  (12)| 00:00:04 |
    |   1 |  SORT AGGREGATE        |                        |     1 |    18 |            |          |
    |   2 |   NESTED LOOPS         |                        |   367K|  6467K|   315  (12)| 00:00:04 |
    |   3 |    INDEX FAST FULL SCAN| IDX_ARTICULOS_PRODUCTO |   367K|  3233K|   281   (1)| 00:00:04 |
    |*  4 |    INDEX UNIQUE SCAN   | PK_PRODUCTOS           |     1 |     9 |     0   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       4 - access("A"."PRODUCTO"="P"."ID")
     
     
    EstadÝsticas
    ----------------------------------------------------------
              1  recursive calls
              0  db block gets
           2488  consistent gets
            916  physical reads
              0  redo size
            547  bytes sent via SQL*Net to client
            524  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    J'ai un meilleur resultat que si j'execute avec le cluster

    Je comprend pas, ça devrait ameliorer les perfs n'est ce pas?
    Les 2 tables sont bien candidates pour un cluster ?

    Des pistes?
    D'avance merci

  2. #2
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Ici le fait que toutes les colonnes nécessaires soient dans les index sans avoir besoin d'aller voir la table rendent l'accès par index plus efficace que l'accès par cluster.

    Supprimez les index sur les tables, ou selectionnez d'autres colonnes et l'accès par cluster sera probablement plus efficace que les full scan des 2 tables. L'accès par cluster sera aussi plus interessant si vous filtrez sur un ID particulier.

    Vous pouvez forcer l'accès cluster avec les hints suivants: /*+ cluster(a) cluster(p) */ pour comparer et foir si l'optimizeur a vu juste.

    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  3. #3
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonjour Pachot,

    entre temps je suis tombé sur cet article:
    http://www.frontiernet.net/~rhode/cluster.html

    Ouulala.

    Si tu remarques, les nouvelles tables que j'ai cree n'ont pas d'index, vue que selon ce que j'avais compris, l'index est celui que tu asigne au cluster, mais bon j'ai peu être mal pigé la logique.

    Autre chose, que je comprends pas bien, dans la doc ils disent que les tables candidates sont (entre autre) celles qui sont frequement dans les joins par PK.
    D'apres ce que tu dis:

    Ici le fait que toutes les colonnes nécessaires soient dans les index sans avoir besoin d'aller voir la table rendent l'accès par index plus efficace que l'accès par cluster.
    je comprends que dans le cluster tu dois placer d'autres colonnes que celle utilisée pour le JOIN?

    Le printemps se fait attendre, ça a ue influence c'est sûr !! haha

    Merci encore

  4. #4
    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
    Pour ce type de requête si vous ajoutez la contrainte de type clé étrangère entres les deux tables un plan bien plus efficace encore peut être utilisé.

  5. #5
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Si tu remarques, les nouvelles tables que j'ai cree n'ont pas d'index
    Le plan d'exécution en montre pourtant. Mais il semble que c'est le plan du select sur articulos/productos et non sur articulos_cls/productos_cls
    je comprends que dans le cluster tu dois placer d'autres colonnes que celle utilisée pour le JOIN?
    Non. Je parlais des index sur les tables. Mais je me basais sur le plan d'exécution qui semble n'être pas le bon.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  6. #6
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    ha d'accord...
    Bon demain je fais le point et je vous posterais les infos.
    J'ai testé sur un autre jeux de tables avec la relation PK=>FK et oui effectivement on gagne.
    Comment ça ce fait? Oracle va plus vite grace a cette relation?
    Ou c'est juste parce que le fait d'avoir un FK oblige a avoir les même Keys exactement dans les 2 tables ?

  7. #7
    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
    Pour cette type de requête si on peut garantir que toutes les valeurs non-nulles d’une colonne provient d’une relation master-detail, ce que la clé étrangère en principe garanti, on pourrait éliminer la table master et chercher la réponse directement sur l’index de la colonne de jointure de la table détail.

  8. #8
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Comment ça ce fait? Oracle va plus vite grace a cette relation?
    Oracle fait quelques transformations pour optimiser les requêtes. Ici Primary Key-Foreign Key Table Elimination élimine les tables qu'il n'est pas nécessaire d'aller voir lors d'une jointure.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  9. #9
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    D'accord
    ça limite le nombre de blocks a visiter en fait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche des tables liées à des index clustered
    Par lazzeroni dans le forum Administration
    Réponses: 1
    Dernier message: 28/02/2011, 15h35
  2. Data Block corrompu dans cluster de table
    Par Korfandar dans le forum Administration
    Réponses: 2
    Dernier message: 08/09/2010, 19h15
  3. Cluster de tables : usine à gaz ou mécanisme jamais utilisé?
    Par Soutou dans le forum Administration
    Réponses: 4
    Dernier message: 12/06/2010, 11h00
  4. Table d'allocation / Cluster
    Par Golgotha dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 24/01/2008, 19h17
  5. interet d'un Cluster sur une table?
    Par toome dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 04/10/2005, 14h54

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