Bonjour,
J'ai un problème bizarre avec un progiciel sur une requête qui utilise une bind variable. La requête est en elle-même assez simple, sur une table de 1,7 millions de lignes :
Par contre, malgré des stats à jour et la présence d'un index sur DOC_ID le plan d'exécution est catastrophique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT A.DOC_ID,A.STAMP_UID,A.STAMP_DATE,A.LOG_INDEX,A.LOG_COMMENT FROM ACTION_LOG A WHERE (( A.DOC_ID = :PAR_FILTER0_0 ));
Pour invalider le plan d'exécution, je fais une opération de type DDL sur la table (REVOKE ou GRANT) et là je me retrouve avec un plan d'exécution correcte sur ce SQL ID :
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 select * from table(dbms_xplan.display_cursor('d4mkvkrz4q58s',null,'ADVANCED')) SQL_ID d4mkvkrz4q58s, child number 1 ------------------------------------- SELECT A.DOC_ID,A.STAMP_UID,A.STAMP_DATE,A.LOG_INDEX,A.LOG_COMMENT )A.DOC_ID = :PAR_FILTER0_0 ) Plan hash value: 367639580 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 5138 (100)| | |* 1 | TABLE ACCESS FULL| ACTION_LOG | 189K| 15M| 5138 (1)| 00:01:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("A"."DOC_ID"=:PAR_FILTER0_0)
Problème : au bout d'un certain temps (genre le lendemain), il me refait le coup du plan d'exécution foireux. C'est particulièrement gênant car ca sollicite le disque, et le progiciel n'arrête pas d'utiliser cette requête qui met 1 min à s'exécuter. Existe-t-il une façon de forcer le plan d'exécution mis à part le hint (car je n'ai pas la main sur le progiciel) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 9 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| ACTION_LOG | 16 | 1392 | 9 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | ACTION_LOG_DOC_ID | 16 | | 3 (0)| 00:00:01 | -------------------------------------------------------------------------------------------------
Mon environnement :
- Windows 2003 Server
- Oracle 10.2.0.4 32 bits, Enterprise Edition
Partager