Zum Inhalt springen

Leistungsdebugging und -verbesserung im Jitterbit App Builder

Chrome Entwickler

Chrome DevTools ist eine Reihe von Entwickler Tools, die direkt in den Google Chrome-Browser integriert sind. Mit den DevTools von Chrome können Sie Probleme diagnostizieren in App Builder bei Anfragen, die nicht beantwortet oder richtig behandelt werden, zeichnen Sie eine HAR-Datei auf, die zur weiteren Fehlerbehebung verwendet wird, und helfen Sie dabei, Probleme mit Seitenladezeiten zu lokalisieren.

Chrome DevTools bietet Ihnen außerdem Tools zum Aufnehmen von Screenshots, zum Emulieren der Erfahrung eines mobilen Benutzers und zum Analysieren der von der Seite gestellten Anfragen während des Ladens, um bestimmte Bereiche zu identifizieren, die sich auf die Seitenladezeit auswirken.

Notiz

So laden Sie Google Chrome herunter: https://www.google.com/chrome/

Identifizieren von HTTP-Fehlercodes mit Chrome

Mit den Chrome DevTools können Sie HTTP-Fehlercodes schnell anzeigen und filtern, um einen Fehler zu isolieren und zu identifizieren. an App Builder App-Anforderung, die nicht beantwortet oder richtig verarbeitet wird. HTTP-Antwortstatuscodes geben an, ob eine bestimmte HTTP-Anforderung erfolgreich abgeschlossen wurde.

Auf der Tab Netzwerk von Chrome DevTools können Sie die resultierenden Informationen schnell filtern, indem Sie auf die Spaltenüberschriften klicken. Hier können Sie auf Status klicken, um HTTP-Codeergebnisse anzuzeigen und alle Aufgaben zu identifizieren, die kein 200 OK-Ergebnis zurückgeben.

Chromenetworktab

Im Screenshot-Beispiel auf der Tab „Netzwerk“ von Chrome DevTools sehen wir, dass die App-Seite die Fehlermeldungen 500 Internal Server Error und 504 Gateway Timeout ausgibt. Informationen in der Spalte „Name“ dieses Ergebnisses helfen zu definieren, wo in App Builder dieser Fehler wird ausgelöst.

Hier ist eine Liste der häufigsten HTTP-Fehlercode-Ergebnisse:

  • 301 Dauerhaft verschoben
  • 302 Gefunden
  • 307 Temporäre Umleitung
  • 308 Permanente Umleitung
  • 400 Ungültige Anfrage = Client-Fehler
  • 401 Nicht autorisiert = Client-Fehler
  • 403 Verboten = Client-Fehler
  • 404 Nicht gefunden = Client-Fehler
  • 405 Methode nicht zulässig = Client-Fehler
  • 500 Interner Serverfehler = Server-Fehler
  • 502 Ungültiges Gateway = Server-Fehler
  • 503 Dienst nicht verfügbar = Server-Fehler
  • 504 Gateway-Timeout = Server-Fehler

Notiz

Weitere HTTP-Fehlercodes finden Sie unter: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Generieren einer Har-Datei mit Chrome

Bei der Fehlerbehebung komplexer App Builder Probleme kann es hilfreich sein, eine HAR-Datei aufzuzeichnen und von den Chrome Web Developer Tools generieren zu lassen, bzw. an App Builder Entwickler zur weiteren fehlerbehebung. Eine HAR-Datei erfasst ein Protokoll der Netzwerkanforderungen und -aktivitäten zum Zeitpunkt des Auftretens des betreffenden Problems. Genauer gesagt ist eine HAR ein JSON-formatiertes Archivdateiformat zum Protokollieren der Interaktion eines Webbrowsers mit einer Site.

