Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/01/2008, 16h15   #1
Invité régulier
 
Inscription : août 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 31
Points : 9
Points : 9
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 ?
Scrouik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h30   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h49   #3
Invité régulier
 
Inscription : août 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 31
Points : 9
Points : 9
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 ?
Scrouik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h53   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h04   #5
Invité régulier
 
Inscription : août 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 31
Points : 9
Points : 9
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 ?!!?
Scrouik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h10   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h24   #7
Invité régulier
 
Inscription : août 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 31
Points : 9
Points : 9
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 ?
Scrouik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h27   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par Scrouik Voir le message
Tu ferais comment toi ?
comme ça : http://oracle.developpez.com/guide/a...age=Chap4#L4.2

Code :
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h36   #9
Invité régulier
 
Inscription : août 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 31
Points : 9
Points : 9
Citation:
Envoyé par orafrance Voir le message
comme ça : http://oracle.developpez.com/guide/a...age=Chap4#L4.2

Code :
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 ?
Scrouik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 17h44   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 12h12   #11
Membre du Club
 
Inscription : décembre 2006
Messages : 119
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 119
Points : 61
Points : 61
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 :
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 ;
pat29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 13h12   #12
Invité régulier
 
Inscription : août 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 31
Points : 9
Points : 9
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 :
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
Scrouik est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h09.


 
 
 
 
Partenaires

Hébergement Web