Die 15 besten Tipps zur Optimierung der Oracle APEX-Leistung für Entwickler

Hot Habra Hallo allerseits!

Heute ist unser Unternehmen 28 Jahre alt und zu Ehren dieser angenehmen Veranstaltung haben wir beschlossen, neues Material mit Ihnen zu teilen.

Vielen Dank für Ihre Hilfe bei der Übersetzung unseres regulären Autors Yuri PonomarevOBIEESupport.

Die Autorin des Artikels ist Michelle Scamin, die Gründerin und geschäftsführende Gesellschafterin des Unternehmens, das den Reading Rewards-Service anbietet. Im Jahr 2009 litt Michelle unter der Tatsache, dass ihre Söhne, 8 und 9 Jahre alt, zu wenig lesen. Bücher konnten einfach nicht mit Computern und Videospielen mithalten, deshalb beschlossen Michelle und ihr Mann, ein System zu entwickeln, in dem Kinder durch das Lesen von Büchern Zeit mit Computerspielen verdienten.

Als IT-Beraterin und Webanwendungsentwicklerin hat Michelle eine Software entwickelt, mit der Kinder die Zeit, die sie lesen und fernsehen, aufzeichnen und Eltern diese Zeit verfolgen können. Dies war der Beginn des Reading Rewards-Dienstes.

Und jetzt tatsächlich ein Artikel.



Sie haben sich also für eine erstaunliche Oracle APEX-Anwendung für die Rekordgeschwindigkeit entschieden - Sie müssen nicht viel schreiben. Und wie das alte Sprichwort sagt, was zu sein ist - das kann nicht vermieden werden!

2010 habe ich eine Anwendung erstellt , um meine beiden kleinen Söhne zum Lesen zu bringen. Ich gebe zu, zu dieser Zeit habe ich nicht über Leistung nachgedacht, und es gab ein paar saftige „Select Count (*) from Riant Table“, die strategisch über den gesamten Code verteilt waren.

Hey, meine Jungs haben nicht wirklich so viel gelesen, also waren diese Tabellen zu der Zeit ziemlich klein ...

Sagen wir einfach, ich war ziemlich naiv, als ich die App für die Öffentlichkeit veröffentlichte, und ich hatte nicht erwartet, dass sie geladen wird Täglich Tausende von Benutzern, die täglich 150.000 Seitenaufrufe generieren.


Statistiken von Google Analytics

Abgesehen von der Tatsache, dass all dieses Interesse für mich sehr aufregend war, war ich für so viele Klicks überhaupt nicht bereit. Ich hatte Leistungsprobleme. Sie müssen nur zugeben, dass ich ein begeisterter Schüler der Oracle APEX-Leistungsoptimierung geworden bin und dachte, ich würde nur einige der Dinge teilen, die ich im Laufe der Jahre gelernt habe.

Wie erkenne ich einen Engpass?


Es gibt viele Dinge, auf die Sie bei der Bewertung der Leistung Ihrer Anwendung achten sollten. Sie sollten die damit verbundenen Probleme, den Browser, berücksichtigen. Netzwerkprobleme. ORDS-Konfiguration. Datenbankkonfiguration, einschließlich möglicher fehlender Indizes. Gibt es Datenbanksperren im Spiel? Erwartungen?

Sobald Sie das Gefühl haben, dass Ihre zugrunde liegende Infrastruktur in einem guten Zustand ist und keine Fehler aufweist, ist es möglicherweise an der Zeit, Ihre Aufmerksamkeit auf die Anwendung selbst zu lenken und dabei Ihr Frontend (Javascript und CSS) und Backend (SQL und PL / SQL) zu berücksichtigen.

1. Frontend: Die Reihenfolge der Dateien ist wichtig


Wenn Sie benutzerdefinierte CSS- und JS-Komponenten einschließen, stellen Sie zunächst sicher, dass sich Ihr CSS oben auf der Seite und JavaScript unten befindet .

Dies stellt sicher, dass Ihre Benutzer zumindest die Komponenten der Benutzeroberfläche erhalten, auch wenn einige Geschäftslogikdateien noch nicht geladen sind.

2. Aktivitätsmonitor anzeigen


Dies ist immer ein großartiger Ort, um loszulegen. Wenn alles langsam erscheint und Sie nicht wissen, wo Sie suchen sollen, kann der Aktivitätsmonitor in der APEX-Entwicklungsumgebung wertvolle Informationen liefern.


Verknüpfung mit dem Aktivitätsmonitor über die APEX-Entwicklungskonsole

