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 :

tuning partionner table ou index?


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Par défaut tuning partionner table ou index?
    Bonjour à tous,

    J'ai 2 questions :

    1) vaut il mieux utiliser une table partitionnée ou un index partitionné?

    2) problème sur une manip.
    Voilà, j'ai suivit la procédure suivante :
    Partitioning Existing Tables à l'adresse suivante
    http://www.oracle-base.com/articles/...exes.php#Range

    Cette procédure m'a permis de transformer une table non partitionnée avec des données existante en table partitionnée.
    J'ai juste modifier le scipt suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TABLE my_table_2 (id NUMBER,  description  VARCHAR2(50))
    PARTITION BY RANGE (id)
    (PARTITION my_table_part VALUES LESS THAN (MAXVALUE));
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE my_table_2 (id NUMBER,  description  VARCHAR2(50))
    PARTITION BY RANGE (id)
    (PARTITION my_table_part1 VALUES LESS THAN (10) tablespace "user",
    PARTITION my_table_part2 VALUES LESS THAN (20) tablespace "user",
    PARTITION my_table_part1 VALUES LESS THAN (MAXVALUE) tablespace "user");
    et donc les alter exchange partition pour les 3 partitions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ALTER TABLE my_table_2  EXCHANGE PARTITION my_table_part1  WITH TABLE my_table  WITHOUT VALIDATION;
    ALTER TABLE my_table_2  EXCHANGE PARTITION my_table_part2  WITH TABLE my_table  WITHOUT VALIDATION;
    ALTER TABLE my_table_2  EXCHANGE PARTITION my_table_part3  WITH TABLE my_table  WITHOUT VALIDATION;
    avec creation d'une cle primaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alter table my_table add (constraint "code_PK" primary key (id);
    Et maintenant si je fait une requete avec une clause where sur id tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from my_table where id='1'
    et bien je n'ai aucun resultat, alors que je vous assure qu'il existe !!!!

    Merci pour votre aide

  2. #2
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Et maintenant si je fait une requete avec une clause where sur id tel que :

    SELECT * FROM my_table WHERE id='1'
    et bien je n'ai aucun resultat, alors que je vous assure qu'il existe !!!!
    C'est normal que tu ne retrouves pas tes données, étant donné que tu as échangé le contenu de cette table avec la 1ère partition.

    Essaye de faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from my_table_2 partition (my_table_part1) ;
    Je pense que tu vas retrouver toutes tes données dedans.

    De plus, les 2 échanges suivants ne servent à rien, vu que tu échanges une table vide, avec des partitions vides.

    En fait, je ne comprends pas trop ce que tu veux faire. Mais si tu souhaitais charger ta table partitionnée, il suffisait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into my_table_2 select * from my_table ;

  3. #3
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par crazykangourou
    Bonjour à tous,

    J'ai 2 questions :

    1) vaut il mieux utiliser une table partitionnée ou un index partitionné?
    Heu, on est obligé de choisir ou l'un ou l'autre ? Je dirais qu'un index partitionné sans que la table le soit, je ne comprendrais pas trop.

    Citation Envoyé par crazykangourou
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from my_table where id='1'
    et bien je n'ai aucun resultat, alors que je vous assure qu'il existe !!!!
    Ben, çà semble normal, tu as fais des EXCHANGE... donc tu vides ta table de départ (non partitionnée) dans tes partitions de ta table cible (partitionnée). Donc il ne devrait plus rien y avoir dans ta table my_table. Donc ta requête n'invente pas le résultat.

    Nicolas.

    PS : bon j'ai été un peu lent sur cette affaire...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par NGasparotto
    Heu, on est obligé de choisir ou l'un ou l'autre ? Je dirais qu'un index partitionné sans que la table le soit, je ne comprendrais pas trop.
    Partitionner une table après coup ce n'est pas faisable. C'est très long et ça peut nécessité pas mal de volume que de recréer la table . Quand à l'intérêt... Bah ça en a autant sur une table partitionnée que non partitionné

    C'est à dire que l'index peut être très volumineux et dans ce cas, un partitionnement peut s'avérer salvateur

  5. #5
    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
    Par défaut
    Un exemple avec 3 partitions et 3 tables non vides:

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    SQL> 
    SQL> 
    SQL> drop table ptable;
     
    Table dropped.
     
    SQL> drop table table10;
     
    Table dropped.
     
    SQL> drop table table20;
     
    Table dropped.
     
    SQL> drop table table30;
     
    Table dropped.
     
    SQL> 
    SQL> select * from v$version;
     
    BANNER                                                                          
    ----------------------------------------------------------------                
    Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod                
    PL/SQL Release 10.1.0.2.0 - Production                                          
    CORE	10.1.0.2.0	Production                                                      
    TNS for 32-bit Windows: Version 10.1.0.2.0 - Production                         
    NLSRTL Version 10.1.0.2.0 - Production                                          
     
    SQL> 
    SQL> 
    SQL> CREATE TABLE ptable (id NUMBER,  description  VARCHAR2(50))
      2  PARTITION BY RANGE (id)
      3  (PARTITION p1 VALUES LESS THAN (10) ,
      4   PARTITION  p2 VALUES LESS THAN (20) ,
      5   PARTITION  p3 VALUES LESS THAN (MAXVALUE));
     
    Table created.
     
    SQL> 
    SQL> 
    SQL> CREATE TABLE table10 (id NUMBER,  description  VARCHAR2(50));
     
    Table created.
     
    SQL> insert into table10 values(1, '1');
     
    1 row created.
     
    SQL> 
    SQL> CREATE TABLE table20(id NUMBER,  description  VARCHAR2(50));
     
    Table created.
     
    SQL> insert into table20 values(11, '11');
     
    1 row created.
     
    SQL> 
    SQL> CREATE TABLE table30(id NUMBER,  description  VARCHAR2(50));
     
    Table created.
     
    SQL> insert into table30 values(21, '21');
     
    1 row created.
     
    SQL> 
    SQL> 
    SQL> ALTER TABLE ptable  EXCHANGE PARTITION p1	WITH TABLE table10;
     
    Table altered.
     
    SQL> ALTER TABLE ptable  EXCHANGE PARTITION p2	WITH TABLE table20;
     
    Table altered.
     
    SQL> ALTER TABLE ptable  EXCHANGE PARTITION p3	WITH TABLE table30;
     
    Table altered.
     
    SQL> 
    SQL> SELECT * FROM table10;
     
    no rows selected
     
    SQL> SELECT * FROM table20;
     
    no rows selected
     
    SQL> SELECT * FROM table30;
     
    no rows selected
     
    SQL> 
    SQL> SELECT * FROM ptable;
     
            ID DESCRIPTION                                                          
    ---------- --------------------------------------------------                   
             1 1                                                                    
            11 11                                                                   
            21 21                                                                   
     
    SQL> SELECT * FROM ptable partition (p1) ;
     
            ID DESCRIPTION                                                          
    ---------- --------------------------------------------------                   
             1 1                                                                    
     
    SQL> SELECT * FROM ptable partition (p2) ;
     
            ID DESCRIPTION                                                          
    ---------- --------------------------------------------------                   
            11 11                                                                   
     
    SQL> SELECT * FROM ptable partition (p3) ;
     
            ID DESCRIPTION                                                          
    ---------- --------------------------------------------------                   
            21 21                                                                   
     
    SQL> 
    SQL> 
    SQL> exit
    L'échange de partitions doit être quand même plus rapide que INSERT .. SELECT * dans le cas suivant (http://download-uk.oracle.com/docs/c...htm#sthref2761):

    Exchanging table partitions is most useful when you have an application using non-partitioned tables that you want to convert to partitions of a partitioned table. For example, in data warehousing environments exchanging partitions facilitates high-speed data loading of new, incremental data into an already existing partitioned table. Generically, OLTP as well as data warehousing environments benefit from exchanging old data partitions out of a partitioned table. The data is purged from the partitioned table without actually being deleted and can be archived separately afterwards

  6. #6
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par Fred_D
    C'est à dire que l'index peut être très volumineux et dans ce cas, un partitionnement peut s'avérer salvateur
    Je comprends bien, mais un gros index est, en général, sur une table elle-même déjà relativement volumineuse, et qui est souvent aussi candidate à la partition.

    Nicolas.

  7. #7
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Par défaut
    Citation Envoyé par NGasparotto
    Je comprends bien, mais un gros index est, en général, sur une table elle-même déjà relativement volumineuse, et qui est souvent aussi candidate à la partition.

    Nicolas.
    Dis moi Nicolas, cela t'arrive t'il de lire tes messages privés ???

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par peter27x
    Dis moi Nicolas, cela t'arrive t'il de lire tes messages privés ???
    tu vas le faire dans tous les sujets ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par NGasparotto
    Je comprends bien, mais un gros index est, en général, sur une table elle-même déjà relativement volumineuse, et qui est souvent aussi candidate à la partition.

    Nicolas.
    certes mais c'est pas forcément utile. En effet, si tu ne fais que de l'index scan alors le partitionnement de la table ne sert pas à grand chose Et surtout, comme je le disais, recréer la table peut être très pénible

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Par défaut
    Merci pour vos réponse.

    Alors je réponds à rouardg : effectivement, je voulais remplir ma table partitionnée en ayant au préalable saisie mes conditions de partitionnement de 10 en 10, puis en echangeant partition par partition, mais bon apparement, mauvaise option.

    Je réponds à tout le monde, oui, c'est fastidieux de modifier une table pour la partitionner, surtout que si je comprends bien pour faire une requete sur la partition, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM my_table_2 partition (my_table_part1) ;
    J'ai donc choisi l'option de faire un index partitionné, ce qui me va trés bien!!!!
    Et sur une requete avec jointure contenant une table de 1millions de lignes, en partitionnement avec les index, le gain de temps est vraiment impressionnant!!!

    Je peux vous donner plus de détails si vous voulez...

    A bientot et encore merci

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

Discussions similaires

  1. [Débutant] Ajouter des tables, des indexs
    Par sunchai dans le forum Oracle
    Réponses: 2
    Dernier message: 12/07/2006, 17h46
  2. Reconstruction d'une table avec index
    Par Ry_Yo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/04/2005, 09h12
  3. Tables paraodox ("Index out date") et controle sa
    Par belaid52 dans le forum Bases de données
    Réponses: 4
    Dernier message: 03/07/2004, 11h29
  4. SQL 2000 - Liste + taille des tables et index
    Par Fox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2004, 15h59
  5. Création de table avec index
    Par Seb7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/04/2003, 16h11

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