Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3051 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  réplication Oracle et traitement de masse ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

réplication Oracle et traitement de masse ...

n°1264649
belldandys
Posté le 12-12-2005 à 16:10:05  profilanswer
 

Bonjour,
J'ai une base source et une base répliquée (en Oracle 9i toutes les deux); il a été décidé récemment qu'une purge allait avoir lieu dans la base source, sur les tables d'archive (environ 50M de lignes par table, soit 50% des tables).
J'aimerais savoir s'il existe une procedure rapide pour répercuter ces modifications dans ma base répliquée.
 
Merci d'avance,
Bell !

mood
Publicité
Posté le 12-12-2005 à 16:10:05  profilanswer
 

n°1264663
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-12-2005 à 16:20:45  profilanswer
 

Salut Déesse du Présent :love: (sans le S normalement... on va dire que c'est pour "sama" )
 
Alors...
 
Normalement, dans Oracle, il doit y avoir un moyen de gérer la réplication de bases en automatique.
 
Sinon, il reste la solution du "annule et remplace" avec extract au format SQL Loader.

n°1264674
belldandys
Posté le 12-12-2005 à 16:28:37  profilanswer
 

Le probleme c'est que faire un "bête" refresh (fast ou complete) n'est pas envisageable (beaucoup trop long)...
 

n°1264676
orafrance
Posté le 12-12-2005 à 16:31:15  profilanswer
 

pourquoi ne pas faire la purge et appliquer un refresh COMPLETE ? Normalement ça devrait être rapide suite à la purge non ?

n°1264684
belldandys
Posté le 12-12-2005 à 16:35:46  profilanswer
 

Un refresh complete sur 50 millions de lignes, c'est trop long.
N'y a t il pas une procedure du genre (deco des journaux, purge base source, purge base repliquée, reco des journaux....) ?

n°1264731
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-12-2005 à 17:20:50  profilanswer
 

sql loader, c'est ce qu'il fait tout seul comme un grand.


Message édité par Arjuna le 12-12-2005 à 17:21:04
n°1264775
belldandys
Posté le 12-12-2005 à 17:44:00  profilanswer
 

Non SQL Loader il fait (deco des journaux, purge base source, reco des journaux....) ? La meme chose qu'a la main... et donc trop long :'(....
 

n°1264777
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-12-2005 à 17:45:24  profilanswer
 

:??:
 
comment ça "c'est trop long" ?

n°1264779
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-12-2005 à 17:46:11  profilanswer
 

je vois pas comment tu veux faire plus rapide que de l'import raw... hors c'est ce que fait ce dernier (avec juste une vérification des types)

n°1264790
belldandys
Posté le 12-12-2005 à 18:00:36  profilanswer
 

Je ne vois moi non plus pas de solution plus rapide (50 millions de lignes en refresh complete, ca me prend aujourd'hui 25 minutes ... Papa noel, apporte moi un nouveau serveur stp ....) si j'incorpore la destruction partielle de ma base a cause de la suppression du snapshot, j'en prends pour 1 heure... Bien sur, comparé à une refresh fast avec un journal de 50 millions de lignes, c'est mieux (c'est surtout mes amis de la base source qui sont heureux ....). C'etait juste pour savoir si quelqu'un avait trouver une astuce plus rapide.... (je sais pas pourquoi, je suis presque certaine que ca existe...)
 
Bell !

mood
Publicité
Posté le 12-12-2005 à 18:00:36  profilanswer
 

n°1264821
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-12-2005 à 19:03:22  profilanswer
 

En fait, ta base destination, elle contient quoi ?
 
Comment se fait-il que tu as d'un coup 50 millions de lignes à synchroniser ?

n°1265203
belldandys
Posté le 13-12-2005 à 09:45:03  profilanswer
 

Bon je reprends, j'ai l'impression de ne pas avoir été très claire....
J'ai une table de 100 M de lignes dans une base source, je dois purger 50 M de lignes... Aujourd'hui la réplication se fait en differentiel (un refresh fast) , ce qui est inimaginable dans mon cas, car un journal avec autant de lignes plante les perfs de la base source. Je vais donc sans doute recreer cette réplication (soit 50M de lignes)... En somme dans tous les cas, c'est un travail très lourd, et je me disais qu'il existait sans doute une solution pour faire le travail sur les 2 bases et reconnecter les journaux ensuite (ce qui serait fantastique!!)...


Message édité par belldandys le 13-12-2005 à 09:59:48
n°1265252
belldandys
Posté le 13-12-2005 à 10:43:02  profilanswer
 

Bon pour se distraire en attendant, voila un petit jeu:
"J'ai une table dans laquelle ctr_id représente un identifiant de contrat, qte la quantité du produit restante sur ce contrat et datesys la date d'enregistrement. Je souhaite avoir pour chaque contrat les lignes pour lesquelles qte=0 ou s'il n'en existe aucune la dernière ligne (selon datesys)... Sous Oracle (9i pour moi), quelle est la meilleure requete ?
 
Exemple de table :
ctr_id     qte         datesys
1           0           18/07/2005
1           976        23/07/2005
1           194        16/08/2005
2           812        01/08/2005
2           59         23/08/2005
2           52         01/09/2005
3           709        08/08/2005
3           0           13/08/2005
3           0           16/08/2005
 
le résultat attendu :
ctr_id     qte        datesys
1           0           18/07/2005
2           52          01/09/2005
3           0           13/08/2005
3           0           16/08/2005
 
Bisous doux,  
Bell !


Message édité par belldandys le 13-12-2005 à 10:45:47
n°1265557
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 14:52:19  profilanswer
 

je trouvais plus ton truc :)
 
bon, à j'ai rien à foutre pour les 10 prochaines minutes...
 
alors...
=> Si une ligne = 0 alors tu veux la liste des dates associées
=> Si pas 0, alors tu veux le min et la date associée
si on a deux fois le même min ? on va dire à nouveau que tu veux la liste
 
DONC, après simplification :
 
Tu veux la liste des datesys où qte est minimum pour un ctr_id donné. y'a plus d'histoire de 0 qui tiens :)

n°1265569
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 15:00:41  profilanswer
 

hmmmm... pas une bonne idée de tester ça dans l'historique des commandes... y'a un peu trop de lignes, ça ramme :D

n°1265573
belldandys
Posté le 13-12-2005 à 15:04:03  profilanswer
 

Nan, c'est pas bien, j'ai mis un exemple pourtant ...
Je recopie donc, normalement l'exemple ne laisse aucun doute... :
 
"Je souhaite avoir pour chaque contrat les lignes pour lesquelles qte=0 ou s'il n'en existe aucune, la dernière ligne (selon datesys)... "

n°1265575
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 15:06:00  profilanswer
 

J'ai du bugger quelquepart :D
 


The following error has occurred:
 
ORA-01652: impossible d'étendre le segment temporaire de 128 dans l'espace table TMPGNX


:sol:


Message édité par Arjuna le 13-12-2005 à 15:06:21
n°1265579
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 15:07:34  profilanswer
 

belldandys a écrit :

Nan, c'est pas bien, j'ai mis un exemple pourtant ...
Je recopie donc, normalement l'exemple ne laisse aucun doute... :
 
"Je souhaite avoir pour chaque contrat les lignes pour lesquelles qte=0 ou s'il n'en existe aucune, la dernière ligne (selon datesys)... "


ok pour la dernière ligne si <> 0
l'exemple n'était pas explicite, ça correspondait aussi à la plus petite valeur ;)

n°1265587
belldandys
Posté le 13-12-2005 à 15:12:11  profilanswer
 

C'est pour ca qui y a un enoncé .. :p
ra la la, les hommes, ca ecoute jamais rien ... :)

