Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Optimierte Abfragen für Dataverse zu erstellen, ist von entscheidender Bedeutung, um zu gewährleisten, dass Anwendungen ein schnelles, reaktionsfähiges und zuverlässiges Erlebnis bieten. Erfahren Sie mehr über Abfrage-Antimuster, die beim Verfassen von Abfragen für Standardtabellen mithilfe der RetrieveMultiple Nachricht oder Nachrichten mit einem Parameter vermieden werden sollten, der von der QueryBase-Klasse erbt.
Diese Anleitung gilt auch beim Senden einer Anforderung gegen eine GET Sammlung von Datensätzen mithilfe von OData.
Notiz
Die Anleitungen in diesem Artikel 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. 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 verursachen.
Minimieren Sie die Anzahl der ausgewählten logischen Spalten
Vermeiden Sie das Anfordern zu vieler Spalten, insbesondere logischer Spalten. Eine logische Spalte enthält Werte, die in verschiedenen Datenbanktabellen gespeichert sind. Die AttributeMetadata.IsLogical-Eigenschaft 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.
Vermeiden von führenden Wildcards in Filterbedingungen
Abfragen, die Bedingungen mit führenden Wildcards verwenden (entweder explizit oder implizit mit einem Operator wie ends-with) können zu einer schlechten Leistung führen. Dataverse kann datenbankindizes nicht nutzen, wenn eine Abfrage führende Wildcards verwendet, wodurch SQL gezwungen wird, die gesamte Tabelle zu scannen. Tabellenscans können auch dann auftreten, wenn andere Abfragen mit nicht führenden Platzhaltern vorhanden sind, die das Resultset einschränken.
Das folgende Beispiel ist ein FetchXml-Bedingungselement , das einen führenden Wildcard verwendet:
<condition attribute='accountnumber'
operator='like'
value='%234' />
Wenn bei Abfragen Zeitüberschreitungen auftreten 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
Meldung: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 führende Wildcardabfragen stark, die als Risiko für den Systemzustand der Umgebung identifiziert werden, um Ausfälle zu verhindern. Wenn eine Abfrage aufgrund einer Drosselung fehlschlägt und dieses Muster erkannt wird, gibt Dataverse einen eindeutigen Fehler zurück:
Name:
DataEngineLeadingWildcardQueryThrottling
Code:0x80048644
Nummer:-2147187132
Meldung:This query cannot be executed because it conflicts with Query Throttling; the query uses a leading wildcard value in a filter condition, which will cause the query to be throttled more aggressively.
oder
This query is throttled as it negatively impacts the database health; the query uses a leading wildcard value in a filter condition, which will cause the query to be throttled more aggressively.
Wenn Sie führende Wildcardabfragen verwenden, sollten Sie die folgenden Optionen in Betracht ziehen:
- Verwenden Sie stattdessen die Dataverse-Suche.
- Ändern Sie Ihr Datenmodell, um Personen zu helfen, Werte mit führendem Platzhalter zu vermeiden.
Andere Platzhalterzeichen
Wie unter Verwendung von Wildcardzeichen in Bedingungen für Zeichenfolgenwerte beschrieben, können andere Zeichen außer dem Prozentzeichen (%) wie ein Wildcard fungieren. Die folgenden Abfragezeichenfolgen verhalten sich auch wie führende Wildcards:
_234%[^a]234%
Dataverse drosselt Abfragen mit Suchzeichenfolgen, die mit diesen anderen vorangestellten Platzhalter-Sonderzeichen beginnen, stark.
Bindestrich und Apostroph (einfaches Anführungszeichen)
Die Unicode-Sortierregeln für die Datenbanksortierung führen dazu, dass einige Suchzeichenfolgen, die mit einem Bindestrich (-) oder einem Apostroph (') beginnen, wie Suchen mit führendem Platzhalter behandelt werden. Suchzeichenfolgen, die mit einem Bindestrich oder Apostroph beginnen, können keine Datenbankindizes nutzen, wenn die Suchzeichenfolge vor dem Auftreten des % Zeichens in der Zeichenfolge kein Nicht-Platzhalterzeichen enthält. Beispielsweise können -%, -%234, '% und '%751 Datenbankindizes nicht effizient genutzt werden, während -234% und '751% effizient genutzt werden können. Dataverse drosselt stark ineffiziente Suchzeichenfolgen, die mit Bindestrichen oder Apostrophen beginnen. Weitere Informationen zu den Unicode-Sortierregeln für die Datenbanksortierung für Bindestriche und Apostrophe finden Sie unter SQL Server Sortierungen.
Formeln oder berechneten Spalten in Filterbedingungen vermeiden
Formel- und berechnete Spaltenwerte werden in Echtzeit berechnet, wenn Sie sie abrufen. 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. Abfragen sind langsamer, da Dataverse die Leistung dieser Abfragen nicht mithilfe von SQL verbessern kann.
Wenn bei Abfragen Zeitüberschreitungen auftreten 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
Meldung: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.
Dataverse drosselt Abfragen mit Filtern in berechneten Spalten stark, wenn sie als Risiko für die Integrität der Umgebung identifiziert werden, um Ausfälle zu verhindern. Wenn eine Abfrage aufgrund einer Drosselung fehlschlägt und dieses Muster erkannt wird, gibt Dataverse einen eindeutigen Fehler zurück:
Name:
DataEngineComputedColumnQueryThrottling
Code:0x80048744
Nummer:-2147186876
Meldung:This query cannot be executed because it conflicts with Query Throttling; the query uses a computed column in a filter condition, which will cause the query to be throttled more aggressively.
oder
This query is throttled as it negatively impacts the database health; the query uses a computed column in a filter condition, which will cause the query to be throttled more aggressively.
Sortieren nach Auswahlspalten vermeiden
Wenn Sie FetchXml oder QueryExpression verwenden und Abfrageergebnisse nach einer Auswahlspalte sortieren, sortieren Sie die Ergebnisse nach der lokalisierten Bezeichnung für jede Auswahloption. Die Sortierung nach dem in der Datenbank gespeicherten Zahlenwert führt in Ihrer Anwendung nicht zu einer guten Benutzererfahrung. Die Sortierung nach Auswahlspalten erfordert mehr Computeressourcen zum Verknüpfen und Sortieren der Zeilen nach dem lokalisierten Bezeichnungswert. Dieser Mehraufwand verlangsamt die Abfrage. Vermeiden Sie wenn möglich die Sortierung der Ergebnisse nach Auswahlspaltenwerten.
Notiz
OData ist anders. Bei Verwendung der Dataverse-Web-API $orderby werden Zeilen nach dem ganzzahligen Wert der Auswahlspalte und nicht nach 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 verknüpften Tabellen sollte nur bei Bedarf erfolgen, wie in den folgenden Abschnitten 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 größere Anzahl speichern.
Der Grenzwert für diese beiden Spalten wird durch die MaxLength Eigenschaft angegeben.
Verwenden Sie Bedingungen für Zeichenfolgenspalten, für die MaxLength auf weniger als 850 Zeichen festgelegt ist.
Alle Memospalten oder Zeichenfolgenspalten mit einem MaxLength-Wert von über 850 werden in Dataverse als große Textspalten definiert. Große Textspalten sind für eine effektive Indizierung zu groß, was bei der Einbeziehung in eine Filterbedingung zu einer schlechten Leistung führt.
Die Dataverse-Suche ist zum Abfragen von Daten in derartigen Spalten die bessere Wahl.
Dataverse-Fehler bei Abfragezeitüberschreitungen durch Antimuster
Wenn bei einer Abfrage eine Zeitüberschreitung auftritt und sie eines der auf dieser Seite beschriebenen Antimuster verwendet, gibt Dataverse den folgenden eindeutigen Fehler zurück. Dieser Fehler hilft Ihnen dabei, zu erkennen, welche Antimuster die Abfrage verwendet:
Name:
PerformanceValidationIssuesCauseTimeout
Code:0x80048575
Nummer:-2147187339
Meldung:The database operation timed out; this may be due to the query performance issues identified in a query executed on this request. Please optimize the query by addressing the following identified performance issues: {0}. Please reference this document for guidance: https://go.microsoft.com/fwlink/?linkid=2300520
Der {0} Teil der Ausnahmemeldung listet das Antimuster auf, das von der Abfrage verwendet wird. Wenn mehrere Antimuster von der Abfrage verwendet werden, werden diese durch Komma getrennt. Wenn eine Abfrage z. B. nach einer großen Textspalte filtert und gleichzeitig eine große Anzahl von Spalten auswählt, enthält die Ausnahmemeldung die Zeichenfolge PerformanceLargeColumnSearch,LargeAmountOfAttributes. In der folgenden Tabelle sind die Antimuster mit Links zu Erläuterungen aufgeführt:
| Antimusterbezeichner | Erläuterungs-Link |
|---|---|
PerformanceLeadingWildCard |
Vorangestellte Platzhalter in Filterbedingungen vermeiden |
PerformanceLargeColumnSearch |
Bei großen Textspalten die Verwendung von Bedingungen vermeiden |
OrderOnEnumAttribute |
Sortieren nach Auswahlspalten vermeiden |
OrderOnPropertiesFromJoinedTables |
Sortieren nach Spalten in zugehörigen Tabellen vermeiden |
LargeAmountOfAttributes |
Die Anzahl der ausgewählten Spalten minimieren |
LargeAmountOfLogicalAttributes |
Die Anzahl der ausgewählten logischen Spalten minimieren |
FilteringOnCalculatedColumns |
Formeln oder berechnete Spalten in Filterbedingungen vermeiden |
Verwenden Sie die Anleitungen auf dieser Seite, um die Antimuster zu verstehen. Ändern Sie die Abfrage, um die Verwendung dieser Anti-Patterns zu vermeiden.
Notiz
Wenn eine Abfrage entweder das PerformanceLeadingWildCard Antimuster oder das FilteringOnCalculatedColumns Antimuster enthält, löst Dataverse einen anderen Fehler aus. Abfragen, die das PerformanceLeadingWildCard Antimuster verwenden, lösen den LeadingWildcardCauseTimeout auf dieser Seite erwähnten Fehler aus. Abfragen, die das FilteringOnCalculatedColumns Antimuster verwenden, lösen den ComputedColumnCauseTimeout auf dieser Seite erwähnten Fehler aus.
Die LeadingWildcardCauseTimeout- und ComputedColumnCauseTimeout-Fehler traten vor dem PerformanceValidationIssuesCauseTimeout-Fehler auf. Um die Abwärtskompatibilität aufrechtzuerhalten, löst Dataverse weiterhin LeadingWildcardCauseTimeout und ComputedColumnCauseTimeout aus.
Ähnliche Artikel
Abfragedrosselung
Platzhalterzeichen in Bedingungen für Zeichenfolgenwerte verwenden
Daten mithilfe von FetchXml abfragen
Daten mithilfe von QueryExpression abfragen
OData zur Abfrage von Daten verwenden