2012-10-29 3 views
2

je les trois tableaux ci-dessous (il y a effectivement beaucoup plus de champs, mais cela devrait donner une idée de ce que je suis en train de réaliser):Accélérez Oracle requête multi-table avec clause ORDER BY

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

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

statusBits (
    typeId INTEGER, 
    bitNumber INTEGER, 
) 

La table log contient un très grand nombre d'enregistrements (500 000+), tandis que les autres tables sont assez petites. Je peux joindre les tables en utilisant 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 fonctionne bien et rapidement. Il fonctionne également rapidement lorsque j'ajoute une clause ORDER BY eventId à la fin. Cependant, quand j'ajoute ORDER BY eventId, bitNumber (triant ainsi par deux champs au lieu d'un), il devient douloureusement lent.

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

MISE À JOUR: Je l'ai déjà essayé CREATE INDEX ON statusBits(bitNumber) mais il ne semble pas avoir un grand effet.

+1

Pouvez-vous ajouter le plan d'explication pour les deux requêtes? –

Répondre

0

Tout d'abord, je refactoriser 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 

Il peut probablement pas aider pour votre temps d'exécution, mais la requête est beaucoup plus lisible et l'utilisation de INNER JOIN est une meilleure pratique. Puis, 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 indice concaténés au lieu d'un index simple:

CREATE INDEX ON statusBits (typeId, bitNumber); 

Espérons que cela aidera.