So generieren Sie eine Har-Datei:

  1. Öffnen Sie Google Chrome und gehen Sie zu App Builder Seite, auf der das Problem auftritt
  2. Wählen Sie in der Chrome-Menüleiste Ansicht > Entwickler > Entwicklertools
  3. Wählen Sie im Fenster unten auf Ihrem Bildschirm die Tab Netzwerk
  4. Suchen Sie in der oberen linken Ecke der Tab „Netzwerk“ nach einer runden roten Aufnahmeschaltfläche und stellen Sie sicher, dass sie rot ist. Wenn sie grau ist, klicken Sie einmal darauf, um die Aufnahme zu starten.
  5. Aktivieren Sie das Kontrollkästchen neben Protokoll beibehalten
  6. Klicken Sie auf die Schaltfläche Löschen, um alle vorhandenen Protokolle aus der Tab Netzwerk zu löschen
  7. Versuchen Sie nun, das zuvor aufgetretene Problem zu reproduzieren, während die Netzwerkanforderungen aufgezeichnet werden

    Har

  8. Sobald Sie das Problem reproduziert haben, klicken Sie mit der rechten Maustaste auf das Raster der Netzwerkanforderungen, wählen Sie Als HAR mit Inhalt speichern und speichern Sie die Datei auf Ihrem Computer

Weitere Informationen: Siehe „Erste Schritte mit der Analyse der Netzwerkleistung in Chrome DevTools“ https://developers.google.com/web/tools/chrome-devtools/network-performance/

Identifizieren von Leistungsproblemen mit Chrome

Chrome DevTools Tools können helfen, Leistungsprobleme in Ihrem App Builder App. Wenn Sie zuerst zu der Seite navigieren, auf der Sie ein Leistungsproblem haben, können Sie die DevTools öffnen und einen Blick auf die Tab Netzwerk werfen und nach der Spalte Zeit sortieren. Sortieren Sie, damit Sie sehen können, welche Anfragen am längsten dauern. Die entsprechenden Spalten Name und Initiator geben Ihnen zusätzliche Informationen über die Anfrage, die von der App Builder App.

Beachten Sie: Wenn Sie in den Ergebnissen der Tab „Netzwerk“ feststellen, dass Anfragen mit dem Namen Filter? den Großteil der Seitenladezeit in Anspruch nehmen, müssen Sie wahrscheinlich das entsprechende Geschäftsobjekt optimieren.

Geschäftsobjekte (oder Datenobjekte) können eine Ursache für langsame Seitenladezeiten sein. Wenn Sie feststellen, dass eine länger andauernde Anfrage von einem Geschäftsobjekt stammt, lesen Sie bitte den nächsten Abschnitt, in dem die Gründe für die Langsamkeit eines Datenobjekts und Möglichkeiten zur Verbesserung der Geschwindigkeit beschrieben werden.

Gründe, warum ein Geschäftsobjekt langsam ist und Möglichkeiten zur Verbesserung der Geschwindigkeit

Je nach Konfiguration können Business-Objekte (auch Datenobjekte genannt) eine Ursache für App Builder Leistungsprobleme oder Langsamkeit der App. Bestimmte Gründe, warum ein Business-Objekt langsam sein könnte, sind:

  • SQL-Logik enthält viele Unterabfragen
  • In der Logik werden nicht benötigte Spalten verwendet
  • Where-Klauseln verwenden keine indexfreundlichen Anweisungen
  • Indizes sind nicht für eine Tabelle definiert, die ein Datenobjekt verwendet
  • Redundante Indizes für Tabellen, auf die von der SQL-Logik verwiesen wird
  • Verknüpfung berechneter Spalten
  • Die Indexverwendung kann aufgrund von Logik, die durch Funktionen läuft, verloren gehen
  • Binärfeld ist enthalten, wenn das Binärfeld nicht von einem Panel verwendet wird
    • Binärfeld(er) nur dann in Business-Objekte aufnehmen, wenn es als Dateisteuerung verwendet wird
    • Es lohnt sich, Business-Objekte speziell für die Verwendung auf Panels zu erstellen, auf denen eine Datei hoch-/heruntergeladen wird
  • Alle Spalten in einem Business-Objekt werden geladen von App Builder für die folgenden Bedingungen:
    • Bedingte Formatierung vorhanden
    • Wenn für ein Feld die Unterstützung für Ersetzungen aktiviert ist
    • Wenn ein Panel nicht statische Sichtbarkeitsregeln hat

