tu peux bidouiller ta requête pour qu'elle te retourne qqch et faire le même test?
envoie également les résultats des select sur user_indexes et user_tables STP
tu peux bidouiller ta requête pour qu'elle te retourne qqch et faire le même test?
envoie également les résultats des select sur user_indexes et user_tables STP
apres avoir modifié la requete pour quel retourne un resultat, j'obtiens:
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SQL> SELECT 2 ag_seque_686 3 FROM f_agenda 4 WHERE ag_code = 'RE_AD' 5 AND ag_ptrvalprin = '66083040' 6 AND NVL(ag_lib_car02, '-') != 'CL'; AG_SEQUE_686 ------------ 2608453 Elapsed: 00:00:26.86
et
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SQL> select /*+rule*/ 2 ag_seque_686 3 FROM f_agenda 4 WHERE ag_code = 'RE_AD' 5 AND ag_ptrvalprin = '66083040' 6 AND NVL(ag_lib_car02, '-') != 'CL'; AG_SEQUE_686 ------------ 2608453 Elapsed: 00:00:00.24
ton index est uniquement sur la colonne ag_code ?
pour la nème fois peux tu retourner STP le résultat des requêtes suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT num_rows,blocks,empty_blocks,last_analyzed FROM user_tables WHERE table_name = 'F_AGENDA'; SELECT index_name, blevel, leaf_blocks, distinct_keys,num_rows, clustering_factor, last_analyzed FROM user_indexes WHERE table_name = 'F_AGENDA';
que donne
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sho parameter cursor_sharing
et
as tu l'ordre de creation de l'index IND_AG_CODE ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT blevel,leaf_blocks,last_analyzed,index_name FROM user_indexes WHERE table_name='LA_TABLE_EN_QUESTION'
asktom.oracle.com tahiti.oracle.com otn.oracle.com
Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
phrase chinoise issue du Huainanzi
Désolé, je n'arrete pas d'etre intérompu, mais c'est bon j'ai reussi à vous envoyer le resultat de la requete ...
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT num_rows,blocks,empty_blocks,last_analyzed FROM user_tables WHERE table_name = 'F_AGENDA'; NUM_ROWS BLOCKS EMPTY_BLOCKS LAST_ANALYZED -------- ---------- ------------ ------------------- 865025 14230 0 03/09/2009 12:14:22
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 SELECT index_name, blevel, leaf_blocks, distinct_keys,num_rows, clustering_fact FROM user_indexes WHERE table_name = 'F_AGENDA'; INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS CLUSTER ------------------------------ ------ ----------- ------------- -------- ------- IND_AG_CODE IND_AG_CODE_CAR_LIB IND_AG_DOMAINE IND_AG_IDENT_CLIENT IND_AG_PTRAPPID IND_AG_PTRASSID IND_AG_PTRCOID IND_AG_PTRFGID IND_AG_PTRINTID IND_AG_PTRPOID IND_AG_PTRPRMID IND_AG_PTRSIID IND_AG_PTRSORID IND_AG_PTRVERID IND_AG_PTR_COM IND_AG_PTR_ENV IND_AG_UTILI PK_AG_SEQUE_686
le sho parameter cursor_sharing me donne:
Par contre, pour ce qui est de l'ordre de creation de l'index IND_AG_CODE, comment puis je savoir ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 show parameter cursor_sharing NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cursor_sharing string EXACT
Tu n'as pas de stats sur les index !!
Quelle commande exacte est utilisée dans DBMS_STATS.GATHER_SCHEMA_STATS
c'est le options qui comptent !!!!
donc il faut lancer les stats sur la table et ses indexes ou au moins les indexes de la table
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 exec dbms_stats.gather_index_stats('SCOTT','idx_test1');
... il y a plethore d'exemples ici
asktom.oracle.com tahiti.oracle.com otn.oracle.com
Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
phrase chinoise issue du Huainanzi
t'as pas de stats sur tes indexes.
execute la requete suivante:
puis execute de nouveau la requête sans le hint
Code : Sélectionner tout - Visualiser dans une fenêtre à part analyze index compute statistics IND_AG_CODE;
sorry
sinon tu peux utiliser dbms_stats.GATHER_INDEX_STATS
Code : Sélectionner tout - Visualiser dans une fenêtre à part analyze INDEX IND_AG_CODE compute statistics
J'ai bien des stats sur l'index IND_AG_CODE
et la commande exécuté est la suivante:
exec DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'$SCHEMA',estimate_percent=>10,cascade=>TRUE);
ba non t'avais pas de stats sinon t'aurais eu des valeurs dans USER_INDEXES
recalcul les stats sur l'index et lance un explain plan sur ta requete sans le hint RULE
Je ne sais pas mais le resultat de la requete user_indexes dit le contraire .... au dessus
Ici l'index qui n'a pas été analysé n'a pas d'info comme le tien !
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 9> create table test1 (col1 varchar2(20),col2 number) ; Table created. 9> create index idx_test1 on test1(nvl(col2,'-')); Index created. 9> create index idx_test2 on test1(col2); Index created. 9> SELECT blevel,leaf_blocks,last_analyzed,index_name FROM user_indexes WHERE table_name = 'TEST1'; BLEVEL LEAF_BLOCKS LAST_ANAL INDEX_NAME ---------- ----------- --------- ------------------------------ IDX_TEST2 IDX_TEST1 9> exec dbms_stats.gather_index_stats('SCOTT','idx_test1'); PL/SQL procedure successfully completed. 9> SELECT blevel,leaf_blocks,last_analyzed,index_name FROM user_indexes WHERE table_name = 'TEST1'; BLEVEL LEAF_BLOCKS LAST_ANAL INDEX_NAME ---------- ----------- --------- ------------------------------ IDX_TEST2 0 0 03-SEP-09 IDX_TEST1
Donc autant lancer a nouveaux les stats !
et tu verifieras par la requete idoine
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT blevel,leaf_blocks,last_analyzed,index_name FROM user_indexes WHERE table_name = 'TEST1';
asktom.oracle.com tahiti.oracle.com otn.oracle.com
Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
phrase chinoise issue du Huainanzi
Apres verification, j'ai bien des stats sur les index de ma table f_agenda.
Code SQL : 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 SELECT index_name, blevel, leaf_blocks, distinct_keys,num_rows FROM user_indexe INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS ------------------------------ ------ ----------- ------------- -------- IND_AG_CODE 2 1037 62 861195 IND_AG_CODE_CAR_LIB 2 1718 27544 873796 IND_AG_DOMAINE 1 835 4 861195 IND_AG_IDENT_CLIENT 1 518 213699 450202 IND_AG_PTRAPPID 0 0 0 0 IND_AG_PTRASSID 0 0 0 0 IND_AG_PTRCOID 1 93 3 94766 IND_AG_PTRFGID 1 797 261340 689489 IND_AG_PTRINTID 1 747 97 764917 IND_AG_PTRPOID 1 451 209014 390604 IND_AG_PTRPRMID 0 0 0 0 IND_AG_PTRSIID 1 341 145922 291694 IND_AG_PTRSORID 0 0 0 0 IND_AG_PTRVERID 0 0 0 0 IND_AG_PTR_COM 0 0 0 0 IND_AG_PTR_ENV 0 0 0 0 IND_AG_UTILI 2 949 820 857521 PK_AG_SEQUE_686 1 926 861386 861386
Dans le doute je re executé les requetes
Il reste toujours plus long sans le Rule...
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 SQL> set timing on SQL> SELECT 2 ag_seque_686 3 FROM f_agenda 4 WHERE ag_code = 'RE_AD' 5 AND ag_ptrvalprin = 40777590 6 AND NVL(ag_lib_car02, '-') != 'CL'; no rows selected Elapsed: 00:00:05.66 SQL> SELECT /*+rule*/ 2 ag_seque_686 3 FROM f_agenda 4 WHERE ag_code = 'RE_AD' 5 AND ag_ptrvalprin = 40777590 6 AND NVL(ag_lib_car02, '-') != 'CL'; no rows selected Elapsed: 00:00:00.15 SQL> SELECT 2 ag_seque_686 3 FROM f_agenda 4 WHERE ag_code = 'RE_AD' 5 AND ag_ptrvalprin = 40777590 6 AND NVL(ag_lib_car02, '-') != 'CL'; no rows selected Elapsed: 00:00:01.27
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 SELECT num_rows,blocks,empty_blocks,last_analyzed FROM user_tables WHERE table_n NUM_ROWS BLOCKS EMPTY_BLOCKS LAST_ANALYZED -------- ---------- ------------ ------------------- 858350 14230 8 29/08/2009 18:03:13 1 row selected SELECT num_rows,blocks,empty_blocks,last_analyzed FROM user_tables WHERE table_n NUM_ROWS BLOCKS EMPTY_BLOCKS LAST_ANALYZED -------- ---------- ------------ ------------------- 858350 14230 8 29/08/2009 18:03:13 1 row selected SELECT index_name, blevel, leaf_blocks, distinct_keys,num_rows FROM user_indexe INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS ------------------------------ ------ ----------- ------------- -------- IND_AG_CODE 2 1037 62 861195 IND_AG_CODE_CAR_LIB 2 1718 27544 873796 IND_AG_DOMAINE 1 835 4 861195 IND_AG_IDENT_CLIENT 1 518 213699 450202 IND_AG_PTRAPPID 0 0 0 0 IND_AG_PTRASSID 0 0 0 0 IND_AG_PTRCOID 1 93 3 94766 IND_AG_PTRFGID 1 797 261340 689489 IND_AG_PTRINTID 1 747 97 764917 IND_AG_PTRPOID 1 451 209014 390604 IND_AG_PTRPRMID 0 0 0 0 IND_AG_PTRSIID 1 341 145922 291694 IND_AG_PTRSORID 0 0 0 0 IND_AG_PTRVERID 0 0 0 0 IND_AG_PTR_COM 0 0 0 0 IND_AG_PTR_ENV 0 0 0 0 IND_AG_UTILI 2 949 820 857521 PK_AG_SEQUE_686 1 926 861386 861386 18 rows selected
Apres avoir fait les stats des index
Que donne explain plan d'une requete sans hint rule
Parce que la tu as moins de 1 sec de diff de temps d'execution !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 sELECT 2 ag_seque_686 3 FROM f_agenda 4 WHERE ag_code = 'RE_AD' 5 AND ag_ptrvalprin = 40777590 6 AND NVL(ag_lib_car02, '-') != 'CL';
asktom.oracle.com tahiti.oracle.com otn.oracle.com
Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
phrase chinoise issue du Huainanzi
pourquoi t'as pas mis le clustering_factor dans ta requête sur user_indexes ?
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