|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
![]() J'ai une petite question concernant la cohérence de mon raisonnement. J'ai une table Main contenant :
En toute logique, ces tables auraient du hériter d'une table Messages ayant une clé primaire sur laquelle aurait pointé MessageId. Mais PostGreSQL ne semble pas gérer cela J'ai donc oublié la table Messages mais gardé le concept, en émulant la contrainte via un trigger Code sql :
Ma question Y a-t-il une manière plus élégante et/ou performante de procéder pour arriver au même résultat ? (un batch quotidien va importer plusieurs millions d'enregistrements et je souhaiterais que cet import n'handicape pas trop la disponibilité des résultats) par avance
|
||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : août 2008 Messages : 1 690 ![]() |
Citation:
C'est un modèle en héritage Citation:
Sinon 2 points d'amélioration à apporter au code :
|
||
|
|
00
|
|
|
#3 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
Citation:
tu parles d'utiliser les USING ? J'ai oublié de signaler que je suis avec PostGreSQL 8.3 en gros, tu conseilles de faire un PREPARE global et ensuite un seul EXECUTE dans la fonction ? (ce qui semble être l'équivalent du using) |
|
|
|
00
|
|
|
#4 | |
|
Expert Confirmé
![]() Inscription : août 2008 Messages : 1 690 ![]() |
Citation:
32.7. Dynamic SQL |
|
|
|
00
|
|
|
#5 | |||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
Citation:
En fait, dans le cas du PREPARE, il faudrait faire ceci : Code :
J'ai loupé un truc EDIT: a priori, cela revient à passer par format ce qui n'est pas disponible à la version 8.3 |
|||
|
|
00
|
|
|
#6 | ||||
|
Membre du Club
![]() Franck TheetenInscription : mars 2005 Messages : 59 ![]() |
Bonjour,
Je n'ai pas vérifié sur un serveur, mais la solution suivante me semble moins coûteuse en performance, car elle évite le trigger et le recours à du SQL dynamique, et devrait passer sur des versions anciennes. 1) Rassembler Message_106 et Message_107 dans un vue: Code :
3) Faire un INSERT... SELECT avec une condition sur la clé de la vue Code :
Et/ou un UPDATE...FROM comparable pour les mises à jour. S'il y a une contraire Not NULL sur la table "main", l'insertion ou la mise à jour devraient être rejetées si la clé correspondante n'est pas trouvée dans les deux tables "messages", tout en fonctionnant si c'est bien le cas. Dans le problème décrit, le plus délicat me paraît pas tellement l'insertion, mais de s'assurer que les valeurs des clés des différentes tables "Message_XXX" sont uniques pour toute la base. Par une séquence? Un oid? Par une contrainte d'unicité sur une clé étrangère qui fait office de clé primaires dans les tables messages, et qui pointe à son tour sur une table centralisant les identifiants de tous les messages? |
||||
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 2 154 ![]() |
bonjour,
union all pour la vue. |
|
|
00
|
|
|
#8 |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 962 ![]() |
à tous pour ces explicationsFinalement, j'ai restructuré différemment les dépendances afin d'éviter ce trigger |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com