Business Objects können bei App-Seiten immer noch zu langsamen Ladezeiten führen, selbst wenn die resultierenden Business Object-„Ergebnisse“ schnell geladen werden. Prüfen Sie, ob es Dinge auf Ihrer App-Seite gibt, die die Geschwindigkeit beeinträchtigen, wie z. B. Sortierung, Listenfelder oder andere UI-Layer-Einstellungen, die zu langsameren Seitenladezeiten führen können.

Vereinfachen von SQL-Abfragen

Wenn Sie festgestellt haben, dass ein bestimmtes Geschäftsobjekt Leistungsprobleme verursacht, besteht möglicherweise die Möglichkeit, die SQL-Logik zu verbessern und die Abfrage ggf. zu vereinfachen.

  • In den meisten Fällen sollten Sie Unterabfragen wiederverwenden
  • Manchmal kann eine Abfrage mit verschachtelten Unterabfragen so groß werden, dass sie langsam ausgeführt wird - nur dann sollte sie überprüft und neu geschrieben werden
  • Das Abflachen der Abfrage (Entfernen unnötiger Unterabfragen) verbessert normalerweise die Leistung
  • Kann Ausführungsplan und Indizes untersuchen

Entfernen nicht verwendeter Spalten

Abfragen mit Leistungsproblemen verwenden häufig unnötige Spalten in der SQL-Logik.

  • Häufig stellen wir fest, dass Abfragen mit Leistungsproblemen Unterabfragen haben, die viel mehr Daten auswählen, als von der äußeren Abfrage verwendet werden
  • Das Entfernen dieser Spalten (insbesondere berechneter Spalten) verbessert die Leistung
  • Verwenden Sie die Kopierregel und nehmen Sie Änderungen vor
  • Zeit, die zum Zurückgeben der „Ergebnisse“ benötigt wird. Zeit auch, die zum Zurückgeben der „Weitere Zeilen laden“-Meldung benötigt wird.

Indexfreundliche Anweisungen in WHERE-Klauseln

Die Where-Klausel definiert die Suchbedingung einer SQL-Anweisung und fällt damit in den Kernfunktionsbereich eines Index: das schnelle Auffinden von Daten. Eine schlecht geschriebene Where-Klausel ist häufig der Grund für eine langsame Ausführung einer SQL- Abfrage. Eine Where-Klausel sollte effizient sein und die richtigen Indizes enthalten.

Schlecht (Indizes werden nicht verwendet):

  • Wobei LOWER(Vorname) wie '%Bob%
  • Wobei NOW() > DATEADD(Minuten,60,Startzeit)

Gut (verwendete Indizes):

  • Wobei Vorname wie ‚Bob%‘ ist
  • Wobei DateAdd(Minuten,-60,JETZT()) > StartZeit

SQL Server verfügt über Dienstprogramme für den Ablaufverfolgungsmodus und Abfrage, die Sie ausführen können, um zu sehen, ob Indizes verwendet werden.

Einstellungen zur Leistungsverbesserung

In diesem Abschnitt werden die Einstellungen in App Builder die die Leistung beeinträchtigen. Vermeiden Sie Suchen/Filtern/Sortieren in Spalten in großen Tabellen, die nicht indiziert sind - wenn langsame Abfragen erkannt werden und Indizes keine Option sind.

Auf Panel-Ebene kann das Aktivieren von Download unterstützen und die Aktivierung der einfachen Suche sowie die Konfiguration als „Nur indiziert“ zur Leistungssteigerung beitragen.

Hinweis

Bei der Suche in indexierten Feldern App Builder generiert indexfreundliche Abfragen:

…FirstName like 'Bob%'…
Will match: "Bob Smith"
Will not match: "Mr Bobert"

Indizes und was indiziert werden soll