Jeder Seitenaufruf in Ihrem Arbeitsbereich und in Ihren Anwendungen wird protokolliert, einschließlich Informationen zum Benutzer, Datums- / Zeitstempel, Anwendung, Seiten-ID und vor allem zum Zeitpunkt der Ausführung der Anwendung.

Mein bevorzugter Seitenaufrufbericht lautet "Nach gewichteter Seitenleistung".




Beispiel vom APEX-Aktivitätsmonitor anzeigen

Achten Sie genau auf Seiten mit einer großen Anzahl von Seitenereignissen (dh häufig besuchten Seiten) und einem hohen Wert der durchschnittlichen Anwendungslaufzeit. Ich scheine mich zu erinnern, wie Joel Kalman einmal gesagt hat, dass alles über 0,5 Sekunden überprüft werden sollte. Dies ist natürlich eine ziemlich grobe Verallgemeinerung und kann sich (nicht) auf Ihren speziellen Fall der Verwendung von APEX beziehen.

Der Aktivitätsmonitor erleichtert die Arbeit mit IR. Wenn Sie jedoch etwas mehr Details benötigen und Berichte in verschiedenen Arbeitsbereichen ausführen möchten, können Sie die folgende Abfrage in SQL Developer verwenden, um sie so detailliert wie möglich zu gestalten:

select workspace
      , application_name 
      , application_id, page_id
      , count(*) total_page_events
      , avg(elapsed_time) avg_elapsed_time
      , sum(elapsed_time) elapsed_time
from apex_workspace_activity_log
where view_date between to_date('201911190900','RRRRMMDDHH24MISS') and to_date('201911191200','RRRRMMDDHH24MISS')
group by workspace, application_name, application_id, page_id
order by 6, 7 asc 

3. # TIMING # Suchvariable


Möglicherweise haben Sie eine langsame Seite gefunden. Und was jetzt?

Nun, Sie können die Suchvariable # TIMING # in der Fußzeile Ihrer Berichtsregionen verwenden, wenn Sie deren verstrichene Zeit abrufen und anzeigen möchten. Auf diese Weise können Sie die langsamsten Bereiche des Berichts auf der Seite identifizieren, auf die Sie Ihre Aufmerksamkeit richten können. Dies ist besonders nützlich auf Dashboard-Seiten, auf denen Sie viel arbeiten können.


Verwenden der Ersetzungszeile # TIMING # in der Fußzeile des Berichts Wenn Sie den Bericht ausführen

, erhalten Sie das Ergebnis:



Eine Sache, die mir an dieser Funktion gefällt, ist nicht unbedingt, dass sie bestimmt, welche Regionen viel Zeit zum Ausführen benötigen (ich könnte dies von meinem bekommen Debug-Fenster, siehe unten), bietet jedoch Informationen für Endbenutzer.

Oft stelle ich fest, dass sie Daten anfordern, von denen ich weiß, dass sie für Ewigkeiten visualisiert werden. Zumindest gibt es ihnen eine Vorstellung davon, was passieren könnte und warum sie etwas länger als erwartet auf ihre Seite warten mussten.

4. Führen Sie die Seite im Debug-Modus aus


Besser noch, führen Sie es in Debug LEVEL9 aus, um auf den Ausführungsplan für Ihren Bericht zuzugreifen.


Das Debug-Fenster zeigt Ihnen alles, was auf Ihrer Seite passiert, und die Laufzeit für jede Komponente. LEVEL9 generiert Tonnen von Zeilen, aber Sie können sie in absteigender Reihenfolge sortieren, um anzuzeigen, dass das Rendern Ihrer Seite die meiste Zeit in Anspruch nimmt.

5. Hüten Sie sich davor, v (”) aufzurufen.


Wenn Sie einen Bericht mit schlechter Leistung finden, können Sie überprüfen, ob Sie die v (”) - Notation verwendet haben, wenn Sie die Bindungsvariable verwenden könnten.

select task_name
from tasks
where assigned_to=:APP_USER

oder

select task_name
from tasks
where assigned_to=v('APP_USER')

In einer großen Tabelle kann der Unterschied zwischen den beiden Anweisungen sehr groß sein, da v (”) tatsächlich ein Funktionsaufruf ist. Dies bedeutet, dass Sie keine Indizes nutzen und die Abfrage zu einem vollständigen Tabellenscan führt.

Tipp: Wenn Sie den Status einer APEX-Sitzung in einer Ansicht referenzieren müssen (in der Sie keine Bindungsvariablen verwenden können), sollten Sie eine skalare Unterabfrage verwenden, die fast genauso gut funktioniert wie Ihre Bindungsvariable. Sehen:

select task_name
from tasks
where assigned_to = (select v('APP_USER') from dual)

