Bonjour,
Voilà je fais appel à vos conseil car je suis assez embêté sur les performances d'une table oracle assez grosse.
Bref j'ai une table qui récupère des points gps pour une flotte de véhicules. Cette table est considérée comme isolée : pas de jointure ou de liens avec d'autres tables possibles. Coté volumétrie on va dire une dizaine de millions d'enregistrements.
Voilà la description de la table et de ses indexes :
N'étant pas de grands connaisseurs oracle dans ma boite on a créé tout ça avec les options "par défaut" d'oracle hein
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 CREATE TABLE "POINTGPS" ( "IDVHC" NUMBER(10,0), "LAT" FLOAT(76), "LON" FLOAT(76), "DATETIME" FLOAT(76), "NBSAT" NUMBER(10,0), "NUMTRAJ" NUMBER(10,0), "POIDS" NUMBER(10,0), "VOLUME" NUMBER(10,0), "ODOMETRE" NUMBER(10,0), "COMPAS" NUMBER(10,0), "TEMPERAT" NUMBER(10,0), "BAC" NUMBER(10,0), "RIPEUR" NUMBER(10,0), "CAP1" VARCHAR2(255 BYTE), "CAP2" NUMBER(10,0), "CAP3" NUMBER(10,0), "TYPCOL" NUMBER(10,0), "PORTEDEV" NUMBER(10,0), "VITESSE" FLOAT(76), "NUMADR" NUMBER(10,0), "CLEACCESRESEAU" NUMBER(10,0), "POIDSDYN" NUMBER(10,0), "CLETOURMODELE" NUMBER(10,0), "IMMAT" VARCHAR2(15 BYTE), "LIBEQUIPE" VARCHAR2(25 BYTE) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 5242880 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TB1"; CREATE INDEX "INDEXDATEVHC" ON "POINTGPS" ("DATETIME", "IDVHC") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TB1" ; CREATE INDEX "INDEXGPSDATE" ON "POINTGPS" ("DATETIME") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TB1" ; CREATE INDEX "INDEXIDVHCIMMAT" ON "POINTGPS" ("IDVHC", "IMMAT") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TB1" ;
Bon on va dire que globalement les performances sont acceptables. Mais y a une requête qui fait mal c'est :
Celle là c'est une 15 aine de secondes à chaque fois et ça fait mal
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT DISTINCT(IDVHC),IMMAT FROM POINTGPS WHERE (DATETIME>=39654.000000) AND (DATETIME<=39655.000000) ORDER BY IMMAT,IDVHC
La base tourne sur un windows server 2003 avec oracle 10g entreprise édition et la machine c'est un bi xeon avec 4Go de RAM dédié à cette base. Je précise que j'ai 15 sec de réponse sur cette requete quand je suis tout seul sur le serveur et que je lance QUE cette requete.
Je me dis que quand même il doit y avoir moyen d'optimiser tout ça
Voici les pistes que j'ai envisagé :
->Optimiser les type number de certainnes colonnes (IDVHC ne représente que des chiffres de 1 à 999 par exemple).
->Paramétrer mes indexes différemment : là j'y pipe que dalle je sais pas par où commencer.
->Changer ma table et mes indexes dans différents tablespace : n'est utile que si on a 2 disque physiques séparé non ? Moi c'est du raid et la charge sur les disques est géré par le controleur raid.
->Optimiser ma requete : là je vois pas, y a bien le group by à la place du distinct mais j'ai lu que ça changeait rien...
->Changer les params de mon instance oracle : là aussi c'est une install par défaut en serveur dédié mais je sais pas par où commencer.
Bref voilà je m'attends pas à une solution miracle (enfin si elle existe je la prend quand même hein ) mais surtout à des piste et savoir dans quelle ordre de priorité procéder.
Partager