In SQL wird ein Index verwendet, um die Leistung von Abfragen zu beschleunigen, indem er dabei hilft, Ihre Daten schneller vom SQL Server abzurufen. Dies wird erreicht, indem die Anzahl der Datenbankdatenseiten reduziert wird, die besucht/gescannt werden müssen. Wenn man über Indizes in nachdenkt App Builder Datenobjekte: Sie benötigen genügend Indizes, um Ihre SELECT-Abfragen zu beschleunigen. Gleichzeitig sollten Sie keine redundanten Indizes erstellen, die Ihre UPDATE/DELETE-Operationen möglicherweise verlangsamen könnten.

Indexarchitekturen werden als gruppiert oder nicht gruppiert klassifiziert. Gruppierte Indizes sind Indizes, deren Zeilenreihenfolge auf den Datenseiten der Zeilenreihenfolge im Index entspricht. Aus diesem Grund kann in einer bestimmten Tabelle nur ein gruppierter Index vorhanden sein, während in der Tabelle viele nicht gruppierte Indizes vorhanden sein können.

In App Builder, Indizes werden für Tabellenobjekte erstellt. Generell sollte jede Tabelle einen Clustered-Index haben, um eine effiziente Suche in den Daten dieser Tabelle zu ermöglichen. Wenn einer Tabelle ein Indexwert fehlt, kann dies zu einer Verlangsamung der Anwendungsgeschwindigkeit beitragen. Stellen Sie sicher, dass der Primärschlüssel für jede Tabelle und alle vorhandenen eindeutigen Schlüsselspalten indiziert sind. Wenn Sie Indizes in App Builder, beachten Sie die folgenden wichtigen Punkte:

  • Sie müssen das Erstellen von Indizes mit den Leistungseinbußen abwägen, die bei Einfüge-/Aktualisierungsanweisungen auftreten. Das Hinzufügen von Indizes beschleunigt Abfragen, verlangsamt aber Einfüge-/Aktualisierungs-/Löschvorgänge.
  • Sie müssen auch die Indizierung von Spalten in Betracht ziehen, die Sie zum Sortieren verwenden, und solche, die Sie in einem Gruppierungsausdruck verwenden. Es kann von Vorteil sein, die Spalten zu indizieren, die die Funktionen MIN(), MAX(), COUNT(), SUM() und AVG() zum Aggregieren der Daten verwenden.
  • Sie können „Abdeckungsindizes“ nutzen, bei denen Sie einen größeren Index haben, der von Abfragen genutzt werden kann, die Teilmengen der Spalten verwenden.
    • Die Reihenfolge der Spalten im Index ist wichtig.
    • Es wird empfohlen, dass die Ungleichheitsspalten in Ihren Abdeckungsindizes nach den Gleichheitsspalten kommen.

Fehlende Indexierungstools

Es gibt vorhandene SQL Server Dienstprogramme und-Abfragen, die beim Überprüfen von Indizes hilfreich sein können. Dynamische Verwaltungsansichten (DMVs) sind SQL Server Dienstprogramme, die Informationen zum Serverstatus zurückgeben und zum Überwachen des Zustands Ihres Datenbankservers und zum Diagnostizieren von Problemen verwendet werden können. DMVs geben einen guten Einblick in die Vorgänge innerhalb von SQL Server. Zum Ausführen dieser Ansichten ist die Berechtigung VIEW DATABASE STATE für die betreffende Datenbank erforderlich.

Sie können fehlende Indizes in Ihren SQL-Abfragen hauptsächlich auf drei Arten identifizieren:

  • Ausführen des Database Engine Tuning Advisor
  • Fehlende Index Dynamic Management Views ausführen
  • SQL Server Engine meldet fehlende Indizes, wenn Sie Ausführungspläne in SSMS generieren

Im Folgenden sind drei SQL-Abfragen aufgeführt, die häufig zur Ermittlung von Indexproblemen verwendet werden:

