Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 03/01/2011, 12h03   #1
Invité régulier
 
Inscription : décembre 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 60
Points : 9
Points : 9
Par défaut Ordre des lignes sur jointure simple

Bonjour,
j'ai une question qui je pense n'a pas été abordée comme je veux, j'espere trouver une réponse ou plutôt des pistes.
je fais une jointure sur 2 tables
Code :
SELECT * FROM T1, T2 WHERE T1.X=T2.Y AND...
j'ai bien besoin de la requête comme ca (pas de jointure LEFT ou RIGHT) après, un curseur boucle dessus pour insérer les résultats dans une table T3. en plus pour des raisons de performances, on veut pas boucler sur T1, en faisant des appels à T2 dans la boucle.

le besoin est de faire ca en plusieurs étapes (ou plutôt en plusieurs intervalles de temps d'exécution), et le but est donc de reprendre à la dernière ligne traitée lors de la dernière exécution. un mécanisme est en place pour stocker le nombre de lignes (de la jointure) traités, et de reprendre à ce nombre lors du traitement suivant.

si la table T2 ne bouge pas entre 2 exécutions, il n'y a pas de souci, par contre le risque est bien présent comme les insertions se font sur des jours d'intervalles. (évidemment T1 reste inchangée pendant tout ce temps)

dans le cas ou T2 bouge, la jointure pourrait ramener soit des lignes en plus soit en moins. et donc la reprise ne se fait probablement pas au bon endroit.

est ce qu'il existe un moyen de réaliser ceci tout en gardant la boucle inchangée, en modifiant juste la requête principale, le but est de reprendre à la dernière ligne de T1 surtout.

le dernier recours est évidemment la boucle sur T1, et l'appel à T2 dedans.

Merci d'avance
jdar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 15h36   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Vous avez besoin d’un mécanisme pour savoir ce que vous avez traité. Sinon, jointure ou pas votre traitement sera défaillant.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 17h18   #3
Invité régulier
 
Inscription : décembre 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 60
Points : 9
Points : 9
J'ai pensé passer par les ROWID de T1, mais ca implique pas mal de vérification (surtout si mon ROWID de référence disparait dans la jointure du lancement suivant par mal chance)
au détriment de la précision je pense que je vais passer au niveau macro, et n'arrêter qu'à la fin de chaque partition (64). ca dépassera mes compteurs mais je prendrai une marge d'avance pour être sûr, ca reste la solution la plus propre.

mais une question : est ce qu'une table renvoie des ROWID (on va dire sans aucune clause ni tri) dans l'ordre alphabétique ou pas? et si elle n'a pas été modifiée, s'agit-il certainement du même ordre à chaque même requête (je pense que oui mais j'ai des doutes)

Merci
jdar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 19h08   #4
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
Oracle ne garanti aucun ordre de renvoi de lignes tant qu'il n'y a pas de clause "order by". Meme si de manière empirique tu aura l'impression qu'un ordre est toujours de mise, attention bien souvent ça dépend du plan d'exécution, et celui ci peu être amené à changer. Si oracle fait du parallélisme, là aussi, tout est chamboulé... bref, si tu veux un ordre, fait un "order by"

Sinon, oracle te garanti la consistance de tes données quand tu ouvres un curseur, mais si tu laisses un curseur ouvert trop longtemps, tu vas avoir des problèmes (erreur "snapshot too old")

Si tu veux faire des traitement par lot sur plusieurs jours, il est bien plus prudent de trouver des moyen applicatifs (colonnes pour flaguer les données traitées, tables temporaires etc...)
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2011, 15h12   #5
Invité régulier
 
Inscription : décembre 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 60
Points : 9
Points : 9
Merci pour ces précisions.
jdar 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 14h59.


 
 
 
 
Partenaires

Hébergement Web