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

Oracle Discussion :

Table - Partition - Oracle 9.2.0.1


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Par défaut Table - Partition - Oracle 9.2.0.1
    Bonjour,

    Apres avoir parcouru, en vain, le forum et l'Aide sur ce qui est du "partitioning" des tables de données, je me décide à poser ma question, en espérant qu'elle n'ait pas été déjà posé en ces termes.

    J'ai actuellement un certain nombre de table ayant un historique de données si lourd que les traitements s'en ressentent chaque jour un peu plus.

    Je possède Oracle 9.2.0.1, et d'après la documentation il est possible de monter des partitions sur les tables en question.

    Mes question sont :

    • Est-il possible de monter des partitions basé sur des trimestres d'un champ date de ces tables ? (partition range si j'ai bien tout compris)
    • Oracle 9 est-il capable de créer automatiquement une nouvelle partition lors d'un changement de trimestre ?
    • Si oui, auriez-vous l'amabilité de me donner les lignes de commande, ou un exemple de ligne de commende sur lesquelles je pourrais me baser ?
    • Dans le cas ou Oracle 9 ne serait pas capable de créer automatiquement une nouvelle partition sur changement de trimestre, est-il possible de mettre en place un script SQL lors de la connexion a la base qui ferait une telle chose ?

  2. #2
    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 Scrouik Voir le message
    • Est-il possible de monter des partitions basé sur des trimestres d'un champ date de ces tables ? (partition range si j'ai bien tout compris)
    • Oracle 9 est-il capable de créer automatiquement une nouvelle partition lors d'un changement de trimestre ?
    • Si oui, auriez-vous l'amabilité de me donner les lignes de commande, ou un exemple de ligne de commende sur lesquelles je pourrais me baser ?
    • Dans le cas ou Oracle 9 ne serait pas capable de créer automatiquement une nouvelle partition sur changement de trimestre, est-il possible de mettre en place un script SQL lors de la connexion a la base qui ferait une telle chose ?

    * Oui, RANGE ou LIST si une colonne de type TAAAA (trimestre année) existe
    * Non, il faut les créer à l'avance
    * éventuellement tu peux créer un job qui créer une partition tous les trimestres
    * à la connexion ? Ca parait pas être le plus pertinent

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Par défaut
    Citation Envoyé par orafrance Voir le message
    * Oui, RANGE ou LIST si une colonne de type TAAAA (trimestre année) existe
    * Non, il faut les créer à l'avance
    * éventuellement tu peux créer un job qui créer une partition tous les trimestres
    * à la connexion ? Ca parait pas être le plus pertinent

    Merci de tes réponses mais heu ... tu veux pas m'aider ?

    Sur l'exemple que tu as mis quelques part sur le forum (http://download.oracle.com/docs/cd/B...i.htm#i1006532
    J'ai la totalité du code pour ce qui est de créer une partition sur CREATE, mais mon problème c'est que les tables existe déjà. Je cherche de quelle façon je pourrais le faire sur un ALTER mais je ne trouve pas. Tu n'aurais pas un petit bout de code a me donner ?

    Pour ce qui est du JOB... j'avais oublié cette option

    Merci de ta patience

    Edit :

    Je viens de relire le "si une colonne de type TAAAA (trimestre année) existe"
    un champ date normal devrait l'affaire non ?

  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 Scrouik Voir le message
    mais mon problème c'est que les tables existe déjà. Je cherche de quelle façon je pourrais le faire sur un ALTER mais je ne trouve pas. Tu n'aurais pas un petit bout de code a me donner ?
    Si tu cherches ALTER TABLE dans la même URL ou même Adding Partitions tu trouveras ton bonheur

    Citation Envoyé par Scrouik Voir le message
    Je viens de relire le "si une colonne de type TAAAA (trimestre année) existe"
    un champ date normal devrait l'affaire non ?
    dans ce cas ce sera par RANGE

  5. #5
    Membre averti
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Si tu cherches ALTER TABLE dans la même URL ou même Adding Partitions tu trouveras ton bonheur
    ORA-14501: l'objet n'est pas partitionné

    Ben oui !! J'ai essayé

    Citation Envoyé par orafrance Voir le message
    dans ce cas ce sera par RANGE
    HA ?!!?

  6. #6
    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 Scrouik Voir le message
    ORA-14501: l'objet n'est pas partitionné

    Ben oui !! J'ai essayé
    Ha oui... ha bah là j'ai une mauvaise nouvelle : tu ne peux pas partitionner une table non partitionner. Tu peux créer une table partitionnée, y ajouter des partitionnes mais "migrer" la table de non partitionnée à partitionnée. Donc tu fais un CREATE TABLE, tu copies les données, tu supprimes l'ancienne table et tu renommes la nouvelle avec l'ancien nom

    Citation Envoyé par Scrouik Voir le message
    HA ?!!?
    bah oui, tu vas quand même pas spécifié la liste de toutes les dates incluses dans chacun des trimestres... si c'est techniquement faisable c'est pas super pertinent

  7. #7
    Membre averti
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Ha oui... ha bah là j'ai une mauvaise nouvelle : tu ne peux pas partitionner une table non partitionner. Tu peux créer une table partitionnée, y ajouter des partitionnes mais "migrer" la table de non partitionnée à partitionnée. Donc tu fais un CREATE TABLE, tu copies les données, tu supprimes l'ancienne table et tu renommes la nouvelle avec l'ancien nom
    Humm !! Comment dire ... rofl ?

    Citation Envoyé par orafrance Voir le message
    bah oui, tu vas quand même pas spécifié la liste de toutes les dates incluses dans chacun des trimestres... si c'est techniquement faisable c'est pas super pertinent
    Même pas avec un truc genre :
    To_char(SYSDATE,'Q')||'/'||To_char(SYSDATE,'YYYY')

    Tu ferais comment toi ?

  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 Scrouik Voir le message
    Tu ferais comment toi ?
    comme ça : http://oracle.developpez.com/guide/a...age=Chap4#L4.2

    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
    CREATE TABLE range_sales
        ( prod_id        NUMBER(6)
        , cust_id        NUMBER
        , time_id        DATE
        , channel_id     CHAR(1)
        , promo_id       NUMBER(6)
        , quantity_sold  NUMBER(3)
        , amount_sold         NUMBER(10,2)
        ) 
    PARTITION BY RANGE (time_id)
      (PARTITION SALES_Q1_1998 VALUES LESS THAN (TO_DATE('01-APR-1998','DD-MON-YYYY')),
       PARTITION SALES_Q2_1998 VALUES LESS THAN (TO_DATE('01-JUL-1998','DD-MON-YYYY')),
       PARTITION SALES_Q3_1998 VALUES LESS THAN (TO_DATE('01-OCT-1998','DD-MON-YYYY')),
       PARTITION SALES_Q4_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY')),
       PARTITION SALES_Q1_1999 VALUES LESS THAN (TO_DATE('01-APR-1999','DD-MON-YYYY')),
       PARTITION SALES_Q2_1999 VALUES LESS THAN (TO_DATE('01-JUL-1999','DD-MON-YYYY')),
       PARTITION SALES_Q3_1999 VALUES LESS THAN (TO_DATE('01-OCT-1999','DD-MON-YYYY')),
       PARTITION SALES_Q4_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')),
       PARTITION SALES_Q1_2000 VALUES LESS THAN (TO_DATE('01-APR-2000','DD-MON-YYYY')),
       PARTITION SALES_Q2_2000 VALUES LESS THAN (TO_DATE('01-JUL-2000','DD-MON-YYYY')),
       PARTITION SALES_Q3_2000 VALUES LESS THAN (TO_DATE('01-OCT-2000','DD-MON-YYYY')),
       PARTITION SALES_Q4_2000 VALUES LESS THAN (MAXVALUE))
    mais en trimestre

  9. #9
    Membre averti
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Par défaut
    Citation Envoyé par orafrance Voir le message
    comme ça : http://oracle.developpez.com/guide/a...age=Chap4#L4.2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE ...
     
    ... PARTITION SALES_Q4_2000 VALUES LESS THAN (MAXVALUE))
    mais en trimestre
    Merci du coup de main

    J'ai lu quelques parts que si on mettait MAXVALUE il ne serait plus possible de créer par la suite une nouvelle partition ! Me fourvoierais-je ?
    Suis-je obligé de le mettre si je connais parfaitement les dates ou si je prévois a l'avance mes partitions prochaines ?

  10. #10
    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 Scrouik Voir le message
    Me fourvoierais-je ?
    Oui

    En réalité tu ne peux plus ajouter de partition mais tu peux splitter (couper en 2) la dernière

    Citation Envoyé par Scrouik Voir le message
    Suis-je obligé de le mettre si je connais parfaitement les dates ou si je prévois a l'avance mes partitions prochaines ?
    Non, maxvalue est une partition de débordement qui évite qu'une commande tombe en erreur à cause de l'absence d'une partition.

  11. #11
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2006
    Messages : 142
    Par défaut
    Bonjour,

    j'ai eu le même problème il y a peu mais nous faisions en même temps une migration. Sinon pour éviter des transferts de table qui nécessiteront de les doubler un moment ou a un autre dans le tablespace tu peux faire de la manière suivante :

    1. Générer ou créer les scripts des tables et index à partitionner
    2. Exporter les tables à partitionner
    3. supprimer ces tables (en inhibant éventuellement les clés étrangères de tables esclaves)
    4. recréer ces tables avec les scripts de partitionnement par trimestre
    5. réimporter les tables avec les options ignore=y pour avoir les données malgré l'existence de la table et indexes=n
    6. recréer les index des tables partitionnées

    Lors du réimport les données seront automatiquement mises dans la bonne partition.

    Sinon je te conseille de mettre la partition "MAXVALUE" au cas où la partition soit créée en retard ou la donnée en avance.
    Je te conseille aussi de faire la création des nouvelles partitions par script.
    Tu crées donc au départ la table avec uniquement la partition "MAXVALUE" et le script créera les partitions avec comme borne la date passée en paramètre (avec l'instruction split)
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     alter table EXEMPLE
    split partition DATE_MAX at (TO_DATE('01/04/2008','DD/MM/YYYY'))
    into (PARTITION AN2008_T2, PARTITION DATE_MAX)
    UPDATE GLOBAL INDEXES ;

  12. #12
    Membre averti
    Inscrit en
    Août 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 31
    Par défaut
    Citation Envoyé par orafrance Voir le message
    mais en trimestre
    Ce qui est le cas

    Merci pour tous !


    Citation Envoyé par pat29 Voir le message
    ...
    Merci ! Je me demandais justement comment on faisait pour ajouter une nouvelle partition ! Ton scipt arrive a point nommé

    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
     
    (SELECT 
    'CREATE TABLE PORTEFEUILLE 
      COD_VAL      CHAR(12)     NOT NULL, 
      POR_DATEPOS  DATE         NOT NULL, ...
     
      BLABLABLA
      BLABLABLA
      ;
    )
    PARTITION BY RANGE (POR_DATEPOS)'  AS CHAMP, '0' AS TRI FROM DUAL
    UNION
    SELECT DISTINCT '(PARTITION PORT_'||TO_CHAR(POR_DATEPOS,'YYYY')||'_T'||TO_CHAR(POR_DATEPOS,'Q')||' VALUES LESS THAN (TO_DATE(''01/'||
    Decode(To_char(POR_DATEPOS,'Q'),1,'01',2,'04',3,'07',4,'10')||'/'||To_char(POR_DATEPOS,'yyyy')||''',''DD/MM/YYYY'')),' AS CHAMP, '1' AS TRI
    FROM PORTEFEU
    UNION
    SELECT DISTINCT '(PARTITION PORT_'||TO_CHAR(Max(POR_DATEPOS),'YYYY')||'_T'||TO_CHAR(Max(POR_DATEPOS),'Q')||' VALUES LESS THAN (MAXVALUE))' AS CHAMP, '2' AS TRI
    FROM PORTEFEUILLE 
    ) ORDER BY tri
    Je copie le première colonne dans le presse papier, la seconde ne servant qu'a être sur que les lignes arrivent dans le bonne ordre, et je le copie dans une nouvelle page de mon SQL.
    La table originale aura été initialement renommé, toutes les dépendances fonctionnelles désactivées ... enfin bref tout comme tu le dis !
    Un job tournera sur la machine afin de créer automatiquement la nouvelle partition quelques jours avant la fin du trimestre (merci pour le bout de code).
    Je vais tester en grandeur nature sur mon serveur de test.

    Je vais voir

Discussions similaires

  1. Table système Oracle
    Par Nomade95000 dans le forum Oracle
    Réponses: 8
    Dernier message: 12/10/2005, 08h46
  2. Table Mapping Oracle vers MS SQL
    Par cheachwood dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/08/2005, 13h05
  3. Réponses: 15
    Dernier message: 30/06/2005, 16h35
  4. lier les tables acces oracle
    Par xtaze dans le forum Access
    Réponses: 5
    Dernier message: 12/06/2005, 21h39
  5. Réponses: 3
    Dernier message: 19/11/2004, 21h48

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