2010-08-10 9 views
3

J'ai la déclaration SQL suivante que je dois faire plus rapidement. Il y a 500k lignes, et j'ai un index pour 'HARDWARE_ID', mais cela prend encore une seconde à effectuer.sql: comment améliorer cette déclaration

Quelqu'un a-t-il des idées?

select 
     * 
    from 
     DEVICE_MONITOR DM 
    where 
      DM.DM_ID = (
     select 
      max(DM_ID) 
     from 
      DEVICE_MONITOR 
     where 
      HARDWARE_ID=#value# 
    ) 

J'ai trouvé l'indice suivant est aussi une aide précieuse ...

CREATE INDEX DM_IX4 SUR DEVICE_MONITOR (DM_ID, HARDWARE_ID);

Dans mon test, le temps d'exécution passe de 26 secondes à 20 secondes.

Merci pour votre aide.

+0

Avez-vous également un index sur DM_ID? –

Répondre

2

L'indice pour la DM_ID devrait être créé comme asc

Le problème est peut-être dans ce que vous avez trouvé correspondance sous forme HARDWARE_ID très rapide, mais ces documents doivent Sorted chercher max d'eux et cette opération est temps consommant.

Essayez de comparer les déclarations:

1 #result = select max(DM_ID) from DEVICE_MONITOR where HARDWARE_ID=#value# 

2 select * from DEVICE_MONITOR DM where DM.DM_ID = #result 

La requête 1 est le problème, comme vous le verrez que le 2 travaille plus vite

si l'indice est créé, et la requête fonctionne toujours lentement que, vous pouvez mettre à jour les statistiques. Mais d'autres requêtes ne fonctionneront probablement que plus lentement.

Si c'est possible au lieu de * utiliser uniquement la colonne dont vous avez vraiment besoin

0

Si vous avez un index cluster sur DM_ID, cela ressemble à la requête la plus rapide.

Édition: Ack. Daniel a la bonne réponse. Manqué ça.

1

Envisagez de remplacer '*' par la liste d'attributs dont vous avez besoin. Très souvent, cela peut vous donner une augmentation substantielle de la vitesse.

+0

Tout à fait d'accord avec vous. Cela vous donnera probablement la plus grande augmentation de performance. –

Questions connexes