Zum Inhalt springen

Verwandeln Sie Ihre Kontakte in Urlaubsgeld mit unserem neuen Kundenempfehlungsprogramm! Erfahren Sie mehr

Diese Dokumentation gilt für Version 4 und höher von App Builder, dem neuen Namen für Vinyl. Hier gelangen Sie zur Vinyl-Dokumentation.

Leistungsdebugging und -verbesserung im Jitterbit App Builder

Chrome - Entwicklertools

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 im App Builder mit Anfragen diagnostizieren, die nicht beantwortet oder korrekt bearbeitet werden, eine HAR-Datei für die weitere Fehlerbehebung erstellen und Probleme mit Seitenladezeiten 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 in einer App Builder App-Anfrage zu isolieren und zu identifizieren, der nicht beantwortet oder korrekt verarbeitet wird. HTTP-Antwortstatuscodes geben an, ob eine bestimmte HTTP-Anfrage erfolgreich abgeschlossen wurde.

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

Chromenetworktab

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

Hier ist eine Liste der am häufigsten auftretenden HTTP-Fehlercodes:

  • 301 Dauerhaft verschoben
  • 302 gefunden
  • 307 Temporäre Weiterleitung
  • 308 Permanente Weiterleitung
  • 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 = Serverfehler
  • 502 Bad Gateway = Serverfehler
  • 503 Dienst nicht verfügbar = Serverfehler
  • 504 Gateway Timeout = Serverfehler

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 Behebung komplexer App Builder Probleme kann es hilfreich sein, eine HAR-Datei von den Chrome Web Developer Tools erstellen zu lassen und/oder von einem App Builder Entwickler zur weiteren fehlerbehebung anzufordern. Eine HAR-Datei protokolliert Netzwerkanfragen und -aktivitäten zum Zeitpunkt des Auftretens des Problems. HAR ist ein JSON-formatiertes Archivdateiformat zur Protokollierung der Interaktion eines Webbrowsers mit einer Website.

So generieren Sie eine Har-Datei:

  1. Öffnen Sie Google Chrome und gehen Sie zur 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 unteren Bereich Ihres Bildschirms die Tab Netzwerk
  4. Suchen Sie oben links auf der Tab „Netzwerk“ nach der runden roten Schaltfläche „Aufzeichnen“ und stellen Sie sicher, dass sie rot ist. Wenn sie grau ist, klicken Sie einmal darauf, um die Aufzeichnung 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 Problem zu reproduzieren, das Sie zuvor hatten, 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

Mit den Chrome DevTools können Sie Leistungsprobleme in Ihrer App Builder App identifizieren. Navigieren Sie zunächst zu der Seite, auf der das Leistungsproblem auftritt, öffnen Sie die DevTools, sehen Sie sich den Tab Netzwerk an und sortieren Sie nach der Spalte Zeit. Sortieren Sie, um zu sehen, welche Anfragen am längsten dauern. Die entsprechenden Spalten „Name“ und „Initiator“ enthalten zusätzliche Informationen zur Anfrage aus 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, ist dies wahrscheinlich ein Hinweis darauf, dass Sie das entsprechende Geschäftsobjekt optimieren müssen.

Geschäftsobjekte (oder Datenobjekte) können zu langsamen Seitenladezeiten führen. Wenn Sie feststellen, dass eine länger andauernde Anfrage von einem Geschäftsobjekt stammt, lesen Sie bitte den nächsten Abschnitt. Er beschreibt die Gründe für die Verlangsamung eines Datenobjekts und Möglichkeiten zur Geschwindigkeitsverbesserung.

Gründe für die Langsamkeit eines Geschäftsobjekts und Möglichkeiten zur Geschwindigkeitsverbesserung

