bien oui je confirme ... Et le temps de réponse est mon soucis juste en ajoutant une condition dans ma clause "where " .... je comprend pas bien pourquoi
Et c'est quoi : MATERIALIZED_VIEW
Une vue matérialisée se comporte comme une table créée par le résultat d'une requête (typiquement celle de ta vue en fait). Il faut la rafraîchir pour avoir les derniers résultats (elle ne se met pas à jour automatiquement, comme une vue). L'avantage est de pouvoir la traiter presque comme une table, l'analyser, mettre des index etc.
- Rajouter un champ dans avi_evaluation qui top si UPPER(intervenant_departement) contient la chaine FINANCE.
- Changer avi_evaluation en vue matérialisée qui se comportera plus comme une table (possibilité d'analyser et de mettre des index, comme dit par Garuda)
- Eventuellement rajouter un index sur le top pour mieux le brasser.
- So.... what exactly is preventing us from doing this?
- Geometry.
- Just ignore it !!
****
"The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
***
Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019
Arrêtez de résoudre tous les problèmes d'optimisation avec ces vue matérialisée assez intelligentes.
Avez-vous déjà essayez de faire ce que Mohamed Houri vous a proposé ?
Avez-vous compris ce qui se passe ?
Sinon pourriez-vous dropper de votre schéma la vielle table plan_table qui ne sert à rien pour avoir quelques informations de plus dans l'explain plan ?
Bonjour,
j'ai essayé les commandes décrites dans le message de Mohamed Houri sans trop comprendre le principe car je commence à atteindre les limites de mes compétences.
J'ai comme résultat :
Comme je le dis je ne suis pas DBA de ma base cela doit venir de là je suppose ....User has no SELECT privilege on V$SESSION
Et je ne sais pas ce qu'est la table plan_table mentionnée ... visiblement elle existe bien au niveau de mon schéma , je ne sais pas d'ou elle sort et si je peux la dropper sans risque ?
Merci pour votre aide....
Salut,
Tu te dis : "j'ajoute juste une clause restrictive, pourquoi ça prend plus de temps ?"
Pour choisir le bon plan, l'optimiseur doit estimer l'impact de tes prédicats sur le nombre de lignes sorties.
Le scénario probable : ta requête initiale était optimisée avec des hypothèses à peu près correctes, le prédicat ajouté dans la seconde à introduit un biais.
Seulement sur une si grosse requête, il peut y avoir des effets boule de neige, et c'est très dur à comprendre.
Ce que propose Mohammed avec son /*+ gather_plan_statistics*/, c'est de mettre face à face ce qui à été estimé, et ce qui se réalise vraiment.
Là où il y a une différence, c'est sûrement là qu'il y a le problème..
(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...
Le pacblog : http://pacmann.over-blog.com/
Pour poursuivre .. je me suis décidé à dropper cette table table_plan.
j'ai relancé la requete avec la commande EXPLAIN PLAN et voici le résultat :
Par contre je veux bien essayer ces commandes , mais quels privilèges faut il sur le schéma de données ? être DBA ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 Plan hash value: 948162852 ------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2225 | 1872 (3)| 00:00:23 | |* 1 | FILTER | | | | | | | 2 | HASH GROUP BY | | 1 | 2225 | 1872 (3)| 00:00:23 | |* 3 | HASH JOIN | | 1 | 2225 | 1871 (3)| 00:00:23 | | 4 | VIEW | AVI_EVAL_ELEVE | 1 | 2188 | 523 (2)| 00:00:07 | | 5 | HASH GROUP BY | | 1 | 528 | 523 (2)| 00:00:07 | | 6 | NESTED LOOPS OUTER | | 1 | 528 | 522 (2)| 00:00:07 | | 7 | NESTED LOOPS OUTER | | 1 | 495 | 519 (2)| 00:00:07 | | 8 | NESTED LOOPS | | 1 | 462 | 516 (2)| 00:00:07 | |* 9 | HASH JOIN | | 1 | 447 | 513 (2)| 00:00:07 | | 10 | NESTED LOOPS | | 1 | 395 | 507 (2)| 00:00:07 | | 11 | NESTED LOOPS | | 1 | 379 | 506 (2)| 00:00:07 | | 12 | NESTED LOOPS | | 1 | 341 | 503 (2)| 00:00:07 | | 13 | NESTED LOOPS | | 1 | 312 | 502 (2)| 00:00:07 | | 14 | NESTED LOOPS | | 1 | 302 | 501 (2)| 00:00:07 | | 15 | NESTED LOOPS OUTER | | 1 | 263 | 486 (2)| 00:00:06 | | 16 | NESTED LOOPS OUTER | | 1 | 253 | 485 (2)| 00:00:06 | | 17 | NESTED LOOPS | | 1 | 236 | 481 (2)| 00:00:06 | | 18 | MERGE JOIN | | 10 | 2060 | 472 (2)| 00:00:06 | | 19 | SORT JOIN | | 31 | 5425 | 403 (2)| 00:00:05 | | 20 | MERGE JOIN | | 31 | 5425 | 402 (1)| 00:00:05 | | 21 | SORT JOIN | | 81 | 5184 | 306 (1)| 00:00:04 | |* 22 | TABLE ACCESS BY INDEX ROWID | AHSRELVALUE | 2 | 62 | 9 (0)| 00:00:01 | | 23 | NESTED LOOPS | | 81 | 5184 | 305 (0)| 00:00:04 | |* 24 | TABLE ACCESS BY INDEX ROWID| AGLDIMVALUE | 38 | 1254 | 259 (0)| 00:00:04 | |* 25 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 755 | | 6 (0)| 00:00:01 | |* 26 | INDEX RANGE SCAN | AIAHSRELVALUE3 | 16 | | 1 (0)| 00:00:01 | |* 27 | FILTER | | | | | | |* 28 | SORT JOIN | | 152 | 16872 | 96 (4)| 00:00:02 | |* 29 | TABLE ACCESS FULL | AEMSERVICEOFF | 152 | 16872 | 95 (3)| 00:00:02 | |* 30 | FILTER | | | | | | |* 31 | SORT JOIN | | 136 | 4216 | 69 (5)| 00:00:01 | |* 32 | TABLE ACCESS FULL | AHSRELVALUE | 136 | 4216 | 68 (3)| 00:00:01 | | 33 | TABLE ACCESS BY INDEX ROWID | AHSRESOURCES | 1 | 30 | 1 (0)| 00:00:01 | |* 34 | INDEX UNIQUE SCAN | AIAHSRESOURCES1 | 1 | | 0 (0)| 00:00:01 | |* 35 | TABLE ACCESS BY INDEX ROWID | AEMSERVTIMEBLK | 9 | 153 | 4 (0)| 00:00:01 | |* 36 | INDEX RANGE SCAN | AIAEMSERVTIMEBLK2 | 9 | | 1 (0)| 00:00:01 | | 37 | TABLE ACCESS BY INDEX ROWID | AEMSERVTIMELIST | 1 | 10 | 1 (0)| 00:00:01 | |* 38 | INDEX UNIQUE SCAN | AIAEMSERVTIMELIST3 | 1 | | 0 (0)| 00:00:01 | |* 39 | TABLE ACCESS BY INDEX ROWID | AEMENROLLMENT | 1 | 39 | 15 (0)| 00:00:01 | |* 40 | INDEX RANGE SCAN | AIAEMENROLLMENT3 | 37 | | 2 (0)| 00:00:01 | | 41 | TABLE ACCESS BY INDEX ROWID | AEMEPISODE | 1 | 10 | 1 (0)| 00:00:01 | |* 42 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 1 | | 0 (0)| 00:00:01 | |* 43 | TABLE ACCESS BY INDEX ROWID | AEMSTUDENT | 1 | 29 | 1 (0)| 00:00:01 | |* 44 | INDEX UNIQUE SCAN | AIAEMSTUDENT2 | 1 | | 0 (0)| 00:00:01 | | 45 | TABLE ACCESS BY INDEX ROWID | AEWEVALRESP | 1 | 38 | 3 (0)| 00:00:01 | |* 46 | INDEX RANGE SCAN | AIAEWEVALRESP2 | 1 | | 2 (0)| 00:00:01 | | 47 | TABLE ACCESS BY INDEX ROWID | AEWEVALQUEST | 1 | 16 | 1 (0)| 00:00:01 | |* 48 | INDEX UNIQUE SCAN | AIAEWEVALQUEST1 | 1 | | 0 (0)| 00:00:01 | |* 49 | TABLE ACCESS FULL | AEWTITLES | 1 | 52 | 5 (0)| 00:00:01 | |* 50 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 1 | 15 | 3 (0)| 00:00:01 | |* 51 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 1 | | 2 (0)| 00:00:01 | | 52 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 1 | 33 | 3 (0)| 00:00:01 | |* 53 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 1 | | 2 (0)| 00:00:01 | | 54 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 1 | 33 | 3 (0)| 00:00:01 | |* 55 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 1 | | 2 (0)| 00:00:01 | | 56 | VIEW | AVI_EVAL_EFFECTIFS | 51 | 1887 | 1348 (3)| 00:00:17 | |* 57 | FILTER | | | | | | | 58 | HASH GROUP BY | | 51 | 3519 | 1348 (3)| 00:00:17 | | 59 | NESTED LOOPS | | 1011 | 69759 | 1347 (3)| 00:00:17 | |* 60 | HASH JOIN | | 1011 | 63693 | 1347 (3)| 00:00:17 | |* 61 | TABLE ACCESS FULL | AEMSERVICEOFF | 3034 | 87986 | 95 (3)| 00:00:02 | |* 62 | TABLE ACCESS FULL | AEMENROLLMENT | 76505 | 2540K| 1250 (3)| 00:00:15 | |* 63 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 1 | 6 | 0 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROUND(SUM(TO_NUMBER("A"."QUALITE_PEDAGOGIQUE"))/COUNT(TO_NUMBER("A"."QUALITE_PEDAGOGIQUE")),2)>=3.0 0) 3 - access("A"."SERVICE_ID"="B"."SERVICE_ID" AND "A"."SERVICEOFF_ID"="B"."SERVICEOFF_ID") 9 - access("TI"."TITLE_ID"="Q"."TITLE_CODE") 22 - filter("HS2"."STATUS"='N' AND "HS2"."CLIENT"='P1') 24 - filter(UPPER("GL32"."DESCRIPTION") LIKE '%FINANCE%') 25 - access("GL32"."CLIENT"='P1' AND "GL32"."ATTRIBUTE_ID"='32') 26 - access("GL32"."DIM_VALUE"="HS2"."REL_VALUE" AND "HS2"."REL_ATTR_ID"='32') 27 - filter("SO"."APP_PERIOD_FROM">="HS2"."DATE_FROM") 28 - access(INTERNAL_FUNCTION("SO"."APP_PERIOD_FROM")<=INTERNAL_FUNCTION("HS2"."DATE_TO")) filter(INTERNAL_FUNCTION("SO"."APP_PERIOD_FROM")<=INTERNAL_FUNCTION("HS2"."DATE_TO")) 29 - filter("SO"."STATUS"='N' AND SUBSTR("SO"."SERVICEOFF_ID",0,4)>='0910' AND "SO"."CLIENT"='P1') 30 - filter("SO"."APP_PERIOD_FROM">="HS"."DATE_FROM") 31 - access("SO"."APP_PERIOD_FROM"<="HS"."DATE_TO") filter("SO"."APP_PERIOD_FROM"<="HS"."DATE_TO") 32 - filter("HS"."REL_ATTR_ID"='C2' AND "HS"."STATUS"='N' AND "HS"."CLIENT"='P1') 34 - access("RS"."CLIENT"='P1' AND "HS"."RESOURCE_ID"="RS"."RESOURCE_ID") filter("HS2"."RESOURCE_ID"="RS"."RESOURCE_ID") 35 - filter(NVL("BLK"."DISABLED"(+),0)<>1 AND "BLK"."CLIENT"(+)='P1') 36 - access("BLK"."SERVICEOFF_FK"(+)="SO"."SERVICEOFF_PK") 38 - access("TBK"."CLIENT"(+)='P1' AND "TBK"."SERVTIMEBLK_FK"(+)="BLK"."SERVTIMEBLK_PK") 39 - filter("RO"."STATUS"='N') 40 - access("RO"."CLIENT"='P1' AND "SO"."SERVICE_ID"="RO"."SERVICE_ID" AND "SO"."SERVICEOFF_ID"="RO"."SERVICEOFF_ID") 42 - access("EP"."CLIENT"='P1' AND "EP"."EPISODE_PK"="RO"."EPISODE_FK") 43 - filter("ST"."CLIENT"='P1') 44 - access("ST"."STUDENT_PK"="EP"."STUDENT_FK") 46 - access("RP"."CLIENT"='P1' AND "RO"."ENROLLMENT_PK"="RP"."ENROLLMENT_FK" AND "RS"."RESOURCE_ID"="RP"."RESOURCE_ID") 48 - access("RP"."QUESTION_FK"="Q"."QUESTION_PK" AND "Q"."QUESTION_TYPE"='R') 49 - filter(UPPER("TI"."CULTURE")='FR' AND ("TI"."TITLE" LIKE 'Appréciation globale sur ce cours' OR "TI"."TITLE" LIKE 'Contenu du cours' OR "TI"."TITLE" LIKE 'Qualité des outils, méthodes et supports' OR "TI"."TITLE" LIKE 'Qualité pédagogique du professeur')) 50 - filter("GL42"."REL_VALUE"='P') 51 - access("GL42"."CLIENT"='P1' AND "GL42"."ATTRIBUTE_ID"='C2' AND "GL42"."DIM_VALUE"="HS"."REL_VALUE") 53 - access("GL22"."CLIENT"(+)='P1' AND "GL22"."ATTRIBUTE_ID"(+)='C2' AND "GL22"."DIM_VALUE"(+)="HS"."REL_VALUE") 55 - access("GL2"."CLIENT"(+)='P1' AND "GL2"."ATTRIBUTE_ID"(+)='32' AND "GL2"."DIM_VALUE"(+)="SO"."ED_DEPT") 57 - filter(TO_NUMBER(TO_CHAR(COUNT(*)))>=15.00) 60 - access("SO"."SERVICE_ID"="RO"."SERVICE_ID" AND "SO"."SERVICEOFF_ID"="RO"."SERVICEOFF_ID") 61 - filter("SO"."STATUS"='N' AND "SO"."CLIENT"='P1') 62 - filter("RO"."STATUS"='N' AND "RO"."CLIENT"='P1') 63 - access("EP"."CLIENT"='P1' AND "EP"."EPISODE_PK"="RO"."EPISODE_FK")
j'ai à présent un acces avec un utilisateur en DBA sur ma base, j'ai pu appliquer ce que propose Mohammed avec son /*+ gather_plan_statistics*/,
et en voici le résultat sans la clause where qui fait tout ramer ... je fais la suite ... mais si quelqu'un voit déjà un truc qui cloche ..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 SQL_ID frgh8s19gdzkg, child number 0 ------------------------------------- SELECT /*+gather_plan_statistics*/ 'A' tab , t.appreciation_globale AS appreciation_globale, t.code_cours , t.code_offre_de_cours , t.contenu_cours AS contenu_cours , t.departement_cours , t.departement_intervenant , t.enseignant , t.evaluation_terminee AS evaluation_terminee , t.groupe_intervenant , t.heures_physiques AS heures_physiques , t.libelle_du_cours , t.moyenne_generale AS moyenne_generale , t.nb_eleves AS nb_eleves , t.nb_eval AS nb_eval , t.periode , t.periode_academic_cours , t.promotion , t.qualite_outils AS qualite_outils , t Plan hash value: 2038560713 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | Writes | OMem | 1Mem | Used-Mem | Used-Tmp| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |* 1 | FILTER | | 1 | | 93 |00:01:37.55 | 4645K| 23661 | 6855 | | | | | | 2 | HASH GROUP BY | | 1 | 1 | 111 |00:01:37.55 | 4645K| 23661 | 6855 | | | | | |* 3 | HASH JOIN | | 1 | 1 | 16736 |00:01:37.56 | 4645K| 23661 | 6855 | 4416K| 1860K| 4352K (0)| | | 4 | VIEW | AVI_EVAL_ELEVE | 1 | 1 | 17068 |00:01:32.24 | 4447K| 18900 | 6855 | | | | | | 5 | HASH GROUP BY | | 1 | 1 | 17068 |00:01:32.10 | 4447K| 18900 | 6855 | | | | | | 6 | NESTED LOOPS OUTER | | 1 | 1 | 209K|00:00:30.79 | 4447K| 18450 | 6405 | | | | | | 7 | NESTED LOOPS OUTER | | 1 | 1 | 209K|00:00:20.34 | 4029K| 18447 | 6405 | | | | | | 8 | NESTED LOOPS OUTER | | 1 | 1 | 17068 |00:00:15.85 | 3977K| 18438 | 6405 | | | | | | 9 | NESTED LOOPS | | 1 | 1 | 17068 |00:00:14.79 | 3925K| 18438 | 6405 | | | | | | 10 | NESTED LOOPS OUTER | | 1 | 1 | 149K|00:01:29.23 | 3477K| 18438 | 6405 | | | | | | 11 | NESTED LOOPS OUTER | | 1 | 1 | 149K|00:01:20.72 | 3030K| 18438 | 6405 | | | | | | 12 | NESTED LOOPS | | 1 | 1 | 149K|00:01:12.06 | 2700K| 18438 | 6405 | | | | | | 13 | VIEW | | 1 | 3 | 213K|00:00:55.76 | 2238K| 18438 | 6405 | | | | | | 14 | NESTED LOOPS | | 1 | 3 | 213K|00:00:54.27 | 2238K| 18438 | 6405 | | | | | | 15 | NESTED LOOPS | | 1 | 3 | 213K|00:00:43.60 | 1811K| 18438 | 6405 | | | | | | 16 | NESTED LOOPS | | 1 | 3 | 213K|00:00:32.71 | 1384K| 18438 | 6405 | | | | | | 17 | NESTED LOOPS OUTER | | 1 | 3 | 213K|00:00:22.25 | 957K| 18432 | 6405 | | | | | |* 18 | HASH JOIN | | 1 | 3 | 213K|00:00:09.66 | 317K| 18432 | 6405 | 766K| 766K| 563K (0)| | |* 19 | TABLE ACCESS FULL | AEWTITLES | 1 | 1 | 4 |00:00:00.01 | 15 | 14 | 0 | | | | | |* 20 | HASH JOIN | | 1 | 369 | 213K|00:00:07.74 | 317K| 18418 | 6405 | 54M| 3745K| 37M (1)| 55296 | | 21 | TABLE ACCESS BY INDEX ROWID | AEWEVALRESP | 1 | 7 | 320K|00:00:15.07 | 317K| 11939 | 0 | | | | | | 22 | NESTED LOOPS | | 1 | 369 | 423K|00:00:07.64 | 263K| 6643 | 0 | | | | | | 23 | NESTED LOOPS | | 1 | 51 | 103K|00:00:01.99 | 55915 | 5404 | 0 | | | | | |* 24 | TABLE ACCESS FULL | AEMSERVICEOFF | 1 | 152 | 5610 |00:00:00.03 | 423 | 226 | 0 | | | | | |* 25 | TABLE ACCESS BY INDEX ROWID| AEMENROLLMENT | 5610 | 1 | 103K|00:00:01.69 | 55492 | 5178 | 0 | | | | | |* 26 | INDEX RANGE SCAN | AIAEMENROLLMENT3 | 5610 | 37 | 119K|00:00:00.73 | 11878 | 1333 | 0 | | | | | |* 27 | INDEX RANGE SCAN | AIAEWEVALRESP4 | 103K| 7 | 320K|00:00:03.17 | 208K| 1239 | 0 | | | | | |* 28 | TABLE ACCESS FULL | AEWEVALQUEST | 1 | 8181 | 10962 |00:00:00.05 | 76 | 74 | 0 | | | | | | 29 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 213K| 1 | 213K|00:00:07.46 | 640K| 0 | 0 | | | | | |* 30 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 213K| 1 | 213K|00:00:04.37 | 426K| 0 | 0 | | | | | | 31 | TABLE ACCESS BY INDEX ROWID | AEMEPISODE | 213K| 1 | 213K|00:00:08.23 | 426K| 6 | 0 | | | | | |* 32 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 213K| 1 | 213K|00:00:03.54 | 213K| 0 | 0 | | | | | |* 33 | TABLE ACCESS BY INDEX ROWID | AEMSTUDENT | 213K| 1 | 213K|00:00:08.21 | 426K| 0 | 0 | | | | | |* 34 | INDEX UNIQUE SCAN | AIAEMSTUDENT2 | 213K| 1 | 213K|00:00:03.44 | 213K| 0 | 0 | | | | | | 35 | TABLE ACCESS BY INDEX ROWID | AHSRESOURCES | 213K| 1 | 213K|00:00:08.16 | 426K| 0 | 0 | | | | | |* 36 | INDEX UNIQUE SCAN | AIAHSRESOURCES1 | 213K| 1 | 213K|00:00:03.50 | 213K| 0 | 0 | | | | | |* 37 | TABLE ACCESS BY INDEX ROWID | AHSRELVALUE | 213K| 1 | 149K|00:00:09.17 | 462K| 0 | 0 | | | | | |* 38 | INDEX RANGE SCAN | AIAHSRELVALUE1 | 213K| 1 | 248K|00:00:04.28 | 214K| 0 | 0 | | | | | |* 39 | TABLE ACCESS BY INDEX ROWID | AHSRELVALUE | 149K| 1 | 149K|00:00:05.30 | 330K| 0 | 0 | | | | | |* 40 | INDEX RANGE SCAN | AIAHSRELVALUE1 | 149K| 1 | 180K|00:00:02.89 | 150K| 0 | 0 | | | | | | 41 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 149K| 1 | 149K|00:00:05.16 | 447K| 0 | 0 | | | | | |* 42 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 149K| 1 | 149K|00:00:03.05 | 298K| 0 | 0 | | | | | |* 43 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 149K| 1 | 17068 |00:00:05.91 | 447K| 0 | 0 | | | | | |* 44 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 149K| 1 | 149K|00:00:03.03 | 298K| 0 | 0 | | | | | | 45 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 17068 | 1 | 17068 |00:00:00.57 | 51206 | 0 | 0 | | | | | |* 46 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 17068 | 1 | 17068 |00:00:00.35 | 34138 | 0 | 0 | | | | | |* 47 | TABLE ACCESS BY INDEX ROWID | AEMSERVTIMEBLK | 17068 | 9 | 209K|00:00:02.12 | 52706 | 9 | 0 | | | | | |* 48 | INDEX RANGE SCAN | AIAEMSERVTIMEBLK2 | 17068 | 9 | 209K|00:00:01.20 | 17622 | 1 | 0 | | | | | | 49 | TABLE ACCESS BY INDEX ROWID | AEMSERVTIMELIST | 209K| 1 | 209K|00:00:07.87 | 418K| 3 | 0 | | | | | |* 50 | INDEX UNIQUE SCAN | AIAEMSERVTIMELIST3 | 209K| 1 | 209K|00:00:03.45 | 209K| 1 | 0 | | | | | | 51 | VIEW | AVI_EVAL_EFFECTIFS | 1 | 51 | 4643 |00:00:05.43 | 198K| 4761 | 0 | | | | | |* 52 | FILTER | | 1 | | 4643 |00:00:05.40 | 198K| 4761 | 0 | | | | | | 53 | HASH GROUP BY | | 1 | 51 | 5870 |00:00:05.39 | 198K| 4761 | 0 | | | | | | 54 | NESTED LOOPS | | 1 | 1011 | 192K|00:00:06.96 | 198K| 4761 | 0 | | | | | |* 55 | HASH JOIN | | 1 | 1011 | 192K|00:00:01.58 | 6029 | 4761 | 0 | 1088K| 1088K| 1359K (0)| | |* 56 | TABLE ACCESS FULL | AEMSERVICEOFF | 1 | 3034 | 10781 |00:00:00.05 | 423 | 227 | 0 | | | | | |* 57 | TABLE ACCESS FULL | AEMENROLLMENT | 1 | 76505 | 192K|00:00:00.97 | 5606 | 4534 | 0 | | | | | |* 58 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 192K| 1 | 192K|00:00:03.05 | 192K| 0 | 0 | | | | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROUND(SUM(TO_NUMBER("A"."QUALITE_PEDAGOGIQUE"))/COUNT(TO_NUMBER("A"."QUALITE_PEDAGOGIQUE")),2)>=3) 3 - access("A"."SERVICE_ID"="B"."SERVICE_ID" AND "A"."SERVICEOFF_ID"="B"."SERVICEOFF_ID") 18 - access("TI"."TITLE_ID"="Q"."TITLE_CODE") 19 - filter((UPPER("TI"."CULTURE")='FR' AND INTERNAL_FUNCTION("TI"."TITLE"))) 20 - access("RP"."QUESTION_FK"="Q"."QUESTION_PK") 24 - filter(("SO"."STATUS"='N' AND SUBSTR("SO"."SERVICEOFF_ID",0,4)>='0910' AND "SO"."CLIENT"='P1')) 25 - filter("RO"."STATUS"='N') 26 - access("RO"."CLIENT"='P1' AND "SO"."SERVICE_ID"="RO"."SERVICE_ID" AND "SO"."SERVICEOFF_ID"="RO"."SERVICEOFF_ID") 27 - access("RP"."CLIENT"='P1' AND "RO"."ENROLLMENT_PK"="RP"."ENROLLMENT_FK") 28 - filter("Q"."QUESTION_TYPE"='R') 30 - access("GL2"."CLIENT"='P1' AND "GL2"."ATTRIBUTE_ID"='32' AND "GL2"."DIM_VALUE"="SO"."ED_DEPT") 32 - access("EP"."CLIENT"='P1' AND "EP"."EPISODE_PK"="RO"."EPISODE_FK") 33 - filter("ST"."CLIENT"='P1') 34 - access("ST"."STUDENT_PK"="EP"."STUDENT_FK") 36 - access("RS"."CLIENT"='P1' AND "RS"."RESOURCE_ID"="RP"."RESOURCE_ID") 37 - filter(("HS2"."STATUS"='N' AND "from$_subquery$_023"."APP_PERIOD_FROM"<="HS2"."DATE_TO" AND "from$_subquery$_023"."APP_PERIOD_FROM">="HS2"."DATE_FROM")) 38 - access("HS2"."CLIENT"='P1' AND "HS2"."RESOURCE_ID"="from$_subquery$_023"."QCSJ_C000000002100017" AND "HS2"."REL_ATTR_ID"='32') 39 - filter(("HS"."STATUS"='N' AND "SO"."APP_PERIOD_FROM"<="HS"."DATE_TO" AND "SO"."APP_PERIOD_FROM">="HS"."DATE_FROM")) 40 - access("HS"."CLIENT"='P1' AND "HS"."RESOURCE_ID"="RS"."RESOURCE_ID" AND "HS"."REL_ATTR_ID"='C2') 42 - access("GL22"."CLIENT"='P1' AND "GL22"."ATTRIBUTE_ID"='C2' AND "GL22"."DIM_VALUE"="HS"."REL_VALUE") 43 - filter(UPPER("GL32"."DESCRIPTION") LIKE '%FINANCE%') 44 - access("GL32"."CLIENT"='P1' AND "GL32"."ATTRIBUTE_ID"='32' AND "GL32"."DIM_VALUE"="HS2"."REL_VALUE") 46 - access("GL42"."CLIENT"='P1' AND "GL42"."ATTRIBUTE_ID"='C2' AND "GL42"."DIM_VALUE"="HS"."REL_VALUE") 47 - filter((NVL("BLK"."DISABLED",0)<>1 AND "BLK"."CLIENT"='P1')) 48 - access("BLK"."SERVICEOFF_FK"="from$_subquery$_023"."SERVICEOFF_PK") 50 - access("TBK"."CLIENT"='P1' AND "TBK"."SERVTIMEBLK_FK"="BLK"."SERVTIMEBLK_PK") 52 - filter(TO_NUMBER(TO_CHAR(COUNT(*)))>=15) 55 - access("SO"."SERVICE_ID"="RO"."SERVICE_ID" AND "SO"."SERVICEOFF_ID"="RO"."SERVICEOFF_ID") 56 - filter(("SO"."STATUS"='N' AND "SO"."CLIENT"='P1')) 57 - filter(("RO"."STATUS"='N' AND "RO"."CLIENT"='P1')) 58 - access("EP"."CLIENT"='P1' AND "EP"."EPISODE_PK"="RO"."EPISODE_FK")
Même dans l'exécution de la requête qui répond, le CBO se vautre totalement dans l'estimation des cardinalitées (E-Rows vs A-Rows).
Regarde la colonne LAST_ANALYZED de la vue USER_TABLES pour vérifier la dernière date de calcul des statistiques.
Tu peux aussi comparer la colonne NUM_ROWS avec le vrai nombre de ligne de la table (pour les différentes tables composant la requête)
A priori les stats ne sont pas à jour, utilise DBMS_STATS.GATHER_TABLE_STAT pour les récalculer.
Une commande de base par exemple :
A affiner si nécessaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part exec DBMS_STATS.GATHER_TABLE_STAT('LE_SCHEMA','LA_TABLE',cascade=>true)
Voit avec ton DBA, le calcul des stats c'est plutôt son boulot.
Regarde dbms_xplan.display_cursor pour des infos sur la commande.
J'ai fait recalculer les statistiques et la colonne LAST_ANALYZED de la vue USER_TABLES est à la date du jour.
Cela ne change rien malheureusement.
Est ce que changer l'ordre des jointures dans les clauses where pourrait changer quelque chose ?
Il faudrait peut être faire des jointures normalisées déjà.
~ Lola ~
Email : http://scr.im/waldar
heu j'ai toujours fait mes jointures comme cela .... qu'est ce que ne va pas ?
Merci d'avoir pris la peine de poster le plan d'exécution comme demandé. Je dois dire que c'est très intéressant et j'aimerai beaucoup que l'on trouve la raison. Voici ci-dessous mes remarques:
Le plan d'origine fait principalement ceci
Alors que le second plan fait ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ---------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost | ---------------------------------------------------------------------------------------------------------- | 3 | HASH JOIN | | 1 | 2225 | 1932 | | 4 | VIEW | AVI_EVAL_ELEVE | 1 | 2188 | 584 | | 5 | HASH GROUP BY | | 1 | 526 | 584 | ...... | 55 | VIEW | AVI_EVAL_EFFECTIFS | 51 | 1887 | 1348 | | 56 | FILTER | | | | | | 57 | HASH GROUP BY | | 51 | 3519 | 1348 | | 58 | NESTED LOOPS | | 1011 | 69759 | 1347 | | 59 | HASH JOIN | | 1011 | 63693 | 1347 | | 60 | TABLE ACCESS FULL | AEMSERVICEOFF | 3034 | 87986 | 95 | | 61 | TABLE ACCESS FULL | AEMENROLLMENT | 76505 | 2540K| 1250 | | 62 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 1 | 6 | 0 | ----------------------------------------------------------------------------------------------------------
c'est à dire tous les deux font une HASH JOIN entre deux VIEW intermédiaires.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 ------------------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | ------------------------------------------------------------------------------------------------------------------------ |* 3 | HASH JOIN | | 1 | 1 | 16736 |00:01:37.56 | | 4 | VIEW | AVI_EVAL_ELEVE | 1 | 1 | 17068 |00:01:32.24 | | 5 | HASH GROUP BY | | 1 | 1 | 17068 |00:01:32.10 | ...... | 51 | VIEW | AVI_EVAL_EFFECTIFS | 1 | 51 | 4643 |00:00:05.43 | |* 52 | FILTER | | 1 | | 4643 |00:00:05.40 | | 53 | HASH GROUP BY | | 1 | 51 | 5870 |00:00:05.39 | | 54 | NESTED LOOPS | | 1 | 1011 | 192K|00:00:06.96 | |* 55 | HASH JOIN | | 1 | 1011 | 192K|00:00:01.58 | |* 56 | TABLE ACCESS FULL | AEMSERVICEOFF | 1 | 3034 | 10781 |00:00:00.05 | |* 57 | TABLE ACCESS FULL | AEMENROLLMENT | 1 | 76505 | 192K|00:00:00.97 | |* 58 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 192K| 1 | 192K|00:00:03.05 | ------------------------------------------------------------------------------------------------------------------------
La différence provient donc principalement du pavé allant de l'opération 5 (HASH GROUP BY) jusqu'à loperation 51 dans le premier(55 dans le second) (VIEW)
Ces deux pavés sont:
dans le premier plan
et dans le second
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50 | 6 | NESTED LOOPS OUTER | | 1 | 526 | 583 | | 7 | NESTED LOOPS OUTER | | 1 | 493 | 580 | | 8 | NESTED LOOPS | | 1 | 460 | 577 | | 9 | HASH JOIN | | 1 | 445 | 574 | | 10 | NESTED LOOPS | | 1 | 393 | 568 | | 11 | NESTED LOOPS | | 1 | 377 | 567 | | 12 | NESTED LOOPS | | 1 | 339 | 564 | | 13 | NESTED LOOPS | | 1 | 310 | 563 | | 14 | NESTED LOOPS | | 1 | 300 | 562 | | 15 | HASH JOIN | | 1 | 261 | 547 | | 16 | TABLE ACCESS BY INDEX ROWID | AEMSERVTIMEBLK | 9 | 153 | 4 | | 17 | NESTED LOOPS | | 1 | 253 | 485 | | 18 | NESTED LOOPS | | 1 | 236 | 481 | | 19 | MERGE JOIN | | 10 | 2060 | 472 | | 20 | SORT JOIN | | 31 | 5425 | 403 | | 21 | MERGE JOIN | | 31 | 5425 | 402 | | 22 | SORT JOIN | | 81 | 5184 | 306 | | 23 | TABLE ACCESS BY INDEX ROWID | AHSRELVALUE | 2 | 62 | 9 | | 24 | NESTED LOOPS | | 81 | 5184 | 305 | | 25 | TABLE ACCESS BY INDEX ROWID| AGLDIMVALUE | 38 | 1254 | 259 | | 26 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 755 | | 6 | | 27 | INDEX RANGE SCAN | AIAHSRELVALUE3 | 16 | | 1 | | 28 | FILTER | | | | | | 29 | SORT JOIN | | 152 | 16872 | 96 | | 30 | TABLE ACCESS FULL | AEMSERVICEOFF | 152 | 16872 | 95 | | 31 | FILTER | | | | | | 32 | SORT JOIN | | 136 | 4216 | 69 | | 33 | TABLE ACCESS FULL | AHSRELVALUE | 136 | 4216 | 68 | | 34 | TABLE ACCESS BY INDEX ROWID | AHSRESOURCES | 1 | 30 | 1 | | 35 | INDEX UNIQUE SCAN | AIAHSRESOURCES1 | 1 | | 0 | | 36 | INDEX RANGE SCAN | AIAEMSERVTIMEBLK2 | 9 | | 1 | | 37 | TABLE ACCESS FULL | AEMSERVTIMELIST | 52580 | 410K| 61 | | 38 | TABLE ACCESS BY INDEX ROWID | AEMENROLLMENT | 1 | 39 | 15 | | 39 | INDEX RANGE SCAN | AIAEMENROLLMENT3 | 37 | | 2 | | 40 | TABLE ACCESS BY INDEX ROWID | AEMEPISODE | 1 | 10 | 1 | | 41 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 1 | | 0 | | 42 | TABLE ACCESS BY INDEX ROWID | AEMSTUDENT | 1 | 29 | 1 | | 43 | INDEX UNIQUE SCAN | AIAEMSTUDENT2 | 1 | | 0 | | 44 | TABLE ACCESS BY INDEX ROWID | AEWEVALRESP | 1 | 38 | 3 | | 45 | INDEX RANGE SCAN | AIAEWEVALRESP2 | 1 | | 2 | | 46 | TABLE ACCESS BY INDEX ROWID | AEWEVALQUEST | 1 | 16 | 1 | | 47 | INDEX UNIQUE SCAN | AIAEWEVALQUEST1 | 1 | | 0 | | 48 | TABLE ACCESS FULL | AEWTITLES | 1 | 52 | 5 | | 49 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 1 | 15 | 3 | | 50 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 1 | | 2 | | 51 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 1 | 33 | 3 | | 52 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 1 | | 2 | | 53 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 1 | 33 | 3 | | 54 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 1 | | 2 |
où (le second) l'on constate l'apparition d'une nouvelle operation VIEW supplémentaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46 | 6 | NESTED LOOPS OUTER | | 1 | 1 | 209K|00:00:30.79 | | 7 | NESTED LOOPS OUTER | | 1 | 1 | 209K|00:00:20.34 | | 8 | NESTED LOOPS OUTER | | 1 | 1 | 17068 |00:00:15.85 | | 9 | NESTED LOOPS | | 1 | 1 | 17068 |00:00:14.79 | | 10 | NESTED LOOPS OUTER | | 1 | 1 | 149K|00:01:29.23 | | 11 | NESTED LOOPS OUTER | | 1 | 1 | 149K|00:01:20.72 | | 12 | NESTED LOOPS | | 1 | 1 | 149K|00:01:12.06 | | 13 | VIEW | | 1 | 3 | 213K|00:00:55.76 | | 14 | NESTED LOOPS | | 1 | 3 | 213K|00:00:54.27 | | 15 | NESTED LOOPS | | 1 | 3 | 213K|00:00:43.60 | | 16 | NESTED LOOPS | | 1 | 3 | 213K|00:00:32.71 | | 17 | NESTED LOOPS OUTER | | 1 | 3 | 213K|00:00:22.25 | |* 18 | HASH JOIN | | 1 | 3 | 213K|00:00:09.66 | |* 19 | TABLE ACCESS FULL | AEWTITLES | 1 | 1 | 4 |00:00:00.01 | |* 20 | HASH JOIN | | 1 | 369 | 213K|00:00:07.74 | | 21 | TABLE ACCESS BY INDEX ROWID | AEWEVALRESP | 1 | 7 | 320K|00:00:15.07 | | 22 | NESTED LOOPS | | 1 | 369 | 423K|00:00:07.64 | | 23 | NESTED LOOPS | | 1 | 51 | 103K|00:00:01.99 | |* 24 | TABLE ACCESS FULL | AEMSERVICEOFF | 1 | 152 | 5610 |00:00:00.03 | |* 25 | TABLE ACCESS BY INDEX ROWID| AEMENROLLMENT | 5610 | 1 | 103K|00:00:01.69 | |* 26 | INDEX RANGE SCAN | AIAEMENROLLMENT3 | 5610 | 37 | 119K|00:00:00.73 | |* 27 | INDEX RANGE SCAN | AIAEWEVALRESP4 | 103K| 7 | 320K|00:00:03.17 | |* 28 | TABLE ACCESS FULL | AEWEVALQUEST | 1 | 8181 | 10962 |00:00:00.05 | | 29 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 213K| 1 | 213K|00:00:07.46 | |* 30 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 213K| 1 | 213K|00:00:04.37 | | 31 | TABLE ACCESS BY INDEX ROWID | AEMEPISODE | 213K| 1 | 213K|00:00:08.23 | |* 32 | INDEX UNIQUE SCAN | AIAEMEPISODE1 | 213K| 1 | 213K|00:00:03.54 | |* 33 | TABLE ACCESS BY INDEX ROWID | AEMSTUDENT | 213K| 1 | 213K|00:00:08.21 | |* 34 | INDEX UNIQUE SCAN | AIAEMSTUDENT2 | 213K| 1 | 213K|00:00:03.44 | | 35 | TABLE ACCESS BY INDEX ROWID | AHSRESOURCES | 213K| 1 | 213K|00:00:08.16 | |* 36 | INDEX UNIQUE SCAN | AIAHSRESOURCES1 | 213K| 1 | 213K|00:00:03.50 | |* 37 | TABLE ACCESS BY INDEX ROWID | AHSRELVALUE | 213K| 1 | 149K|00:00:09.17 | |* 38 | INDEX RANGE SCAN | AIAHSRELVALUE1 | 213K| 1 | 248K|00:00:04.28 | |* 39 | TABLE ACCESS BY INDEX ROWID | AHSRELVALUE | 149K| 1 | 149K|00:00:05.30 | |* 40 | INDEX RANGE SCAN | AIAHSRELVALUE1 | 149K| 1 | 180K|00:00:02.89 | | 41 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 149K| 1 | 149K|00:00:05.16 | |* 42 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 149K| 1 | 149K|00:00:03.05 | |* 43 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 149K| 1 | 17068 |00:00:05.91 | |* 44 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 149K| 1 | 149K|00:00:03.03 | | 45 | TABLE ACCESS BY INDEX ROWID | AGLDIMVALUE | 17068 | 1 | 17068 |00:00:00.57 | |* 46 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 17068 | 1 | 17068 |00:00:00.35 | |* 47 | TABLE ACCESS BY INDEX ROWID | AEMSERVTIMEBLK | 17068 | 9 | 209K|00:00:02.12 | |* 48 | INDEX RANGE SCAN | AIAEMSERVTIMEBLK2 | 17068 | 9 | 209K|00:00:01.20 | | 49 | TABLE ACCESS BY INDEX ROWID | AEMSERVTIMELIST | 209K| 1 | 209K|00:00:07.87 | |* 50 | INDEX UNIQUE SCAN | AIAEMSERVTIMELIST3 | 209K| 1 | 209K|00:00:03.45 |
Dépendant de son opération fille(14 NESTED LOOPS ici), une opération VIEW doit d'abord construire totalement sa réponse avant de transmettre le résultat à son opération mère(NESTED LOOP ici aussi) ce qui veut dire que comparativement au premier plan d'execution cette opération VIEW supplémentaire peut avoir ajouter un laps de temps d'attente qui d'ailleurs vaut ici 55 secondes (y compris le temps de ses opérations filles).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 | 13 | VIEW | | 1 | 3 | 213K|00:00:55.76 | | 14 | NESTED LOOPS | | 1 | 3 | 213K|00:00:54.27 | | 15 | NESTED LOOPS | | 1 | 3 | 213K|00:00:43.60 | | 16 | NESTED LOOPS | | 1 | 3 | 213K|00:00:32.71 | | 17 | NESTED LOOPS OUTER | | 1 | 3 | 213K|00:00:22.25 |
Je remarque aussi la disparition dans le second plan des operations MERGE JOIN et SORT JOIN.
Comment ce changement est arrivé? j'avoue que je n'en ai aucune idée. Je ne peux que spéculer en comparant les différences. Par exemple la toute première opération dans le premier plan est :
Alors que dans le deuxième c'est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 | 25 | TABLE ACCESS BY INDEX ROWID| AGLDIMVALUE | 38 | 1254 | 259 | | 26 | INDEX RANGE SCAN | AIAGLDIMVALUE1 | 755 | | 6 |
Peut-être qu'en utilisant des hints (LEADING par exemple) conduirait le CBO à commencer par la table AGLDIMVALUE et rétablirait le bon plan. Il y aussi la possibilité de supprimer ces VIEW en utilisant le hint MERGE (quoique je n'en suis pas totalement sûr).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 |* 24 | TABLE ACCESS FULL | AEMSERVICEOFF | 1 | 152 | 5610 |00:00:00.03 | |* 25 | TABLE ACCESS BY INDEX ROWID| AEMENROLLMENT | 5610 | 1 | 103K|00:00:01.69 |
Sinon, quelques remarques au passage qui serviront peut-être ulterieurement et pas forcément cette fois-ci:
L'opération suivante fait un full table scan pour ne ramener que 4 lignes. La partie Predicate peut expliquer peut-être la non utilisation de l index si index il y a
L'opération 26 passe à son opération mère (25) 119.000 lignes sur lesquelles est appliqué un filtre pour éliminer 16.000 lignes. C'est une perte de temps et d'énergie qui peut être résolue en créant un index plus précis sur la table AEMENROLLMENT. Je suppose que l'index AIAEMENROLLMENT3 est défini sur (CLIENT,SERVICE_ID, SERVICEOFF_ID); avez vous essayé d'enrichir cet index avec la colonne STATUS?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 |* 19 | TABLE ACCESS FULL | AEWTITLES | 1 | 1 | 4 |00:00:00.01 | 15 | 14 | 19 - filter((UPPER("TI"."CULTURE")='FR' AND INTERNAL_FUNCTION("TI"."TITLE")))
Bon couragae
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 |* 25 | TABLE ACCESS BY INDEX ROWID| AEMENROLLMENT | 5610 | 1 | 103K|00:00:01.69 | 55492 | 5178 | 0 | | | | | |* 26 | INDEX RANGE SCAN | AIAEMENROLLMENT3 | 5610 | 37 | 119K|00:00:00.73 | 11878 | 1333 | 25 - filter("RO"."STATUS"='N') 26 - access("RO"."CLIENT"='P1' AND "SO"."SERVICE_ID"="RO"."SERVICE_ID" AND "SO"."SERVICEOFF_ID"="RO"."SERVICEOFF_ID")
je reprend les commentaires les uns après les autres et je remarque que l'index utilisé ne me semble pas judicieux et n'est pas en rapport avec ma jointure ou alors je ne comprend pas ....
Ma table a plusieurs index dont un AIAEMENROLLMENT1 qui reprend :
CLIENT, ENROLLMENT_PK
qui correspond plus à ma jointure
alors que celui qui semble utilisé est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 INNER JOIN aemenrollment ro ON (ro.enrollment_pk = rp.enrollment_fk AND ro.client = 'P1' AND ro.status = 'N' )
AIAEMENROLLMENT3 qui reprend :
CLIENT, SERVICE_ID, SERVICEOFF_ID
qui se rapproche de cette jointure , mais qui concerne une autre table
et je vois dans le plan que pour cette table j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 INNER JOIN aemserviceoff so ON (so.service_id = ro.service_id and so.serviceoff_id = ro.serviceoff_id AND so.client = 'P1' AND so.status = 'N' )
alors que j'ai un index AIAEMSERVICEOFF1 qui reprend :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2TABLE ACCESS FULL | AEMSERVICEOFF
CLIENT, SERVICE_ID, SERVICEOFF_ID
j'avoue être un peu perdu
Peux tu poster le nouveau plan de la requête avec les stats.
Que donne le résultat de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select REL_VALUE, count(*) from agldimvalue group by REL_VALUE
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager