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 20/01/2011, 16h43   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2006
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2006
Messages : 41
Points : 13
Points : 13
Par défaut Optimisation Req INDEX

Bonjour,

Je suis face a un problème au quel je ne trouve pas de solution,

Je suis sous Oracle 10g r2 et j'ai des requêtes qui s'exécutent et qui prennent un temps fou
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
SELECT T0.object_id, T0.u7e_fr_s_lastmodifier, T0.u79_fr_s_uocode, T0.u63_fr_s_operationid, T0.u7b_fr_s_customername, T0.u65_fr_n_businessid, T0.u81_fr_s_linkedvisionreference, T0.u70_fr_t_completiondate, T0.u71_fr_t_donedate, T0.doc_state
FROM (SELECT * FROM DocVersion 
		WHERE (object_class_id IN (:1, :2, :3) OR object_class_id IS NULL) 
			AND home_id IS NULL) T0 
 
	LEFT JOIN (SELECT * FROM Generic 
		WHERE (object_class_id IN (:4) OR object_class_id IS NULL) 
			AND home_id IS NULL) T1 ON T0.u68_refoperationproduct = T1.object_id 
	LEFT JOIN (SELECT * FROM Generic 
		WHERE (object_class_id IN (:5) OR object_class_id IS NULL) 
			AND home_id IS NULL) T2 ON T0.u65_fr_n_businessid = T2.u4f_fr_n_businessid 
		WHERE (( ( T0.doc_state <> :6 
					AND T0.u65_fr_n_businessid IN ( :7, :8, :9) 
					AND T1.u2b_fr_n_mo = :12 
					AND T0.u79_fr_s_uocode IN ( :13, :14, :15)
 
					))) 
 
 
ORDER BY  T0.u7b_fr_s_customername ASC,  T2.u50_fr_s_productgroup ASC,  T2.u51_fr_s_product ASC,  T1.object_id ASC,  T2.u52_fr_s_transaction ASC,  T0.u6a_fr_t_initiateddate DESC,  T0.object_id ASC,  T2.object_id ASC
Le Coup de la requête est de 264172 à mon avis dû aux différents JOIN, ci-joint en plan d'exécution

Quelqu'un aurait une suggestion ??

Merci pour votre aide

Cdt
Images attachées
Type de fichier : png ORA-CAP.PNG (16,6 Ko, 10 affichages)
Lust14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h56   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
A quoi sert la première jointure externe t0-t1 ?
Dans la clause where il y a une restriction sur un champ de t1 (= donc not null)

Il faut aussi remplacer les IN (:X) par = :X

Peut être passer les lignes de la clause where de T0 dans la sousrequete () T0 ou inversement enlever le ()T0 et mettre la table DocVersion, puis toutes les conditions regroupées.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT T0.object_id, T0.u7e_fr_s_lastmodifier, T0.u79_fr_s_uocode, T0.u63_fr_s_operationid, T0.u7b_fr_s_customername, 
				T0.u65_fr_n_businessid, T0.u81_fr_s_linkedvisionreference, T0.u70_fr_t_completiondate, T0.u71_fr_t_donedate, T0.doc_state
FROM DocVersion T0
	JOIN (SELECT * FROM GENERIC 
			WHERE (object_class_id =:4 OR object_class_id IS NULL) 
			AND home_id IS NULL) T1 
         ON T0.u68_refoperationproduct = T1.object_id 
	LEFT JOIN (SELECT * FROM GENERIC 
			WHERE (object_class_id =:5 OR object_class_id IS NULL) 
			AND home_id IS NULL) T2 
        ON T0.u65_fr_n_businessid = T2.u4f_fr_n_businessid 
WHERE (t0.object_class_id IN (:1, :2, :3) OR object_class_id IS NULL) 
AND t0.home_id IS NULL
AND T0.doc_state <> :6 
AND T0.u65_fr_n_businessid IN ( :7, :8, :9) 
AND T0.u79_fr_s_uocode IN ( :13, :14, :15)
AND T1.u2b_fr_n_mo = :12
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 17h03   #3
Candidat au titre de Membre du Club
 
Inscription : novembre 2006
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2006
Messages : 41
Points : 13
Points : 13
Bonjour
Merci pour votre réponse,
le souci c'est que la requête est construite de manière intuitive par un autre outil (PE, Filenet) donc nous n'avons pas la possibilité de modifier le contenu des sous requêtes

et en regardant toutes les requetes lancées, la bête noire est le OUTER JOIN de Docversion

!!!
Lust14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 17h11   #4
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
Un plan d’exécution incomplet ne sert à rien, ce n’est pas la peine de l’afficher.
Vos jointures existent seulement pour l’Order By
Et si mon impression que vous avez un sort de modèle (super) générique est juste, vous est dans un monde de douleur.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 17h20   #5
Candidat au titre de Membre du Club
 