Je nach Konfiguration können Business-Objekte (auch Datenobjekte genannt) Leistungsprobleme oder eine Verlangsamung der App Builder App verursachen. Zu den spezifischen Gründen für die Verlangsamung eines Business-Objekts gehören:

  • SQL-Logik enthält viele Unterabfragen
  • Nicht benötigte Spalten werden in der Logik 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
  • Verbinden berechneter Spalten
  • Die Indexverwendung kann aufgrund der Logik, die durch Funktionen läuft, verloren gehen
  • Binärfeld ist enthalten, wenn das Binärfeld nicht von einem Panel verwendet wird
    • Binäre Felder nur dann in Business Objects einbinden, wenn sie als Dateisteuerelement verwendet werden
    • Es lohnt sich, Business Objects speziell für die Verwendung auf Panels zu erstellen, auf denen eine Datei hoch-/heruntergeladen wird
  • Alle Spalten in einem Geschäftsobjekt werden vom App Builder unter den folgenden Bedingungen geladen:
    • Bedingte Formatierung vorhanden
    • Wenn für ein Feld die Option „Substitution unterstützen“ aktiviert ist
    • Wenn ein Panel nicht statische Sichtbarkeitsregeln hat

Business Objects können bei App-Seiten immer noch zu langen Ladezeiten führen, selbst wenn die resultierenden Business Object-Ergebnisse schnell geladen werden. Überprüfen Sie, ob es auf Ihrer App-Seite Faktoren gibt, die die Geschwindigkeit beeinträchtigen, wie z. B. Sortierungen, Listenfelder oder andere UI-Layer-Einstellungen, die zu längeren 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 möglicherweise zu vereinfachen.

  • In den meisten Fällen sollten Sie Unterabfragen wiederverwenden
  • Manchmal kann eine Abfrage mit verschachtelten Unterabfragen so groß werden, dass sie langsam läuft - 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 für die Rückgabe von „Ergebnissen“ benötigt wird. Zeit, die für die Rückgabe von „Weitere Zeilen laden“ benötigt wird.

Indexfreundliche Anweisungen in WHERE-Klauseln

Die Where-Klausel definiert die Suchbedingung einer SQL-Anweisung und fällt somit in den Kernfunktionsbereich eines Index: das schnelle Auffinden von Daten. Eine schlecht geschriebene Where-Klausel ist oft der Grund für eine langsame Ausführung von 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 Ablaufverfolgungsmodus- und Abfrage-Dienstprogramme, die Sie ausführen können, um zu sehen, ob Indizes verwendet werden.

Einstellungen zur Leistungsverbesserung

Dieser Abschnitt erläutert Einstellungen im App Builder, die sich auf die Leistung auswirken. Vermeiden Sie Suchen/Filtern/Sortieren in Spalten großer Tabellen, die nicht indiziert sind - wenn langsame Abfragen erkannt werden und Indizes keine Option sind.

Auf Panelebene kann die Aktivierung von Download-Support, die Aktivierung der einfachen Suche und die Konfiguration als „Nur indiziert“ zur Leistungsverbesserung beitragen.

Notiz

Beim Durchsuchen indizierter Felder generiert App Builder 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 verbessern, indem er den Datenabruf vom SQL Server beschleunigt. Dies wird durch die Reduzierung der Anzahl der zu besuchenden/durchsuchten Datenbankdatenseiten erreicht. Bei Indizes in App Builder-Datenobjekten benötigen Sie 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 und nicht gruppiert klassifiziert. Bei gruppierten Indizes entspricht die Zeilenreihenfolge der Datenseiten der Zeilenreihenfolge im Index. Aus diesem Grund kann in einer Tabelle nur ein gruppierter Index vorhanden sein, während mehrere nicht gruppierte Indizes vorhanden sein können.

Im App Builder werden Indizes für Tabellenobjekte erstellt. Generell sollte jede Tabelle einen Clustered-Index haben, um eine effiziente Suche in den Daten zu ermöglichen. Fehlt in einer Tabelle ein Indexwert, kann dies zu einer Verlangsamung der Anwendungsgeschwindigkeit führen. Stellen Sie sicher, dass der Primärschlüssel jeder Tabelle und alle vorhandenen eindeutigen Schlüsselspalten indiziert sind. Beachten Sie beim Ändern von Indizes im App Builder die folgenden wichtigen Punkte:

