Freigeben über


Abfrage-Anti-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. 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 mithilfe von OData eine GET Anforderung für eine Sammlung von Datensätzen senden.

Anmerkung

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 führenden 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.

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 führenden Platzhalter-Sonderzeichen beginnen, stark.

Bindestrich-Zeichen

Unicode-Sortierregeln für die Datenbanksortierung sorgen dafür, dass einige Suchzeichenfolgen, die mit einem Bindestrich (-) beginnen, wie führende Platzhaltersuchen ausgeführt werden. Suchzeichenfolgen, die mit einem Bindestrich beginnen, können keine Datenbankindizes nutzen, wenn die Suchzeichenfolge vor dem Zeichen „%“ in der Zeichenfolge kein Zeichen enthält, das kein Platzhalterzeichen ist. Zum Beispiel können -% und -%234 Datenbankindizes nicht effizient verwenden, während -234% dies kann. Dataverse drosselt ineffiziente Suchzeichenfolgen, die mit Bindestrichen beginnen, stark. Um mehr über die Unicode-Sortierregeln für Bindestriche bei der Datenbanksortierung zu erfahren, gehen Sie zu SQL Server-Sortierungen.

Formeln oder berechneten Spalten in Filterbedingungen vermeiden

Die Werte von Formeln 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.

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.

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:

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.

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 Die Sortierung nach Spalten in zugehörigen Tabellen vermeiden
LargeAmountOfAttributes Die Anzahl der ausgewählten Spalten minimieren
LargeAmountOfLogicalAttributes Minimieren Sie die Anzahl der ausgewählten logischen Spalten
FilteringOnCalculatedColumns Formeln oder berechneten 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 entweder das PerformanceLeadingWildCard oder das FilteringOnCalculatedColumns Antimuster 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.

Abfrage-Drosselung
Verwenden Sie Platzhalterzeichen in Bedingungen für Zeichenfolgenwerte
Daten mithilfe von FetchXml abfragen
Daten mithilfe von QueryExpression abfragen
OData zur Abfrage von Daten verwenden