n°1265595
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 15:16:35  profilanswer
 


select codpro, c01, sigdep
from dsk
where dsk.codsoc = 2
and (
 (c01 = 0)  
 or
 (not exists (select null from dsk dsk2 where dsk2.codsoc = dsk.codsoc and dsk2.codpro = dsk.codpro and dsk2.c01 = 0 and dsk2.sigdep in ('DPT', 'DPT1'))
 and dsk.sigdep = (select max(sigdep) from dsk dsk2 where dsk2.codsoc = dsk.codsoc and dsk2.codpro = dsk.codpro and dsk2.sigdep in ('DPT', 'DPT1')))
 )
and dsk.sigdep in ('DPT', 'DPT1')


 
Wouala.
 
C'est pas du tout les mêmes donnés, mais je fais le même traîtement :
 
-> Je rammène la liste des dépôt parmis DPT et DPT1 où j'ai 0 en stock pour chaque produit suivit en stock de ma base.
-> Si aucun stock n'est à 0, je rammène me MAX() de mes dépot pour mon produit (y'a pas de date dans mes dépôts alors on fait avec les moyens du bords :D)

n°1265599
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 15:18:35  profilanswer
 

belldandys a écrit :

C'est pour ca qui y a un enoncé .. :p
ra la la, les hommes, ca ecoute jamais rien ... :)