Sie möchten das Erstellen von Indizes mit den Leistungseinbußen bei Insert-/Update-Anweisungen abwägen. Das Hinzufügen von Indizes beschleunigt Abfragen, verlangsamt jedoch Insert-/Update-/Delete-Anweisungen. - Sie müssen auch die Indizierung von Spalten in Betracht ziehen, die Sie zum Sortieren und 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 die Vorteile von „abdeckenden Indizes“ nutzen, bei denen Sie über einen größeren Index verfügen, der von Abfragen genutzt werden kann, die Teilmengen der Spalten verwenden. - Reihenfolge der Spalten im Index ist wichtig - Es wird empfohlen, dass die Ungleichheitsspalten in Ihren abdeckenden Indizes nach den Gleichheitsspalten stehen

Fehlende Indexierungstools

Es gibt bereits SQL Server-Dienstprogramme und-Abfragen, die die Indexprüfung unterstützen. Dynamische Verwaltungsansichten (DMVs) sind SQL Server Dienstprogramme, die Serverstatusinformationen zurückgeben und zur Überwachung des Datenbankserverzustands und zur Problemdiagnose verwendet werden können. DMVs bieten umfassende Einblicke in die Vorgänge in SQL Server. Für die Ausführung ist die Berechtigung VIEW DATABASE STATE für die jeweilige Datenbank erforderlich.

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

  • Ausführen des Database Engine Tuning Advisor
  • Ausführen fehlender Index Dynamic Management Views
  • 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 zum Identifizieren von Problemen mit Indizes 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 Indexoptimierer

Sobald Sie ein Business-Objekt mit Leistungsproblemen identifiziert haben, können Sie die SQL-Anweisungslogik aus den App Builder Protokollen abrufen und durch ein Indexoptimierungsprogramm laufen lassen, um Verbesserungspotenziale zu identifizieren. Dies kann beispielsweise dazu führen, dass Indizes hinzugefügt werden.

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 minimalen Schweregrad 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 nun den Bildschirm „Fast Logs“ im App Builder sehen, der 500 Zeilen Protokolldaten enthält (sofern Sie diesen Wert nicht ändern). Blättern Sie durch die Protokolldaten, bis Sie die gewünschte SQL-Anweisungslogik gefunden haben.
  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 verschiedene Möglichkeiten, die Sie in SQL Server Management Studio nutzen können, um die SQL-Anweisungslogik Ihrer App 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 einstellen, die Sie überprüfen
  16. Geben Sie die folgende Abfrage ein. Dabei handelt es sich um eine Abfrage zum Ermitteln der Top 10 SQL-Abfragen, die die meisten Ressourcen (Lese-, Schreib-, Arbeitszeit (CPU) usw.) verwenden:

    Top 10 auswählen

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

  18. Die Ergebnisse zeigen die zehn SQL-Abfragen an, die in Ihrer App am längsten für die Rückgabe von Informationen benötigen. 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 den App Builder-Protokollen kopiert haben
  21. Wählen Sie die entsprechende Datenbank aus dem Auswahlmenü Verfügbare Datenbanken

    SQL-Abfrage

  22. Wenn Sie eine SQL Server Datenbank verwenden (SQL Express unterstützt diese nicht), können Sie mit der rechten Maustaste in das SQL-Abfragefenster klicken und „Abfrage im Datenbankoptimierungsratgeber analysieren“ auswählen. Hier können Sie auch das Ausführungsplan-Dienstprogramm nutzen, das den Weg der SQL-Anweisung durch die Anwendungsdatenbank aufzeichnet und 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 durchgeführt werden, und während des gesamten Prozesses sollten strenge Tests durchgeführt werden, um sicherzustellen, dass das Endergebnis positiv ist.

Ressourcen

  • Abfrageleistungsoptimierung (SQL Server Compact): https://technet.microsoft.com/en-us/library/ms172984(v=sql.110).aspx.aspx)
  • SQL Server 2017 - Microsofts „Indexbezogene dynamische Verwaltungsansichten und -funktionen (Transact-SQL)“: 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