Vielen Dank an John Scott, der dies bei einer der Veranstaltungen angeboten hat, an denen ich teilgenommen habe.

6. Vermeiden Sie nach Möglichkeit das Ersetzen von Zeichenfolgen in Abfragen


Achten Sie bei Suchanfragen auf Suchzeichenfolgen.

Stellen Sie sich beispielsweise eine Situation vor, in der Sie möglicherweise eine Dekodierungs- oder case-Anweisung in einer Abfrage benötigen, um zu bestimmen, zu welcher Seite Sie verzweigen möchten:

select case when dept_no=20 then
          'f?p=&APP_ID.:3:&SESSION.::::P3_DEPTNO:'||deptno
       else
          'f?p=&APP_ID.:2:&SESSION.::::P2_DEPTNO:'||deptno
       end as link
       , deptno
       , dname
from dept

Verwenden der Bindungsvariablen: SESSION, nicht die Suchzeichenfolge & SESSION. kann einen großen Unterschied machen und Oracle viel Zeit beim Parsen sparen. Mit der Version der Bindungsvariablen kann Oracle die Abfrage wiederverwenden.

select case when dept_no=20 then
          'f?p=&APP_ID.:3:'|| :SESSION ||'::::P3_DEPTNO:'||deptno
       else
          'f?p=&APP_ID.:2:'|| :SESSION ||'::::P2_DEPTNO:'||deptno
       end as link
       , deptno
       , dname
from dept

Wenn Sie mehr darüber erfahren möchten , schauen Sie sich das wundervolle Video von Jorge Rimblas über Platzhalterzeichenfolgen, Bindungsvariablen und APEX-Links an.

7. Verwenden Sie nach Möglichkeit deklarative Parameter in Ihren Bedingungen


Verwenden Sie bei Verwendung von Bedingungen für Seitenkomponenten nach Möglichkeit immer deklarative Parameter. Sie werden viel effektiver sein.


8. Verwenden Sie die Paginierungseinstellungen rational


In großen Berichten können die ausgewählten Paginierungsoptionen erhebliche Auswirkungen haben. Trotz der Tatsache, dass APEX in Version 18.1 die Paginierungsverarbeitung erheblich verbessert hat (lesen Sie diesen wunderbaren Beitrag von Karsten Charsky), können Sie den Parameter „Zeilenbereich von X bis Y von Z“ in einem von ihnen deaktivieren, wenn Sie Leistungsprobleme haben in einem sehr großen Bericht.


9. Vermeiden Sie HTML in Abfragen und verwenden Sie einen HTML-Ausdruck


Verwenden Sie nach Möglichkeit das HTML-Ausdrucksattribut für die Berichtsspalten, um alle erforderlichen HTML / CSS-Attribute einzuschließen.

10.


So haben Sie einen sehr langsamen Berichtsbereich identifiziert, den Sie so gut wie möglich konfiguriert haben.

Muss ich die Daten jedes Mal aktualisieren, wenn ich die Seite ansehe? Denken Sie an Dashboard-Berichte, insbesondere Verkaufsdaten usw. Selbst die vor 1 Minute empfangenen Transaktionsdaten können in vielen Fällen vollständig sein.

In diesem Fall können Sie die Option zum Zwischenspeichern von Regionen verwenden.



Server-Cache-Einstellungen in APEX-Regionen.

Standardmäßig ist das Caching deaktiviert. Wenn Sie es jedoch aktivieren, können Sie die Option für das Cache-Timeout auswählen, die mit nur 10 Sekunden beginnt. Schon 10 Sekunden verbessern die Leistung des Dashboards, das von einer großen Anzahl von Benutzern verwendet wird! Und es ist offensichtlich, dass das Erhöhen dieses Parameters noch mehr hilft.

Achtung, wenn Sie vertrauliche Daten haben, die vom Benutzer abhängen, können Sie die Optionen "Cache nach Benutzer" oder sogar "Cache nach Sitzung" auswählen.


Verfügbare Einstellungen beim Aktivieren des regionalen Cachings

Wenn Sie das Caching aktivieren möchten, können Sie Ihre Benutzer über die neueste Datenaktualisierung informieren. In diesem Fall können Sie die Funktion APEX_UTIL.CACHE_GET_DATE_OF_REGION_CACHE verwenden .

11. Verschieben Sie PL / SQL in Pakete


Stellen Sie sicher, dass Sie den Code in Pakete verschieben. Sie sind bereits in der Datenbank kompiliert, was bedeutet, dass für die dynamische Analyse weniger Aufwand anfällt.

Ihre Seitenprozesse sollten nach Möglichkeit nur Paketaufrufe sein.

