2 votes

Accélérer les requêtes Oracle multi-tables avec la clause ORDER BY

J'ai les trois tables suivantes (il y a en fait beaucoup plus de champs, mais cela devrait donner une idée de ce que j'essaie de faire) :

log (
  eventId INTEGER,
  objectId INTEGER,
  PRIMARY KEY (eventId)
)

objects (
  objectId INTEGER,
  typeId INTEGER,
  PRIMARY KEY (objectId, typeId)
)

statusBits (
  typeId INTEGER,
  bitNumber INTEGER,
)

Les log contient un très grand nombre d'enregistrements (plus de 500 000), alors que les autres tables sont assez petites. Je peux joindre les tables à l'aide de la requête suivante :

SELECT l.eventId, o.typeId, s.bitNumber
FROM log l, objects o, statusBits s
WHERE (l.objectId = o.objectId) AND (o.typeId = s.typeId)

Cette requête s'exécute rapidement. Elle fonctionne également rapidement lorsque j'ajoute un ORDER BY eventId à la fin. Cependant, lorsque j'ajoute ORDER BY eventId, bitNumber (triant ainsi sur deux champs au lieu d'un), il devient douloureusement lent.

Comment puis-je optimiser ma requête pour qu'elle s'exécute plus rapidement ? J'utilise Oracle 10g XE si cela fait une différence.

UPDATE : J'ai déjà essayé CREATE INDEX ON statusBits(bitNumber) mais cela ne semble pas avoir beaucoup d'effet.

0voto

Joël Salamin Points 3027

Tout d'abord, je vais reformuler votre requête comme suit :

SELECT L.eventId
    ,O.typeId
    ,S.bitNumber
FROM log L
INNER JOIN objects O ON O.objectId = L.objectId
INNER JOIN statusBits S ON S.typeId = O.typeId

Cela n'améliorera probablement pas votre temps d'exécution, mais la requête est beaucoup plus lisible et l'utilisation de INNER JOIN est une bonne pratique.

Alors pour optimiser votre temps d'exécution, la première solution qui vient à l'esprit est de créer un index mais vous l'avez déjà testé. Il peut être utile d'essayer un index concaténé au lieu d'un index simple :

CREATE INDEX ON statusBits (typeId, bitNumber);

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X