|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Inscription : juin 2003 Messages : 39 ![]() |
Bonjour,
je suis sous oracle 9.2.0.4. Depuis plusieurs jours nous avons un batch qui "a priori" tourne mais ne se termine pas. Il reste bloqué sur une procédure stockée : Code :
Code :
Il me semble que le niveau de trace de ce plan ne nous apprends pas grand chose, est ce que je me trompe? J'ai demandé le niveau de la trace, j'attends une réponse. Pourriez vous me conseiller? merci par avance pour tt les réponses |
||||
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
D'après ce que je vois dans le plan en tant que tel rien d'anormal même si des informations manquent
Qq points: - quels sont les index sur la table et notamment sur les colonnes utilisées dans la clause where - Le nombre de lignes de la table tbr001raa - L'efficacité de l'index utilisé Mais une piste importante consiste à essayer de faire une seule instruction et de se débarasser des curseurs et des boucles. |
|
|
00
|
|
|
#3 |
|
Provisoirement toléré
Inscription : juillet 2005 Messages : 114 ![]() |
salut
j'ai essayé de lire ta procedure c'est pas evident j'ais pas pu detecté qqc qui louche je te propose de diviser ta procedure sur plusieurs scripts afin de voir vraiment ou ca se block c'est comme si tu dbug dans un prog sequential |
|
|
00
|
|
|
#4 | |
|
Invité régulier
![]() Inscription : juin 2003 Messages : 39 ![]() |
Citation:
- De mémoire (je ne suis plus au bureau) l'index de la table tab3 (j'ai tt renommé et j'ai simplifié la procédure) est : date_a, a b, c - le dernier batch qui a tourné a limenté quelque chose comme 2 millions de lignes - l'efficacité de l'index? c'est 4 colonnes constitue la clef primaire il me semble. Sinon, peux tu me donner un exemple qui m'expliquerais comment me débarasser de mes boucles? merci |
|
|
|
00
|
|
|
#5 | |
|
Invité régulier
![]() Inscription : juin 2003 Messages : 39 ![]() |
Citation:
J'ai enlevé pas mal d choses de la procédure, J'a gardé le plus important cad: - truncate de la table tab2 suppression index de la table tab2 - 3 boucles imbriquées - 1 INSERT dans une table tab2 en y mettant des données issues d'un SELECT sur des colonnes d'une table tab3 après avoir fait des moyennes mobiles sur ces colonnes - fin des boucles, re-création de l'index de la table tab2 Voilà, j'espère que cela t'aidera à y voir plus clair. merci |
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : janvier 2008 Messages : 1 ![]() |
Bonsoir,
Je cherche un manuel utilisateur pour Oracle Fa (Fixed Assets), je n'en trouve nulle part, Pouvez-vous m'aider, Merci |
|
|
00
|
|
|
#7 | |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Citation:
Evidemment il faudrait dans ce cas faire attention aux index. Mais le gros problème peut-être va être les segments de rollback et là ça peut partir dans la discussion que j'adore ... Tu fais un commit dans les boucles et ce ne sera pas possible. Pourquoi ce commit a été ajouté? |
|
|
|
00
|
|
|
#8 | |||
|
Membre du Club
![]() Inscription : janvier 2008 Messages : 50 ![]() |
Citation:
vu ce que tu dis, je comprends que tu ais des problèmes de perf. Voici les points que j'ai noté et les questions en suspend : - as-tu recalculé les statistiques de la table tab3 après le chargement de ces 2 millions de lignes ? - Les 3 boucles imbriquées, ce n'est pas génial (surtout si l'on considère que tu commites trop souvent) (à lire : un article sur asktom.oracle.com) Je te conseille de tenter l'approche suivante : Code :
- la comparaison n'est pas super performante, je te conseille de décider d'une valeur (exemple : 'NULL') afin que les colonnes tab3.c et tab1.c soient not nullable ainsi tes index sur tab3 (date_a, a, b, c) et sur tab1 (a, b, c) seront plus sélectifs et donc plus performants MAIS pour 2 millions de lignes, je préfèrerai un FULL table scan dans le plan d'exécution de tab3 et de tab1. Bon courage ! |
|||
|
|
00
|
|
|
#9 |
|
Provisoirement toléré
Inscription : juillet 2005 Messages : 114 ![]() |
j'ai pas vraimenet voulais dire symplifier les termes lol
bon a mon avis la seul solution qui te reste c'est d'enlever les boucles 2 propositions : 1-ou bien comme a dit salais l'utiliser dans les clause where meme si c'est pas evident a mon avis comme requete car justement les pointeurs sont la pour balayer plusieurs tables; 2-c'est create table tomporaire que tu crée au besoin pour sauvegarder le resultat de la 1,2.... reherche,et le réutiliser apres par la suite drop. chose sur il faut enlever le sboucles imbriqué ca n'a jamais etait un bon exemple ca posait des prob dans les editeurs de compilations dedié a ca,alors qu'oracle n'est pas concu pour ca ![]()
|
|
|
00
|
|
|
#10 | |||
|
Invité régulier
![]() Inscription : juin 2003 Messages : 39 ![]() |
Citation:
Pour répondre à ta question sur les statistiques. Oui elle sont recalculées après l'insert. En ce qui concerne ton dernier conseil. En fait je ne connaissais pas les plans d'exécution avant vendredi. Si j'ai bien compris, pour toi il est préférable que Oracle "balaye" la table tab3, lignes par lignes, c'est bien ça le FULL table scan, au lieu d'un balayage en ce servant du rowid comme c'est le cas TABLE ACCESS BY INDEX ROWID ...? Je ne suis pas très forte en optimisation mais ne penses tu pas que scanner une table aussi grosse prendra trop de temps? je te remercie Tikate |
|||
|
|
00
|
|
|
#11 |
|
Invité régulier
![]() Inscription : juin 2003 Messages : 39 ![]() |
Je voulais juste ajouter une chose.
Ce qui m'ennuie c'est que le batch passait sans problème depuis plusieurs mois malgré sa lenteur. Ce que je n'explique pas c'est pourquoi maintenant celui ci reste bloqué à cette étape (la procédure que j'ai citée)? oracle ne signale aucune erreur et le process unix a toujours l'air de continuer à tourner. Y a t'il un moyen dans les traces oracle d'en savoir plus sur ce qui ce passe? merci |
|
|
00
|
|
|
#12 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Si statspack est installé tu pourras peut-être quand même retrouver l'ancien plan
|
|
|
00
|
|
|
#13 | ||
|
Membre du Club
![]() Inscription : janvier 2008 Messages : 50 ![]() |
Citation:
Citation:
En fait, il faut comprendre l'accès via un index (attention, je simplifie grandement) : - je lis les blocs de l'index (pour trouver le début) puis je lis les rowids contenus dans mon premier bloc feuille, - pour chaque rowid j'accède à une ligne de ma table (TABLE ACCESS BY ROWID) (je filtre et je la conserve si j'ai besoin de faire des traitements dessus), - je lis le second rowid, j'accède à une ligne de ma table etc... Maintenant, tu sais répondre à la question suivante : Si je dois traiter 100% des lignes de ma table de 2 millions de lignes, est-ce que je passe par un index ou par un FULL TABLE SCAN ? Autrement dit, je lis tout l'index puis toute ma table (voir plusieurs fois le même bloc de table selon que l'index est "en phase" avec l'organisation des données de ma table => voir la notion de clustering factor) ? Ou bien je ne lis que toute ma table ? Evidemment, je ne lis que toute la table. Ceci est vrai si je traite 100% des lignes. Et si je traite maintenant que 80% des lignes à chaque fois ? Et bien, le simple FULL TABLE SCAN sera encore plus rapide. L'index devient réellement pertinent à partir de 5% des données réellement utilisées (je ne me veux pas catégorique mais 5% est la barrière à connaître). Maintenant, il se peut que ton CBO continue de suggérer l'utilisation d'un index, dans ce cas, fait les tests avec un hint (/*+ FULL( ma_table ) */) ou alors vérifie tes statistiques systèmes etc... Dans tous les cas, tu pourras encore optimiser ton FULL TABLE SCAN en effectuant ta requête en parallèle (parallel query) mais ceci se fait à certaines conditions. |
||
|
|
00
|
|
|
#14 | |
|
Membre du Club
![]() Inscription : janvier 2008 Messages : 50 ![]() |
Citation:
Sinon, est-ce que la table tab1 a subi un gros chargement de données ? Est-ce que tu fais beaucoup de tri sur disque (en gros, as-tu assez de mémoire ? ou est-ce que tu swapes ?) |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com