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 :
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" ;
N'étant pas de grands connaisseurs oracle dans ma boite on a créé tout ça avec les options "par défaut" d'oracle hein

Bon on va dire que globalement les performances sont acceptables. Mais y a une requête qui fait mal c'est :
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
Celle là c'est une 15 aine de secondes à chaque fois et ça fait mal

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.