|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() |
Bonjour,
j'ai un petit souci avec une requete sql. Je travail avec oracle 8i. Mon probleme est au niveau de la taille de mes tables, je fais une rquete de ce genre : Code :
table2 : 180 000 000 de lignes table3 : 685 000 de lignes table4 : 4 600 000 lignes est ce que quelqu'un sait s'il y a un moyen d'effectuer la requete plus rapidement? Merci bcp |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 450 ![]() |
peut être en modifiant la requete, mais il faudrait la vraie requete, complète.
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
qu'est ce qui motive l'écriture avec 2 sous requêtes ? Tu ne peux pas tout mettre dans le FROM ?
|
|
|
00
|
|
|
#4 | ||
|
Membre du Club
![]() |
Si je peut tout mettre, c'etait pour s'implifier.
Voila la requete : Code :
le probleme, c'est la structure des table operation_detail et transac_detail qui sont des tables géneriques. elles possedent 4 colones : id,name,string_value,date_value. cela permet d'ajouter n'importe quel attribut (le nom de l'attibut dans name, la valeur dans date_value ou string value et le lien vers la reference du champ de la table principale). je sais pas si je suis clair. Enfin cela donne un nombre de lignes tres important mais j'ai fais cette reque pour tour recuperer d'un coup et traité les données apres. J'avais dans un premier temps decomposer en plusieur requete que je parcourai avec des curseurs, mais la c'est encore pire.... |
||
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
et le plan d'exécution ?
|
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() |
tu entend quoi par plan d'execution?
|
|
|
00
|
|
|
#7 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 450 ![]() |
Pour simplifier :
Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||
|
|
00
|
|
|
#8 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
|
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() |
je m'explique:
je dois recuperer toutes les transaction (de la table transac) dont la date d'enregistrement est superieur à la bill_to (date que je recupere avec ma deuxième requete, la bill_to.) mais pour aller plus vite, ici je recupere toutes les transac et je trie apres en pl/sql dans mon curseur. Sinon , apres plusieurs heures je n'ai tjs pas de resultat sur la requete... |
|
|
00
|
|
|
#10 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
tu iras probablement plus vite en SQL, si c'est lent c'est que la requête n'est pas optimisée. Je te conseille de chercher MAX avec OVER et DENSE_RANK
|
|
|
00
|
|
|
#11 |
|
Membre du Club
![]() |
ok je vais cherché de ce coté la car la requete que je vous ai montrer marche tres bien sur des tables reduite, mais avec la volumetrie que je vous ai donné tt a l'heure, au bout de 4h30 sa tourne encors et j'ai pas de resultat^^
|
|
|
00
|
|
|
#12 | ||||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 450 ![]() |
si c'est > et qu'il faut que bill_to existe
Code :
Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||||
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 450 ![]() |
Vu la volumétrie, j'espère qu'il y a de bons indexes (sur NAME)
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#14 |
|
Membre du Club
![]() |
ba le pb c'es qu'il y a pas d'index sur name....
par contre la table operation_detail et transac_detail sont partitionnées sur la record_date. |
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() |
Sinon une jointure entre une table de 20 000 000 de lignes et une table de 200 000 000 de ligne, sa donne quoi au niveau du tps d'execution?
|
|
|
00
|
|
|
#16 |
|
Nouveau Membre du Club
![]() Inscription : août 2006 Messages : 137 ![]() |
Bonsoir cher ami, normalement pour étudier ta requête tu devrais nous fournir un plan d’exécution, mais quand même j’essaierais en premier temps de te donner quelques remarques qui puissent l’optimiser .
1 . Pense a créer un index sur la colonne operation_id de chaqu’une des tables ACCOUNT_OPERATION a, OPERATION_DETAIL d, s’il ne l’ont pas. 2.Pense aussi a créer un index sur la colonne TRANS_ID des tables transac et transac_detail s’il ne l’ont pas. 3.Si amount !=0 , si cette colonne est indexée, oracle le négligera aussi, ==è solution si l’index n’existe pas crée le et transforme cette clause en (amount> 0) and (amount < 0). Un autre conseil : en général, une jointure externe est beaucoup plus rapide qu’un existe ou not existe. Teste( le meilleur maître est monsieur TEST) et tiens moi au courant, n’oublie pas le plan d’exécution !!!. |
|
|
00
|
|
|
#17 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
Citation:
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com