FindingLongRunningQueries.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 20
CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(28, 2))
AS [Total Duration (s)]
, CAST(qs.total_worker_time * 100.0 / qs.total_elapsed_time
AS DECIMAL(28, 2)) AS [% CPU]
, CAST((qs.total_elapsed_time - qs.total_worker_time)* 100.0 /
qs.total_elapsed_time AS DECIMAL(28, 2)) AS [% Waiting]
, qs.execution_count
, CAST(qs.total_elapsed_time / 1000000.0 / qs.execution_count
AS DECIMAL(28, 2)) AS [Average Duration (s)]
, SUBSTRING (qt.text,(qs.statement_start_offset/2) + 1,
((CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS [Individual Query]
, qt.text AS [Parent Query]
, DB_NAME(qt.dbid) AS DatabaseName
, qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE qs.total_elapsed_time > 0
ORDER BY qs.total_elapsed_time DESC
IdentifyMostImportantMissingIndexes.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 20
    ROUND(s.avg_total_user_cost *s.avg_user_impact*  (s.user_seeks + s.user_scans),0) AS [Total Cost]
 , d.[statement] AS [Table Name]
 , equality_columns
 , inequality_columns
 , included_columns
FROM sys.dm_db_missing_index_groups g
    INNER JOIN sys.dm_db_missing_index_group_stats s
        ON s.group_handle = g.index_group_handle
    INNER JOIN sys.dm_db_missing_index_details d
        ON d.index_handle = g.index_handle
WHERE d.database_ID = DB_ID()
ORDER BY`[Gesamtkosten] `DESC
IdentityUnusedIndexes.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
    DB_NAME() AS DatabaseName
 , SCHEMA_NAME(o.Schema_ID) AS SchemaName
 , OBJECT_NAME(s.[object_id]) AS TableName
 , i.name AS IndexName
 , s.user_updates
 , s.system_seeks + s.system_scans + s.system_lookups AS [System usage]
INTO    #TempUnusedIndexes
FROM    sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i
        ON s.[object_id] = i.[object_id]
        AND s.index_id   = i.index_id
    INNER JOIN sys.objects o
        ON i.object_id   = O.object_id
WHERE     1=2

EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempUnusedIndexes
SELECT TOP 20
    DB_NAME() AS DatabaseName
 , SCHEMA_NAME(o.Schema_ID) AS SchemaName
 , OBJECT_NAME(s.[object_id]) AS TableName
 , i.name AS IndexName
 , s.user_updates
 , s.system_seeks + s.system_scans + s.system_lookups
    AS [System usage]
FROM    sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i
        ON s.[object_id] = i.[object_id]
        AND s.index_id = i.index_id
    INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE     s.database_id = DB_ID()
AND     OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
AND     s.user_seeks = 0
AND     s.user_scans = 0
AND     s.user_lookups = 0
AND     i.name IS NOT NULL
ORDER BY s.user_updates DESC'

SELECT     TOP 20 *
FROM     #TempUnusedIndexes
ORDER BY`[Benutzerupdates] `DESC
DROP TABLE #TempUnusedIndexes

Verwenden von SQL-Anweisungen aus Protokollen und Index-Optimierern

Sobald Sie ein Business-Objekt mit Leistungsproblemen identifiziert haben, können Sie die SQL-Anweisungslogik aus dem App Builder Protokolle und führen Sie sie durch ein Indexoptimierungsprogramm, um verbesserungswürdige Bereiche zu identifizieren. Dies kann beispielsweise dazu führen, dass Indizes identifiziert werden, die hinzugefügt werden müssen.

Um die SQL-Anweisungslogik abzurufen, navigieren Sie in der App zu der Seite, auf der das Geschäftsobjekt verwendet wird. Von hier aus:

  1. Gehen Sie zu IDE > Überwachung
  2. Klicken Sie im Menü auf Datenbankprotokolle
  3. Klicken Sie auf die Schaltfläche Konfiguration bearbeiten
  4. Klicken Sie auf Bearbeiten
  5. Legen Sie im Abschnitt Speicherprotokollkonfiguration den Mindestschweregrad auf Trace fest.

    Wichtig

    Setzen Sie den Wert für den Mindestschweregrad immer wieder auf „Aus“ zurück, wenn Sie mit der Erfassung der Protokollinformationen fertig sind.

  6. Klicken Sie auf die Schaltfläche Speichern

  7. Sie sollten jetzt den Bildschirm „Fast Logs“ in App Builder, das aus 500 Zeilen Protokolldaten besteht (es sei denn, Sie ändern diesen Wert von 500). Blättern Sie durch die Protokolldaten, bis Sie die gesuchte SQL-Anweisungslogik finden.
  8. Kopieren Sie die gesamte SQL-Anweisungslogik, beginnend mit SELECT. Beispiel:

    SQL

  9. Klicken Sie auf die Schaltfläche Konfiguration bearbeiten

  10. Klicken Sie im Bildschirm „Protokollkonfiguration“ auf Bearbeiten
  11. Setzen Sie im Abschnitt Speicherprotokollkonfiguration den Mindestschweregrad auf Aus
  12. Starten Sie SQL Server Management Studio
  13. Stellen Sie eine Verbindung zu Ihrer Datenbank her
  14. Es gibt einige verschiedene Möglichkeiten, die Sie in SQL Server Management Studio nutzen können, um die von Ihrer App verwendete SQL-Anweisungslogik letztendlich besser zu optimieren.
  15. Sie können auf die Schaltfläche Neue Abfrage klicken und die verfügbare Datenbank auf die entsprechende Datenbank für die App festlegen, die Sie überprüfen
  16. Geben Sie die folgende Abfrage ein. Dabei handelt es sich um eine Abfrage zum Ermitteln der Top 10 der SQL-Abfragen, die die meisten Ressourcen verwenden (Lese-, Schreibvorgänge, Arbeitszeit (CPU) usw.):

    Top 10 auswählen

  17. Klicken Sie auf die Schaltfläche Ausführen

  18. Unter „Ergebnisse“ werden die 10 SQL-Abfragen angezeigt, die am meisten Zeit benötigen, um Informationen in Ihrer App zurückzugeben. Beachten Sie, dass der zweite Eintrag in unserem Beispiel Screenshot dieselbe Abfrage zurückgibt, die wir oben identifiziert haben (SELECT TOP 2…).

    Top 10 Ergebnisse

  19. Klicken Sie in der Symbolleiste auf die Schaltfläche Neue Abfrage

  20. Geben Sie die SQL-Anweisungslogik ein, die Sie aus dem App Builder Protokolle
  21. Wählen Sie die entsprechende Datenbank aus dem Auswahlmenü „Verfügbare Datenbank“ aus

    SQLquery

  22. Wenn Sie eine SQL Server Datenbank verwenden (SQL Express unterstützt dies nicht), können Sie mit der rechten Maustaste in das SQL-Abfragefenster klicken und „Abfrage im Database Engine Tuning Advisor analysieren“ auswählen. Hier können Sie auch das Dienstprogramm „Ausführungsplan“ nutzen, das den Weg der SQL-Anweisung durch die App-Datenbank aufzeichnet und dabei hilft, Bereiche zu identifizieren, deren Optimierung möglicherweise viel Zeit in Anspruch nimmt.

Die Datenbankoptimierung erfordert komplexe technische Fähigkeiten und erfordert die richtigen Berechtigungen für den Zugriff auf und die Anzeige von Datenbanken. Sie sollte methodisch und sorgfältig erfolgen. Während des gesamten Prozesses müssen strenge Tests durchgeführt werden, um sicherzustellen, dass das Nettoergebnis positiv ist.

Ressourcen

  • Abfrage-Leistungsoptimierung (SQL Server Compact): https://technet.microsoft.com/en-us/library/ms172984(v=sql.110).aspx.aspx)
  • SQL Server 2017 - „Indexbezogene dynamische Verwaltungsansichten und -funktionen (Transact-SQL)“ von Microsoft: https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/index-related-dynamic-management-views-and-functions-transact-sql?view=sql-server-2017