Optimieren Sie die Leistung mit OData
In diesem Artikel werden Möglichkeiten zur Leistungsoptimierung beim Abrufen von Daten beschrieben Dataverse. Diese Grundsätze gelten auch bei der Verwendung von OData.
Zu vermeidende Muster
Optimierte Abfragen für Dataverse zu erstellen, ist von entscheidender Bedeutung, um sicherzustellen, dass Anwendungen ein schnelles, reaktionsfähiges und zuverlässiges Erlebnis bieten. In diesem Abschnitt werden zu vermeidende Muster und zu verstehende Konzepte beim Erstellen von Abfragen für Standardtabellen mithilfe der RetrieveMultiple
Nachricht oder von Nachrichten beschrieben, die einen Parameter aufweisen, der von der QueryBase-Klasse erbt. Diese Anleitung gilt auch beim Senden einer GET
Anfrage an eine Datensatzsammlung mithilfe von OData. Die hier aufgeführten Hinweise gelten möglicherweise nicht für elastische Tabellen oder bei Verwendung der Dataverse Suche.
Die Anzahl der ausgewählten Spalten minimieren
Nehmen Sie in Ihre Abfrage keine Spalten mit auf, die Sie nicht benötigen. Bei Abfragen, die alle Spalten zurückgeben oder eine große Anzahl von Spalten enthalten, können aufgrund der Größe des Datasets oder der Komplexität der Abfrage Leistungsprobleme auftreten.
Diese Vorgehensweise gilt insbesondere für logische Spalten. Eine logische Spalte enthält Werte, die in verschiedenen Datenbanktabellen gespeichert sind. Die Eigenschaft AttributeMetadata.IsLogical gibt Ihnen Auskunft darüber, ob eine Spalte eine logische Spalte ist. Abfragen, die viele logische Spalten enthalten, sind langsamer, da Dataverse die Daten aus anderen Datenbanktabellen kombinieren muss.
Vorangestellte Platzhalter in Filterbedingungen vermeiden
Abfragen, die Bedingungen mit dem führenden Platzhalter Karten verwenden (entweder explizit oder implizit mit einem Operator wie ends-with
), können zu Leistungseinbußen führen. Wenn eine Abfrage vorangestellte Platzhalter verwendet, kann Dataverse keine Datenbankindizes nutzen, sodass SQL gezwungen wird, die gesamte Tabelle zu scannen. Tabellenscans können auch dann durchgeführt werden, wenn andere nicht führende Karte-Abfragen vorhanden sind, die den Ergebnisset einschränken.
Das folgende Beispiel ist ein FetchXml Bedingungselement , das ein führendes Platzhalterzeichen Karte verwendet:
<condition attribute='accountnumber'
operator='like'
value='%234' />
Das folgende Beispiel ist ein QueryExpressionConditionExpression , der ein führendes Platzhalterzeichen Karte verwendet:
new ConditionExpression("accountnumber", ConditionOperator.Like, "%234")
Das folgende Beispiel ist eine OData-Abfrage, die ein führendes Platzhalterzeichen Karte verwendet:
$filter=startswith(accountnumber,'%234')
Wenn bei Abfragen eine Zeitüberschreitung auftritt und dieses Muster erkannt wird, gibt Dataverse einen eindeutigen Fehler zurück, um zu ermitteln, welche Abfragen dieses Muster verwenden:
Name:
LeadingWildcardCauseTimeout
Code:0x80048573
Nummer:-2147187341
Nachricht:The database operation timed out; this may be due to a leading wildcard value being used in a filter condition. Please consider removing filter conditions on leading wildcard values, as these filter conditions are expensive and may cause timeouts.
Dataverse drosselt Abfragen mit vorangestelltem Platzhalter, die als Risiko für die Integrität der Organisation identifiziert werden, stark, um Ausfälle zu verhindern. Weitere Informationen zur Abfragedrosselung
Wenn Sie häufig Abfragen mit vorangestellten Platzhaltern verwenden, prüfen Sie die folgenden Optionen:
- Verwenden Sie stattdessen die Dataverse Suche .
- Ändern Sie Ihr Datenmodell, damit Benutzende auf vorangestellte Platzhalter verzichten können.
Andere Platzhalterzeichen
Wie unter Verwenden Sie Platzhalterzeichen in Bedingungen für Zeichenfolgenwerte beschrieben, können andere Zeichen außer dem Prozentzeichen („%“) als Platzhalter fungieren. Nachfolgend sind zwei Beispielabfragezeichenfolgen aufgeführt, die sich ebenfalls wie führende Platzhalter verhalten:
_234%
[^a]234%
Dataverse drosselt Abfragen mit Suchzeichenfolgen, die mit diesen anderen führenden Platzhalter-Sonderzeichen beginnen, stark.
Bindestrich
Aufgrund der Unicode-Sortierregeln für die Datenbanksortierung funktionieren einige Suchzeichenfolgen, die mit einem Bindestrich („-“) beginnen, wie führende Platzhaltersuchen. Suchzeichenfolgen, die mit einem Bindestrich beginnen, können die Vorteile von Datenbankindizes nicht nutzen, wenn die Suchzeichenfolge vor dem Vorkommen des Zeichens „%“ in der Zeichenfolge kein Nichtplatzhalterzeichen enthält. Beispielsweise können -%
und -%234
Datenbankindizes nicht effizient nutzen, während -234%
dies können. Dataverse drosselt ineffiziente Suchzeichenfolgen, die mit Bindestrichen beginnen, stark. Weitere Informationen zu den Unicode-Sortierregeln der Datenbanksortierung für Bindestriche finden Sie unter SQL Serversortierungen.
Formeln oder berechneten Spalten in Filterbedingungen vermeiden
Formel- und berechnete Spaltenwerte werden in Echtzeit berechnet, wenn sie abgerufen werden. Abfragen, die Filter auf diese Spalten anwenden, zwingen Dataverse dazu, den Wert für jeden Datensatz, der möglicherweise zurückgegeben werden kann, zu berechnen, sodass der Filter angewendet werden kann. Die Abfragen sind langsamer, da Dataverse die Leistung dieser Abfragen nicht mit SQL verbessern kann.
Wenn bei Abfragen eine Zeitüberschreitung auftritt und dieses Muster erkannt wird, gibt Dataverse einen eindeutigen Fehler zurück, um zu ermitteln, welche Abfragen dieses Muster verwenden:
Name:
ComputedColumnCauseTimeout
Code:0x80048574
Nummer:-2147187340
Nachricht:The database operation timed out; this may be due to a computed column being used in a filter condition. Please consider removing filter conditions on computed columns, as these filter conditions are expensive and may cause timeouts.
Um Ausfälle zu vermeidet, drosselt Dataverse Abfragen, die Filter für berechnete Spalten enthalten, die als Risiko für die Integrität der Umgebung identifiziert wurden. Weitere Informationen zur Abfragedrosselung
Sortieren nach Auswahlspalten vermeiden
Wenn Sie FetchXml oder QueryExpression verwenden und Abfrageergebnisse mithilfe einer Auswahlspalte sortieren, werden die Ergebnisse mithilfe der lokalisierten Bezeichnung für jede Auswahloption sortiert. Die Sortierung nach dem in der Datenbank gespeicherten Zahlenwert würde in Ihrer Anwendung keine gute Erfahrung bieten. Seien Sie sich bewusst, dass das Sortieren nach Auswahlspalten mehr Rechenressourcen erfordert, um die Zeilen nach dem lokalisierten Beschriftungswert zu verknüpfen und zu sortieren. Dieser Mehraufwand verlangsamt die Abfrage. Vermeiden Sie wenn möglich die Sortierung der Ergebnisse nach Auswahlspaltenwerten.
Anmerkung
OData ist anders. Mit der Dataverse Web-API $orderby
werden Zeilen anhand des ganzzahligen Werts der Auswahlspalte und nicht anhand der lokalisierten Bezeichnung sortiert.
Die Sortierung nach Spalten in zugehörigen Tabellen vermeiden
Das Sortieren nach Spalten in zugehörigen Tabellen verlangsamt die Abfrage aufgrund der zusätzlichen Komplexität.
Die Sortierung nach zugehörigen Tabellen sollte nur bei Bedarf erfolgen, wie hier beschrieben:
Bei großen Textspalten die Verwendung von Bedingungen vermeiden
Dataverse verfügt über zwei Spaltentypen, in denen große Textzeichenfolgen gespeichert werden können:
- StringAttributeMetadata kann bis zu 4.000 Zeichen speichern.
- MemoAttributeMetadata kann eine höhere Zahl speichern.
Der Grenzwert für diese beiden Spalten wird mit der Eigenschaft MaxLength
angegeben.
Sie können Bedingungen auf Zeichenfolgenspalten anwenden, die für weniger als 850 Zeichen konfiguriert sind. MaxLength
Alle Memospalten oder Zeichenfolgenspalten mit einem Wert MaxLength
größer als 850 werden als große Textspalten definiert Dataverse . Große Textspalten sind für eine effektive Indizierung zu groß, was bei der Einbeziehung in eine Filterbedingung zu einer schlechten Leistung führt.
Dataverse Zum Abfragen von Daten in derartigen Spalten ist „search “ die bessere Wahl.
Siehe auch
Abfragen von Daten mit OData
Auswählen-Spalten mit OData
Tabellen mit OData verknüpfen
Zeilen mit OData sortieren
Filtern von Zeilen mit OData
Seitenergebnisse mit OData
Aggregieren von Daten mit OData
Zeilen mit OData zählen