|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 65 ![]() |
Bonjour à tous,
J'ai une instance de base Oracle de production qui contient toutes mes données de production (schéma PRODUCTION) et une instance de base infocentre qui contient tous mes indicateurs calculés et historisés (schéma INFOCENTRE). Cette dernière a un dblink vers la base de production DBPROD_LNK. Pour calculer les indicateurs à partir des données de production puis les mettre à jour dans l'infocentre, je passe par une table temporaire TB_TEMP avant de stocker le résutat définitif dans la table TB_RESULT. Voici le code correspondant: Code :
Elle me renvoie une erreur car normalement cette table n'existe pas déjà dans le schéma INFOCENTRE. Mes questions sont les suivantes : 1. comment faire pour tester l'existence préalable d'une table et soit la créer si elle n'existe pas soit faire un truncate si elle existe avec la même structure soit encore faire un drop si elle existe mais avec une structure différente ? 2. avez-vous une autre solution pour faire un merge entre des instances Oracle différentes ? Merci beaucoup à tous pour votre aide précieuse, MarieO |
||
|
|
00
|
|
|
#2 |
![]() ![]() |
Quelques étrangetés quand même.
Pourquoi DROP / CREATE table à chaque fois ? La structure de votre table de production change souvent ? Dans votre MERGE vous faites une sous-requête, mais cette dernière n'est pas nécessaire. Vous avez une sortie en UPDATE mais pas en INSERT, comment gérez-vous les nouveaux mois ? Sinon je viens de tester sur une 11g, le MERGE avec un dblink fonctionne.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 65 ![]() |
Il arrive que la structure de la table change, c'est pourquoi j'ai fait un DROP suivi d'un CREATE...
Par ailleurs, afin de simplier le code donné en exemple, je n'ai pas repris l'intégralité de la requête telle qu'elle est écrite dans le script sql. Ceci explique la sous-requête qui ne semble pas nécessaire ainsi que l'absence de UPDATE pour les lignes nouvelles qui ont une autre origine que la requête utilisée dans le merge. Pour information, je suis en 10gR2. C'est peut-être pour cela que le merge ne fonctionne pas... Si quelqu'un a une solution (ou des solutions) à proposer, je suis preneuse. MarieO |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
|
|
|
00
|
|
|
#5 | |
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 65 ![]() |
Citation:
Par contre, cela ne répond pas à ma question sur comment tester l'existence d'une table... MarieO |
|
|
|
00
|
|
|
#6 |
![]() ![]() |
Il suffit d'interroger la vue SYS.ALL_TABLES.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#7 | ||
|
Futur Membre du Club
![]() Inscription : mai 2006 Messages : 65 ![]() |
Je ne sais pas interroger sys.all_tables ...
Comment faudrait-il écrire le bloc pl/sql pour avoir ceci : Code :
|
||
|
|
00
|
|
|
#8 | |||||||
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
Tu fais une procédure stockée:
Citation:
Code :
SELECT count(*) FROM SYS.ALL_TABLES WHERE TABLE_NAME = 'TB_TEMP' Citation:
Pour Citation:
Code :
Citation:
Pour Citation:
Je considère que tu sais te débrouiller en PL/SQL, si non je prendrais le temps demain de développer plus ma réponse (ou d'autres plus compétents le feront). A noter que je n'ai pas d'Oracle sous la main à la seconde donc j'ai pu faire des erreurs de syntaxe ou des oublis (je sais c'est une mauvaise pratique que de donner un code dont on est pas sûr à 100%) mais tu as au moins des pistes. Demain au boulot je contrôle mon code et je corrige ça éventuellement. Quelques remarques: - Tu prends en compte le fait que ta table temporaire puisse changer de structure mais pas ta table finale. Que se passe-t-il si cela se produit ? Si c'est parce que les champs que tu utilises dans ta table finale ne changent jamais dans ta table source (et donc jamais dans la temporaire), pourquoi ne pas construire une table temporaire avec seulement les champs de ta table finale? Seul cas particulier: si tu veux conserver dans ta table temporaire une trace des données détaillées complètes qui ont servi à créer le résultat agrégé de ta table finale, dans ce cas effectivement... - Personnellement, dans un DWH, le drop de tables temporaires ne me choque pas particulièrement (certains ETL/ELT font ça, Genio par exemple, ODI aussi il me semble). Par contre ce qui m'étonne ce sont tes raisons: dans le cas d'un ETL/ELT il n'y a pas assez d'intelligence dans le produit pour éviter ce genre de comportement mais tu devrais pouvoir l'éviter toi, cf ma remarque du dessus. EDIT: Voila le code de la requête est correct
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|||||||
|
|
10
|
|
|
#9 | |
![]() ![]() |
Citation:
Si je vois cette option cochée, ça me donne une idée sur le modeste niveau du développeur et de ma petite expérience ça c'est toujours vérifié. Maintenant, on doit bien trouver quelques cas où ça doit avoir une utilité.
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
@Waldar: Oui mais par exemple Oracle DI créé des tables temporaires pour exécuter ses KM, et c'est assez difficilement contournable puisqu'il faudrait modifier les KM soit même.
Il y a des gens qui préfèrent utiliser à fond les possibilités de l'outil quitte à perdre le contrôle sur ce qu'il fait, et sur certains outils pourquoi pas. Cependant je suis d'accord avec toi: un développeur qui développe tout lui même n'a pas à dropper ses tables temporaires, si le travail est bien fait.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Il y a peut etre aussi des habitudes prise sur d'autres SGBD.
Sur Sybase par exemple, la création de tables temporaires est monaie courrante, très simple, et meme très souvent la meilleurs solution pour résoudre des pb de perf sur des requêtes complexes, et au final l'optim de requête s'avère plus simple que sur Oracle. D'ailleurs, Oracle a repris un peu le concept avec la clause "WITH". |
|
|
00
|
|
|
#12 |
![]() ![]() |
Le WITH c'est pour se conformer à la norme SQL:2003, et tous les WITH ne sont pas forcément matérialisés dans une table temporaire.
Je dirai plutôt que Sybase utilise des tables temporaires car l'optimiseur SQL est très faible comparé au CBO d'Oracle Database
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#13 | |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Citation:
ça c'est sur que le l'optimiseur sybase est moins "puissant" que celui d'oracle. Mais d'expérience, je peux t'assurer que c'est plus facile d'optimiser Sybase parceque précisément, l'optimiseur étant bien moins complexe, il te réserves beaucoup moins de mauvaises surprises! Etant donné que dans la complexité, il s'en sort moins bien, on ne tergiverse plus, on décortique la requête en plusieurs parties à l'aide justement des tables temporaires crées et effacées à la volée dans une transaction. Ca oblige le développeur à garder la maitrise et la compréhension de ses accès aux données. L'optimiseur oracle quant à lui fait peur dans la mesure ou ça peut donner l'impression du: "faite n'importe quoi, je m'occupe de tout" et quand, malgré tout les performance sont mauvaises, il est bien plus difficile de rattraper le truc, et ça demande bien plus de connaissance et d'expérience que pour Sybase. |
|
|
|
00
|
|
|
#14 |
![]() ![]() |
Oui je comprends votre raisonnement : il est plus simple de décomposer un problème complexe en n problèmes simples.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#15 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
Citation:
L’ancien optimiseur d’Oracle basé sur des règles c’était pareil : plus simple à comprendre bien moins de choses à vérifier mais au bout de ligne l’optimisation n’était pas forcement plus simple. D’ou la décomposition des requêtes en N requêtes « simple », l’utilisation des tables de travail, la dénormalisation, etc. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com