Frage

Ich versuche, die Leistung einer Abfrage zu verstehen, dass ich in Oracle geschrieben habe. Zu diesem Zeitpunkt habe ich nur Zugriff auf sqldeveloper und seine Ausführung Timer. Ich kann SHOW PLAN laufen, kann aber nicht die Auto-Trace-Funktion verwenden.

Die Abfrage, dass ich läuft in etwa 1,8 Sekunden geschrieben habe, wenn ich drücke "execute query" (F9) in sqldeveloper. Ich weiß, dass dies nur die ersten fünfzig Zeilen standardmäßig zu holen, aber ich kann zumindest sicher sein, dass die 1,8 Sekunden die Gesamtausführungszeit plus die Zeit umfassen die ersten 50 Zeilen zu meinem Klienten?

liefern

Wenn ich diese Abfrage in einer gespeicherten Prozedur wickeln (die Ergebnisse über einen OUT REF CURSOR Rückkehr) und versuchen Sie es von einer externen Anwendung zu verwenden (SQL Server Reporting Services), dauert die Abfrage über eine Minute zu laufen. Ich erhalte eine ähnliche Leistung, wenn ich "run script" (F5) in sqldeveloper drücken. Es scheint, dass der Unterschied hier ist, dass in diesen beiden Szenarien, Oracle alle Zeilen zurück zu übertragen hat, anstatt die ersten 50. Dies führt mich zu glauben, dass es einige Netzwerkverbindungsprobleme zwischen dem Client-PC und Oracle-Instanz.

Meine Abfrage nur Renditen über 8000 Zeilen so dass diese Leistung überraschend. Um zu versuchen, meine Theorie zu beweisen oben über die Latenz, lief ich einige Codes wie dies in sqldeveloper:

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

... Und diese läuft in etwa zwei Sekunden. Auch hier zeigen sich sqldeveloper Hinrichtung Uhr genau die Ausführungszeit der Abfrage? Oder bin ich etwas fehlt und ist es möglich, dass es in der Tat ist meine Abfrage, die Abstimmung braucht?

Kann jemand bitte bieten Sie mir jede Einsicht auf diese auf der Grundlage der begrenzten Werkzeuge, die ich zur Verfügung haben? Oder soll ich versuchen, das DBA beinhalten eine weitere Analyse zu tun?

War es hilfreich?

Lösung

  

"Ich weiß, dass dies nur die Holen ist   ersten fünfzig Zeilen standardmäßig, aber ich kann   zumindest sicher sein, dass die 1,8   Sekunden umfasst die Gesamt   Ausführungszeit plus die Zeit zu   liefern die ersten 50 Reihen meiner   Kunde? "

Nein, es ist die Zeit, die ersten 50 Reihen zurückzukehren. Es muss nicht unbedingt erforderlich, dass die Datenbank die gesamte Ergebnismenge ermittelt hat.

Denken Sie an die Tabelle als eine Enzyklopädie. Wenn Sie eine Liste von Tieren, die mit Namen beginnend mit ‚A‘ oder ‚Z‘ wollen, erhalten Sie wahrscheinlich Erdferkel und Alligatoren ziemlich schnell. Es wird viel länger dauern Zebras zu erhalten, wie Sie das ganze Buch lesen müsste. Wenn Ihre Abfrage eines vollständigen Tabellenscan zu tun, wird es nicht vollständig, bis sie die gesamte Tabelle (oder Buch) gelesen haben, auch wenn es nichts gibt, in nichts nach dem ersten Kapitel abgeholt werden (weil es dort nicht wissen nichts wichtiges drin ist, bis er es gelesen hat).

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

Dieses Stück Code tut nichts. Genauer gesagt, es wird die Abfrage, um festzustellen, dass die notwendigen Tabellen, Spalten und Privilegien sind vorhanden analysieren. Es wird nicht die Abfrage tatsächlich ausführen oder bestimmen, ob alle Zeilen, die die Filterkriterien erfüllen.

Wenn die Abfrage nur 8000 Zeilen zurückgibt, ist es unwahrscheinlich, dass das Netzwerk ein schwerwiegendes Problem ist (es sei denn, sie sind sehr große Reihen sind).

Fragen Sie Ihren DBA für eine kurze Einführung in die Leistungsoptimierung.

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