Frage

Für Spaß, den ich gespielt mit dem eingebauten in Optimizer für Oracle in Toad heute. Einer der Optimierungen es legt nahe, ist die folgende

AND emp.pay_type = NVL('FT', UID)

Anstelle von

AND emp.pay_type = 'FT'

Ich bin verwirrt, was hier geschieht, und weil es, verwirrt auf auch auf, warum diese Leistung verbessern würde. Da FT ein Stringliteral innerhalb der SQL-Abfrage ist und daher nie NULL, warum würde dies einen Unterschied? Ich vermute, es hat etwas mit dem bestehenden Index auf dem Feld zu tun, aber ich bin nicht imstande, alles in der Oracle-Dokumentation zu finden.

War es hilfreich?

Lösung

ist dieses seltsame Ratschläge. Die NVL-Funktion funktioniert wie folgt:

NVL(exp1, val1)

Wenn 'exp1' ist nicht null, es zurückgeführt wird; sonst 'val1' zurückgeführt wird.

Da ‚FT‘ in dem Beispiel kann nicht NULL sein, gibt es keinen Nutzen die NVL-Funktion zu verwenden, und eine kleine Leistungseinbuße (zumindest für den Optimierer zu erarbeiten, dass NVL überflüssig ist, vielleicht eine Strafe Ausführung, wenn der Optimierer nicht funktioniert, dass NVL ist redundant).

Wenn die Bedingung lesen:

UND emp.pay_type = NVL ( "FT", UID)

dann könnte es ein Vorteil sein; Hier haben wir einen begrenzten Bezeichner (Spaltenname in Anführungszeichen) und der Spaltenwert NULL vielleicht sein könnte; die NVL Aufruf stellt sicher, dass NULL zurückgegeben wird, nur wenn "FT" NULL ist und UID ist NULL. UID ist, natürlich, ein regulärer Bezeichner.

Es könnte sinnvoll sein, wenn die Bedingung zu lesen:

AND emp.pay_type = NVL(UID, 'FT')

Nun, wenn der UID-Wert NULL ist, dann wird ein Standardwert ‚FT‘ als die entsprechenden pay_type verwendet.

Andere Tipps

würde ich Kröte „Optimierungsvorschläge“ mit riesigen Salzkörner nehmen. Ich nenne sie die „Shotgun“ Methode der Optimierung - Shooting eine ganze Reihe von verschiedenen Bits auf das Ziel und sehen, welche von ihnen trifft, irgendwie:)

Wie auch immer, der Unterschied zwischen

AND emp.pay_type = NVL('FT', UID)

und

AND emp.pay_type = 'FT'

Ist das im zweiten Fall, der Optimierer die Histogramm-Statistiken über die Spalte verwenden können (wenn sie schon gesammelt worden ist), um eine genauere Schätzung der Anzahl der passenden Zeilen zu erhalten. Wenn der NVL verwendet wird, aber der Optimierer wird (glaube ich) nicht erkennen, dass sie die NVL ignorieren können, und werden daher nicht das Histogramm für den Wert überprüfen.

Dies ist keine Optimierungsmethode ich in der Regel verwenden würde. Es gibt bessere Möglichkeiten, um den Ausführungspfad eine Abfrage (Hinweise, zum Beispiel) zu steuern. Insbesondere diese Methode fehlschlagen würde, wenn sie das CBO zu suchen und zu optimieren redundanten Code wie NVL([literal value],[anything]) zu [literal value] verbessert.

Was ist Oracle Explain-Plan informieren Sie über die beiden Abfragen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top