2009-07-04 6 views
3

Je doute de la vitesse et du résultat des requêtes ci-dessous. Quelqu'un pourrait-il me donner l'explication sur eux? (Ces requêtes écrites pour la base de données Oracle)Performance entre SELECT MAX (nom_colonne) et ROWNUM = 1

Supposons que j'ai une table table1 (ID, ID d'élément, trnx_date, balance, ...). Je veux obtenir le dernier solde d'un article.

Query 1:

équilibre SELECT FROM Table1 WHERE ID = (SELECT MAX (ID) à partir de Table1 WHERE itemID = item_id);

Requête 2:

équilibre SELECT FROM Table1 WHERE itemID = item_id ET rownum = 1 ORDER BY ID DESC;

ITEM_ID est la variable.

Ainsi, ces deux requêtes donnent-elles le même résultat? Et lequel est le plus rapide ou y a-t-il d'autres requêtes plus rapides qu'eux?

Merci

Répondre

2

Rownum dans Oracle est calculé avant le tri (mon erreur plus tôt, je n'ai pas utilisé Oracle dans un peu). Donc, cette requête est identique à la première:

SELECT 
    balance 
FROM 
    (SELECT balance FROM table1 WHERE itemID = *item_id* ORDER BY ID DESC) 
WHERE 
    rownum = 1; 

Dans ce cas, étant donné un indice sur l'identification, cela peut être un peu plus vite. Pourquoi ne les avez-vous pas exécutés vous-même pour les référencer?

+0

Merci Eric pour votre réponse, mais comme je sais, l'ordre de process de l'instruction select est FROM, WHERE, ORDER BY, puis SELECT. Ainsi, lorsque la condition est trouvée, elle arrêtera de trouver des enregistrements (à cause de ROWNUM = 1), puis triera le résultat, de sorte que le résultat ne sera pas le même. J'ai testé une autre table de données, et le résultat est différent !!! –