Inscription : novembre 2006
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2006
Messages : 41
Points : 13
Points : 13
Veuillez m'excuser pour le Plan d'exécution incomplet je me suis rendu compte que je m'étais trompé de fichier , vous trouverez ci-joint le fichier .html correspondant a l'exécution d'une requête.

la seule chose que je peux toucher est la création d'indexes, impossible de toucher à la structure de la requête

merci pour l'aide
Fichiers attachés
Type de fichier : html index.html (24,3 Ko, 4 affichages)
Lust14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 10h32   #6
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
Donc vous ne pouvez pas modifier vos requêtes!
Pourriez-vous exécuter et poster le résultat ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
SET serveroutput off
SELECT /*+ gather_plan_statistics */ T0.object_id,
       T0.u7e_fr_s_lastmodifier,
       T0.u79_fr_s_uocode,
       T0.u63_fr_s_operationid,
       T0.u7b_fr_s_customername,
       T0.u65_fr_n_businessid,
       T0.u81_fr_s_linkedvisionreference,
       T0.u70_fr_t_completiondate,
       T0.u71_fr_t_donedate,
       T0.doc_state
  FROM (SELECT *
          FROM DocVersion
         WHERE (object_class_id IN (:1, :2, :3) OR object_class_id IS NULL)
           AND home_id IS NULL) T0
  LEFT JOIN (SELECT *
               FROM Generic
              WHERE (object_class_id IN (:4) OR object_class_id IS NULL)
                AND home_id IS NULL) T1 ON T0.u68_refoperationproduct =
                                           T1.object_id
  LEFT JOIN (SELECT *
               FROM Generic
              WHERE (object_class_id IN (:5) OR object_class_id IS NULL)
                AND home_id IS NULL) T2 ON T0.u65_fr_n_businessid =
                                           T2.u4f_fr_n_businessid
 WHERE (((T0.doc_state <> :6 AND T0.u65_fr_n_businessid IN (:7, :8, :9) AND
       T1.u2b_fr_n_mo = :12 AND T0.u79_fr_s_uocode IN (:13, :14, :15)
 
       )))
 ORDER BY T0.u7b_fr_s_customername  ASC,
          T2.u50_fr_s_productgroup  ASC,
          T2.u51_fr_s_product       ASC,
          T1.object_id              ASC,
          T2.u52_fr_s_transaction   ASC,
          T0.u6a_fr_t_initiateddate DESC,
          T0.object_id              ASC,
          T2.object_id              ASC
/
SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'))
/
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 12h15   #7
Candidat au titre de Membre du Club
 
Inscription : novembre 2006
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2006
Messages : 41
Points : 13
Points : 13
Bonjour,

Oui, On ne peut absolument pas toucher la structure de la requête étant donné qu'elle est générée automatiquement par le Process Engine de Filenet

J'ai exécuté la requête que vous m'avez donné avec un petit jeu d'essai, vous trouverez en pièce jointe le plan d'exécution correspondant.

Merci beaucoup pour votre aide
Fichiers attachés
Type de fichier : txt TESTE.txt (4,3 Ko, 5 affichages)
Lust14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 14h15   #8
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
Il y a une erreur importante dans l’estimation des cardinalités de la table GENERIC (E(stimated)-Rows 277 K vers A(ctual)-Rows 0). Vérifiez (régénérez) les statistiques. Mais il me semble que requêtes s’exécute en environ 4 secondes ce qui n’est pas forcement un temps fou, sauf bien sûr si elle s’exécute un nombre important de fois.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 14h22   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je pense que vous avez raté ceci mnitu :
Citation:
avec un petit jeu d'essai
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 14h27   #10
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
@Waldar. C'est vrai, vous avez raison.
Donc il faut la requête exécutée sur l'environement où ça pose des problèmes.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 23h02   #11
Membre confirmé
 
Avatar de Ahmed AANGOUR
 
Homme Ahmed AANGOUR
DBA Etudes Oracle
Inscription : janvier 2010
Messages : 123
Détails du profil
Informations personnelles :
Nom : Homme Ahmed AANGOUR
Âge : 33
Localisation : France

Informations professionnelles :
Activité : DBA Etudes Oracle

Informations forums :
Inscription : janvier 2010
Messages : 123
Points : 217
Points : 217
Si vous ne pouvez pas modifier la requête et si vous avez la licence Tuning Pack vous pouvez tenter de soumettre la requête au tuning advisor et voir ce qu'il vous propose. Un sql profile pourrait peut être faire l'affaire.
__________________
Mon blog Oracle: http://ahmedaangour.blogspot.com/
Ahmed AANGOUR 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 00h13.


 
 
 
 
Partenaires

Hébergement Web