Bonjour.

J'ai besoin d'un peux d'aide pour optimiser une table que j'ai créé ainsi que la requête que j'exécute dessus.

Tous d’abord, voici m'as table:
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
CREATE TABLE TOTO
(
  ID_TOTO       NUMBER NOT NULL,
  DATE_TOTO     DATE NOT NULL,
  ID_LIB1       NUMBER(3) NOT NULL,
  NOM_ LIB1     VARCHAR2(50 BYTE) NOT NULL,
  NO_ CARTE1     NUMBER(3) NOT NULL,
  NO_ CARTE2     NUMBER(3) NOT NULL,
  NO_ CARTE3      NUMBER(5) NOT NULL,
  ID_LIB2       NUMBER(5),
  NOM_ LIB2     VARCHAR2(50 BYTE),
  ID_ LIB3      NUMBER(3),
  NOM_ LIB3     VARCHAR2(50 BYTE),
  ID_ LIB4      NUMBER(6),
  NOM_ LIB4     VARCHAR2(50 BYTE)
)
Je vous explique 2-3 choses :
- ID_TOTO est l’identifiant de la table (n° de ligne)
- Je crée cette table à partir de plusieurs autres tables :
TABLE LIB1(ID_TOTO, ID_LIB1, NOM_ LIB1)
TABLE LIB2(ID_TOTO, ID_LIB2, NOM_ LIB2)
TABLE LIB3(ID_TOTO, ID_LIB3, NOM_ LIB3)
TABLE LIB4(ID_TOTO, ID_LIB4, NOM_ LIB4)
Je fais ensuite une requête selon les choix que fond les utilisateurs selon date_toto, no_carte1, no_carte2, no_carte3, id_lib1, id_lib2, id_lib3, id_lib4

Exemple de requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Select DATE_TOTO, NO_ CARTE1, NO_ CARTE2, NO_ CARTE3,  NOM_ LIB1, NOM_ LIB2, NOM_ LIB3, NOM_ LIB4 from TOTO where no_carte1=33 and no_carte2=10 and no_carte3=28 and (id_lib1=22 or id_lib1=23) and id_lib3=24 and id_lib4=32 and date_toto between10/01/2008and20/01/2008

Dernière précision :

- tous ces champs peuvent être renseigné ou non la requête se construisant selon les choix renseigné
- les champs retournés son toujours les mêmes (DATE_TOTO, NO_ CARTE1, NO_ CARTE2, NO_ CARTE3, NOM_ LIB1, NOM_ LIB2, NOM_ LIB3, NOM_ LIB4)
- il y a un choix multiple sur LIB1, 2 ,3 et 4
- un choix unique sur NO_ CARTE1, 2 et 3
- la date si elle est renseigné et toujours choisit sur un intervalle ( between ‘date_min’ and ‘date_max’)
- chose qui a sont importance, la table toto comporte environ 10 millions d’enregistrement

M’as 1er question est donc comment puis-je améliorer m’as table :
- je vois déjà la primary key : CONSTRAINT TABPASSAGES PRIMARY KEY (ID_PASSAGES) USING INDEX TABLESPACE USER_INDEXES
- et au niveau des index, je n’y connais rien je dirais qu’il faut en mettre sur LIB1, 2 ,3 et 4, NO_ CARTE1, 2 et et la date, mais comment et dans quelles ordre ?

M’as 2ème question est comment améliorer m’as requête :

- y a-t-il un ordre dans la disposition des champs dans le ‘where’ ou cela ne change t’il rien ?

Je me rends compte que c’est un peu confus, j’espère ne pas vous avoir perdu en route et que vous pourrais m’aider.

Bonne journée.

sdisp