Stephen Feuerstein hat einen sehr detaillierten Artikel über das Schreiben von PL / SQL für Oracle Application Express geschrieben , den Sie vielleicht lesen möchten. Sie ist schon einige Jahre alt, aber sie ist immer noch relevant!

12. Starten Sie Advisor!


Ich sehe selten Leute, die diese großartige Funktion verwenden, aber das sollten wir alle regelmäßig tun. Jedes Mal frage ich mich, was er sonst noch findet.


13. Verwenden Sie Build-Optionen, um Komponenten zu deaktivieren und zu aktivieren


Nun, Sie haben ALLE DIESEN DINGE ausprobiert, aber es ist immer noch nicht klar, worauf es ankommt. Wenn Sie Ihre Seite erneut zeichnen möchten, sollten Sie die Erstellungsoptionen für die verschiedenen Komponenten Ihrer Seite in Betracht ziehen.

Stellen Sie keine unbestimmten Bedingungen auf die Komponenten, sonst verlieren Sie alle Ihre wertvollen Bedingungen! Darüber hinaus haben ewige Komponenten die unangenehme Eigenschaft, für immer in Ihren Anwendungen zu leben ...

Erstellen Sie einen neuen Build-Parameter mit Status: Ausschließen.

Wenden Sie es abwechselnd auf die verschiedenen Komponenten Ihrer Seite an. Beginnen Sie Ihre Seite mit jeder Änderung und prüfen Sie, ob sie besser funktioniert. Wenn Ihre Seite plötzlich schneller läuft, haben Sie möglicherweise die Schuldigen gefunden.

14. Verstehen Sie, wie verschiedene IR-Einstellungen die APEX-Leistung beeinflussen können.


Mit einem schlecht ausgeführten interaktiven Bericht können verschiedene Einstellungen, Parameter oder Filter, die von Ihren Benutzern angewendet werden, schlechte Arbeit verschlimmern (ja, das ist es wirklich).

Wie bereits erwähnt, verwenden Sie am besten zunächst den LEVEL9-Debugging-Modus und konfigurieren Sie eine separate echte Abfrage. Untersuchen Sie den Ausführungsplan, überprüfen Sie die Indizes und stimmen Sie ihn nach Möglichkeit ab. Denken Sie daran, dass jede Ansicht (Tabelle, Gruppierung, Diagramm, Zusammenfassung) eine separate Abfrage ist, die möglicherweise angepasst werden muss. Dann ändert es sich wieder, wenn Sie den Suchfilter oder den Spaltenüberschriftenfilter verwenden!

Ihre MaxRowCount-Einstellung kommt ebenfalls ins Spiel, und Sie sollten versuchen, sie so klein wie möglich zu halten. Es gibt keine richtige Antwort darauf, und Sie müssen möglicherweise mit verschiedenen Zahlen spielen, bevor Sie etwas erhalten, das für Ihre Benutzer funktioniert.

Grundsätzlich sollten Sie einige Standardverhaltensszenarien löschen oder ändern. Entwickler haben viele Steuerelemente, wenn es darum geht, welche Funktionen für Benutzer aktiviert sind. Es lohnt sich, verschiedene Einstellungen auszuprobieren, und vergessen Sie nicht, Ihre Benutzer zu konsultieren, um sicherzustellen, dass Sie deren Anforderungen vollständig verstehen.

Wenn Sie feststellen, dass Ihre IR immer noch zu langsam ist, können Sie zwei Alternativen in Betracht ziehen:

  1. Pipeline-Tabellenfunktionen (wählen Sie * aus der Tabelle (my_rpt_pipelined)) -> Sie können in komplexen Abfragen viel besser funktionieren.
  2. Sammlungsbericht erstellen (APEX_COLLECTION)

Vielen Dank an Karen Cannell für diese super nützlichen IR-Tipps.

15. Trace


Wenn alles andere fehlschlägt, können Sie am Ende Ihrer URL "& p_trace = YES" hinzufügen, um eine Tracedatei zu erstellen, die Sie mit dem Dienstprogramm TKPROF analysieren können.

Weitere Informationen zur SQL-Ablaufverfolgung finden Sie hier .

Immer noch stecken? Ich bin immer wieder erstaunt über die Reaktionsfähigkeit der Oracle APEX-Community . Helfen Sie mit, bitten Sie in verschiedenen Foren oder auf Twitter um Hilfe, jemand wird Sie auf jeden Fall in die richtige Richtung weisen. Ich habe unzählige Antworten auf Hilferufe erhalten. Sie finden die Antwort! Denken Sie daran: Dies ist nicht APEX, es sind meistens Sie, Sie selbst :-)

All Articles