Bonjour,
On m'a demandé de voir comment optimiser une requête SQL (pour le boulot), mais je ne suis pas vraiment expert et j'ai l'impression que je vais y passer mes journées... Pour le contexte, c'est une requête qui attaque une base de production (ou plus exactement une copie de la base de production) et je ne suis pas DBA donc aucun droit particulier. Ce qui signifie donc qu'il s'agit d'optimiser la requête et uniquement la requête.
Voilà la requête en question :
Note :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 select distinct H.DANEG, H.COMAR, H.COINF, H.CNACT, H.LNACT, H.NUCON, decode(H.CSENS, 'A', 'B', 'S'), H.CSOPT, H.QTCCP, H.CMECH, H.CAECH, H.DAECA, H.CODEV, H.MTSNA, H.MTNEG, decode(H.COMAR, 'EUREX', decode(H.COINF, 'HSBC EUR', 'HL1235', 'HSBCEURC', 'CL1234'), 'AEX', 'HL1236', 'ADEX', 'HL1238', 'HL1234') from ERESHX H where H.DANEG = (select distinct DATRA from DATRAI where COMAR = 'EUREX');
SELECT DISTINCT DATRA FROM DATRAI WHERE COMAR = 'EUREX' renvoie une seule ligne (une date).
Elle n'est pas de moi cette requête, pour les observateurs, elle donne une indication sur l'entreprise pour laquelle je travaille (je suis en stage) et le type de données traitées... :P
Au niveau des temps de traitement, la requête que j'ai copiée plus haut a un temps d'exécution beaucoup trop long (près d'une heure), alors que si je remplace le second SELECT DISTINCT par une date "en dur" (to_date('16/06/2008', 'DD/MM/YYYY') par exemple), la requête s'exécute en 5 minutes environ.
En ce qui concerne la volumétrie des tables, la voici :
Et si ça a une importance, la base est sous Oracle 9i.Code:
1
2
3
4
5
6
7
8
9
10
11
12 SQL> select count(*) from ERESHX; COUNT(*) ---------- 9315190 SQL> select count(*) from DATRAI; COUNT(*) ---------- 31
Merci pour votre aide :D