bah c pas ça, c'est surtout que je suis tout naze et que j'ai un gros problème là, et je ne peux pas le résoudre...
 
le client est radin.
 
pour ça, il a pris la version la moins chère de l'ERP.
 
et y'a un truc qui marche pas.
 
en creusant la doc, on s'apperçoit que c'est une limiation de la version "pas chère" de l'ERP.
 
et ma société s'est engagée en TMA pour résoudre ce problème... sans savoir que c'était pas pris en charge par l'ERP...
 
du coup là je suis comme un con, je sais pas quoi faire.
 
donc j'ai pas la tête à lire des énnoncés ;)

n°1265601
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-12-2005 à 15:19:52  profilanswer
 

ps: malgré la tronche de ma requête, elle est très rapide (bon, ok, la table n'est pas très grosse)
 
Oralce 8i

n°1265605
belldandys
Posté le 13-12-2005 à 15:24:10  profilanswer
 

ma requete est beaucoup mieux :) (c'est cool tu pourras l'utiliser après)... je vous laisse chercher encore un peu....
par mieux j'entends:
- plus performante
- plus claire

n°1265607
belldandys
Posté le 13-12-2005 à 15:26:40  profilanswer
 

bon tout ca, ca n'a pas résolu mon probleme de réplication, et après beaucoup de recherche, il semble que je sois obligée de faire un refresh complete.. :'(... la vie est vraiment trop injuste !

n°1266475
belldandys
Posté le 14-12-2005 à 16:14:33  profilanswer
 

Bon ca n'interesse personne, mais je mets quand meme ma solution pour fermer le thread...
select ctr_id, qte, datesys from
(select t.*,  
          max(case when qte=0 then 1 end) over (partition by ctr_id) existe_qte_0,  
          max(datesys) over (partition by ctr_id) maxdatesys
 from some_data t)
where
(existe_qte_0=1 and qte=0)
or
(existe_qte_0 is null and datesys=maxdatesys)
 
Dans ce cas, c'est environ 30% plus rapide et economique que l'auto-jointure, mais dans des cas plus complexes j'arrive à 10 fois plus rapide (par exemple quand il sagit de calculer des moyennes ou des intervalles)....


Message édité par belldandys le 14-12-2005 à 16:15:06
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  réplication Oracle et traitement de masse ...

 

Sujets relatifs
Supprimer en masse des membres forum phpbb[VB6] traitement sur tableau excel très lent [résolu]
traitement des caractères fonctions Lef, Mid , Right[Oracle] Concat et Group by
[Oracle] Teste chaine de caractererequêtes entre BDD Oracle différentes
SQL Access/OracleUtilisation JProgressBar & temps de traitement incconu
Réplication mysql "déportée" (pas en temps réel)[PL/SQL] traitement de date
Plus de sujets relatifs à : réplication Oracle et traitement de masse ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR