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 Muster, die Sie beim Erstellen von Abfragen für Standardtabellen mithilfe der RetrieveMultiple Nachricht oder für Nachrichten mit einem Parameter, der von der QueryBase-Klasse erbt, vermeiden sollten.
Diese Anleitung gilt auch, wenn Sie GETmithilfe von OData eine Anforderung für eine Sammlung von Datensätzen senden.
Notiz
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.
Minimieren Sie die Anzahl der ausgewählten logischen Spalten
Sie sollten es vermeiden, zu viele Spalten anzufordern, insbesondere logische 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.
Vorangestellte Platzhalter in Filterbedingungen vermeiden
Abfragen, die Bedingungen mit vorangestellten Platzhaltern 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 Abfragen ohne führende Platzhalter vorhanden sind, die das Resultset einschränken.
Das folgende Beispiel ist ein FetchXml Bedingungselement, das einen vorangestellten Platzhalter verwendet:
<condition attribute='accountnumber'
operator='like'
value='%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
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 Abfragen mit vorangestellten Platzhaltern 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:
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 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 von Platzhalterzeichen in Bedingungen für Zeichenfolgenwerte beschrieben, können andere Zeichen jenseits des Prozentzeichens ('%') wie ein Platzhalter wirken. Im Folgenden finden Sie zwei Beispiele für Abfragezeichenfolgen, die sich auch wie führende Platzhalter verhalten:
_234%[^a]234%
Dataverse drosselt Abfragen mit Suchzeichenfolgen, die mit diesen anderen vorangestellten Platzhalter-Sonderzeichen beginnen, stark.
Bindestrich und Apostroph (einfaches Anführungszeichen)
Unicode-Sortierregeln für die Datenbanksortierung bewirken, dass einige Suchzeichenfolgen, die mit einem Bindestrich (-) oder einem Apostroph (') beginnen, wie vorangestellte Platzhalter funktionieren. 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
Die Werte von Formel- und berechneten Spalten 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
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 mithilfe einer Auswahlspalte sortieren, werden die Ergebnisse anhand 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.
Notiz
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 größere Anzahl speichern.
Der Grenzwert für diese beiden Spalten wird mit der Eigenschaft MaxLength festgelegt.
Sie können Bedingungen auf Zeichenfolgenspalten anwenden, deren MaxLength auf weniger als 850 Zeichen konfiguriert 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, die durch Antimuster verursacht werden
Wenn bei einer Abfrage eine Zeitüberschreitung auftritt und die Abfrage eines der auf dieser Seite beschriebenen Antimuster verwendet, gibt Dataverse den folgenden eindeutigen Fehler zurück, um zu ermitteln, welche Antimuster von der Abfrage verwendet werden:
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 Anleitung auf dieser Seite, um die Antimuster zu verstehen, und ändern Sie die Abfrage, um die Verwendung dieser Antimuster zu vermeiden.
Anmerkung
Wenn eine Abfrage das Antimuster PerformanceLeadingWildCard oder FilteringOnCalculatedColumns enthält, wird ein anderer Dataverse-Fehler ausgegeben. Abfragen, die das PerformanceLeadingWildCard Antimuster verwenden, lösen den LeadingWildcardCauseTimeout auf dieser Seite erwähnten Fehler aus, und Abfragen, die das FilteringOnCalculatedColumns Antimuster verwenden, lösen den ComputedColumnCauseTimeout auf dieser Seite erwähnten Fehler aus.
Die LeadingWildcardCauseTimeout und ComputedColumnCauseTimeout Fehler sind älter als der PerformanceValidationIssuesCauseTimeout Fehler. LeadingWildcardCauseTimeout und ComputedColumnCauseTimeout werden weiterhin ausgelöst, um die Abwärtskompatibilität zu wahren.
Ä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