2016-04-22 8 views
3

Was wäre die effizienteste und eleganteste Art, den MAX-Wert aus einer transparenten Tabelle auszuwählen? Zum Beispiel versuchen wir, eine solche einfache Tabelle als T100, Nachrichten auszuwählen. Stellen wir uns vor, wir sollten innerhalb eines Anwendungsbereichs die maximale Nachrichtennummer auswählen. Wir können dies auf mehrere Arten tun.
Die naheliegendste ist MAX AggregatfunktionEffizienz des Maximalwerts SELECT aus dbtab

select MAX(msgnr) 
from t100 
where arbgb = '/ASU/GENERAL' 

mit und die andere ist mit UP TO 1 ROWS Klausel

select msgnr 
from t100 
where arbgb = '/ASU/GENERAL' 
and ROWNUM = 1 
order by msgnr DESC 

Hier oben, alle SQL-Anweisungen werden in einer nativen Oracle SQL gegeben, wie ich Tests tat in DBACOCKPIT, wo dies obligatorisch ist.

Einbau-Cockpit-Werkzeug für beiden Anfragen nahezu identische Ergebnisse zeigte:

  • geschätzt Kosten 3 für beide von ihnen sind jedoch weist zweite Abfrage nur 2 Stufen in der Draufsicht während der ersten 3 hat.
  • geschätzte CPU Kosten für die erste Abfrage ist 21,564 pro Schritt jedoch hat zweite insgesamt Kosten von 21,964.

So können wir daraus schließen, dass die zweite Variante hier effizienter ist.
Aber wäre das ein Punkt in einem allgemeinen Fall? Wäre dieses Ergebnis bei verschiedenen DB anders, oder können wir es als Faustregel behandeln?

Antwort

4

Leistungsmessungen variieren immer in Abhängigkeit von einem ziemlich großen Satz von Parametern, wobei das DBMS nicht das geringste ist. Einige DBMS können beispielsweise einen Index verwenden, um eine MAX(...)-Anweisung effizient zu bestimmen, während andere möglicherweise auf eine ineffizientere Form zurückgreifen müssen. Trauen Sie auch nicht die Vorhersagen des Optimizers - messen Sie die wirkliche Leistung. Der Optimierer könnte aus verschiedenen Gründen falsch sein (veraltete Statistiken und kaputte Indizes sind die häufigsten, soweit ich gesehen habe), und es ist wenig hilfreich, wenn der Optimierer Gesamtkosten von 12,345 schätzt, wenn der tatsächlich ist die Kosten betragen 987.654. Daher wäre meine Empfehlungen

  • nur wählen, was Sie brauchen (SELECT * zu vermeiden, verwenden WHERE vernünftig)
  • messen, messen, messen
  • der meisten der unbewiesen und angeblichen Leistung vorsichtig sein, Regeln-of- Daumen da draußen.