Frage

Ich renne im folgenden Szenario, das mir einiges an Kopfschmerzen gibt, da ich keine genaue Erklärung für das Verhalten finden kann, das ich sehe. Ich habe die folgende erklärt:

struct test_struct
{
    long testv1;
    char testv2[51];
    long testv3;
};

und eine entsprechende Tabelle in Oracle 10g:

CREATE TABLE test_table
(
    testv1 NUMBER(10, 0),
    testv2 VARCHAR(50),
    testv3 NUMBER(4, 0)
);

Um auf Daten in dieser Tabelle zuzugreifen, habe ich eine Funktion:

bool getTestData(long test_var1, struct test_struct *outStruct)

Und hier sehe ich die Unterschiede, die ich erklären muss, aber nicht. Wenn der Körper der Funktion so aussieht:

EXEC SQL BEGIN DECLARE SECTION;
    long testvar1_param = test_var1;
    struct test_struct *resStruct = outStruct;
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT testv1, testv2, testv3
    INTO :resStruct
    FROM test_table
    WHERE testv1 = :testvar1_param;

Ich bekomme langsamere Leistung dann, wenn der Körper der Funktion aussieht:

EXEC SQL BEGIN DECLARE SECTION;
    long testvar1_param = test_var1;
    long *testv1_res = &(outStruct->testv1);
    char *testv2_res = outStruct->testv2;
    long *testv3_res = &(outStruct->testv3);
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT testv1, testv2, testv3
    INTO :testv1_res, :testv2_res, :testv3_res
    FROM test_table
    WHERE testv1 = :testvar1_param;

Die Leistung in der zweiten unterscheidet sich um einen signifikanten Spielraum.

Weiß jemand, was dieses Verhalten erklären könnte?

War es hilfreich?

Lösung

Für Leistungsprobleme, die auf den ersten Blick unerklärlich aussehen: Schalten Sie die SQL -Verfolgung einschließlich Waits ein.

ALTER SESSION SET TRACEFILE_IDENTIFIER = "some_unique_identifier";
dbms_support.start_trace (binds=>true,waits=>true);

Führen Sie Ihren Code aus, lassen Sie ihn festlegen und trennen Sie die Verbindung anmutig. Verwenden Sie nicht dbms_support.stop_trace, da es möglicherweise das Spulen der Rowsource -Operationen verhindern kann. In der generierten TraceFile finden Sie den genauen SQL -Text, da er analysiert wird, Warteveranstaltungen, die sich auf die SQL und die Rowsource -Operationen auswirken. Die Rowsource -Operationen zeigen, wie genau der SQL -Plan beim Ausführen der SQL aussah.

  • Überprüfen Sie die Anzahl der Parsen
  • Überprüfen Sie, ob Bind -Variablen verwendet werden oder nicht.
  • Überprüfen Sie die Rowsource -Operationen für den erwarteten Plan.

Für Ihr Problem - ich musste zufällig viele Reihen nacheinander holen - ich erwarte zu finden

  • 1 Cursorerklärung
  • 1 analysieren
  • Eine Schleife, die den Cursor öffnet/abbricht/schließt

Es ist sehr wichtig, dass diese Szenarien nicht jede Auswahl analysieren. Das Parsen kann mehr Zeit dauern als die Ausführung.

Eine Frage, die bleibt, ist: Warum alle Zeilen nacheinander bekommen? Ist das eine Art Datenkopieroperation?

Andere Tipps

Berücksichtigen Sie die Auswirkung des Caching? Ich nehme nicht an.

Wenn Sie den ersten Abfrage -zeitgesteuert ausführen, führen Sie den zweiten Abfragesteuer mit, wobei der testvar1_param -Wert gleich ist, die zweite ist in deutlich unterschiedlicher Zeit abgeschlossen. Es ist keine Rolle, welche Abfrage zuerst ausgeführt wird, die zweite Version wird besser abschneiden.

Dies liegt daran, dass das Woher -Prädikat in beiden Abfragen gleich ist und die Daten im Ergebnis in beiden Abfragen gleich sind. Normalerweise laufen nachfolgende Abfragen identische Abfragen viel schneller, wenn Sie gegen eine indizierte Abfrage antreten, da Sie nie in die Tabelle gehen, um das Ergebnis zu erhalten. Sie stammt von der SGA, in der es zwischengespeichert wird.

Versuchen Sie, verschiedene Werte für testvar1_param zu verwenden, und führen Sie jeweils 10 Abfragen mit völlig unterschiedlichen PARM -Werten aus. Sie werden rechtzeitig sehr nahe sein.

Sie verwenden TkProf, oder?

Mit Timing meine ich (da es Entwicklung ist, oder?)

ALTER SYSTEM SET TIMED_STATISTICS = TRUE;

Dies verbessert das, was Oracle Ihnen in der Verfolgung für die Leistung gibt.

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