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 23/01/2007, 15h26   #1
Membre du Club
 
Inscription : juin 2003
Messages : 156
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 156
Points : 51
Points : 51
Par défaut [Oracle 10] Pour des contrôles efficaces

Bonjour,

J'aimerais vous soumettre une nouvelle problématique ou plutôt avoir vos retours d'expérience quant à la façon d'effectuer de nombreux contrôles sur des données. Je m'explique. Imaginons une table classique avec ses colonnes. L'idée est de faire en gros un ou plusieurs contrôles par zone : présence, format, contenu...

Est-il plus judicieux de lire chaque enregistrement à la suite et de faire les contrôles à la suite à l'intérieur d'une boucle, comme indiqué ci-après...

Code :
1
2
3
4
5
6
7
8
9
10
 
Pour chaque enregistrement de la TABLE
   Si zone 1 incorrecte alors
       Traitement erreur
   FinSi
   ...
   Si zone n incorrecte alors
       Traitement erreur
   FinSi
FinPour
...Ou alors de traiter de façon ensembliste les contrôles, ce qui pourrait donner :

Code :
1
2
3
4
5
6
7
8
9
10
 
Rechercher tous les enregistrements pour lesquels la zone 1 est incorrecte
Pour chaque enregistrement récupéré
    Traitement erreur
FinPour
...
Rechercher tous les enregistrements pour lesquels la zone n est incorrecte
Pour chaque enregistrement récupéré
    Traitement erreur
FinPour
J'espère avoir été clair .

Merci, Frédéric.
ftrifiro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 16h12   #2
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Il faut éviter au maximum de parcourrir les grosse table, donc à mon avis la première méthode est moins couteuse sauf si tout tes tests arrivent à passer par des indexs, ce qui serais du bol....

Pour optimiser encore je pense qu'il faut faire une combinaison des 2:

Code :
1
2
3
4
5
6
7
8
9
10
11
Rechercher tous les enregistrements pour lesquels 
   (la zone 1 est incorrecte ou la zone 2 est incorrecte etc....)
Pour chaque enregistrement récupéré
  Si zone 1 incorrecte alors
       Traitement erreur
   FinSi
   ...
   Si zone n incorrecte alors
       Traitement erreur
   FinSi
FinPour
Attention ça va optimiser si la nature des test n'est pas trop lourde, sinon il faut s'en tenir à ta solution 1.
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 16h18   #3
Membre du Club
 
Inscription : juin 2003
Messages : 156
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 156
Points : 51
Points : 51
Merci.

Pour la clarté du code et sa modularité, j'avoue préférer la solution 1 également. Pourquoi pas combiner si possible, mais pas évident néanmoins...

D'ailleurs, selon vous, l'opportunité de l'une ou l'autre méthode peut-elle dépendre de la taille de la table ou pas ?

D'autres avis ?

Merci.
ftrifiro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 16h28   #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
Je serais bien moins catégorique que mes collégues

Cela dépend de la structure de la table, de la quantité de données sélectionnées et du controle. La table est-elle partitionnée, volumineuse et indexée ? Les contrôles sont-ils complexes ? Est ce que la sélection porte sur toute la table ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 16h30   #5
Membre du Club
 
Inscription : juin 2003
Messages : 156
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 156
Points : 51
Points : 51
Je vais tenter de répondre.

Cette table est issue d'un fichier, donc fabriquée à l'aide du *Loader. A priori, elle ne comporte pas d'index et il serait délicat d'en trouver de judicieux je crois. Elle n'est pas partitionnée. Toutes ses lignes doivent être contrôlées. Parmi les contrôles il y a un peu de tout. Du plus simple (format, présence) au moyen (présence de la valeur dans une table de référentiel) au complexe (croisé entre valeurs).

Frédéric.
ftrifiro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 08h53   #6
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
Citation:
Envoyé par ftrifiro
Toutes ses lignes doivent être contrôlées.
A partir de là, il me semble qu'il vaut mieux lire une seule fois de manière sequentielle donc la solution 1.

Plutot que de selectionner les infos qui correspondent à un critère donnée, puis celle qui correspondent à un autre critère etc. Puisque que au mieux tu liras toute la table mais en passant par des indexes (que tu n'as pas) ce qui est plus couteux que de lire toute la table directement et au pire tu liras toute la table autant de fois que tu as de controle puisque qu'il n'y a pas d'index

Citation:
Envoyé par ftrifiro
Du plus simple (format, présence) au moyen (présence de la valeur dans une table de référentiel) au complexe (croisé entre valeurs).
Autant il me semble que tu peux te passer d'index sur la table a controler puisque tu veux tout controler mais par contre fait attention de bien indexer tes tables de referentiel sinon tu vas droit dans le mur au niveau de perfs. Pareil pour tes controles croisés si il ne s'agit pas de comparaison entre des valeur de la meme table
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 09h02   #7
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
bonjour,
suivant la taille de la table, il serait judicieux de charger la table dans un tableau via un bulk collect, puis de faire les contrôle par itération sur le tableau...
le bénéfice sera de laisser la table disponible pour les opérations de corrections déclenchées par les contrôles effectués...

mais par contre le contrôle lui-même peut être un poil plus lourd à coder... mais je pense qu'en terme de perf ce serait intéressant !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 09h46   #8
Membre du Club
 
Inscription : juin 2003
Messages : 156
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 156
Points : 51
Points : 51
Réponses extrêmement intéressantes, merci.

Tout concourt vers la solution 1/ ce qui me soulage un peu car c'était ma préférée. Mais mes collègues ici me poussaient vers l'autre. Avoir des avis dans mon sens me conforte donc .

Pour l'utilisation des bulk collect, oui c'est aussi une bonne idée. Il faut que je vois comment je vais gérer les erreurs aussi. Je vais intégrer ça dans une réflexion globale.

Merci
ftrifiro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web