Freigeben über


Zwischenspeichern von Abfrageplänen (Entity SQL)

Wenn versucht wird, eine Abfrage auszuführen, sucht die Abfragepipeline nach dem Abfrageplancache, um festzustellen, ob die genaue Abfrage bereits kompiliert und verfügbar ist. Wenn ja, wird der zwischengespeicherte Plan wiederverwendet, anstatt einen neuen Zubau zu erstellen. Wenn im Abfrageplancache keine Übereinstimmung gefunden wird, wird die Abfrage kompiliert und zwischengespeichert. Eine Abfrage wird durch seine Entity SQL-Text- und Parameterauflistung (Namen und Typen) identifiziert. Bei allen Textvergleichen wird die Groß-/Kleinschreibung beachtet.

Konfiguration

Die Zwischenspeicherung von Abfrageplänen kann über die EntityCommand.

Um das Zwischenspeichern von Abfrageplänen zu EntityCommand.EnablePlanCachingaktivieren oder zu deaktivieren, legen Sie diese Eigenschaft auf true oder false. Durch Deaktivieren der Planzwischenspeicherung für einzelne dynamische Abfragen, die nicht mehr verwendet werden können, wird die Leistung verbessert.

Sie können das Zwischenspeichern von Abfrageplänen über EnablePlanCaching.

Dynamische Abfragen sollten im Allgemeinen vermieden werden. Das folgende beispiel für dynamische Abfrage ist anfällig für SQL-Einfügungsangriffe, da benutzereingaben direkt ohne Überprüfung verwendet werden.

var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;

Wenn Sie dynamisch generierte Abfragen verwenden, sollten Sie die Zwischenspeicherung von Abfrageplänen deaktivieren, um unnötige Speicherauslastung für Cacheeinträge zu vermeiden, die wahrscheinlich nicht wiederverwendet werden.

Das Zwischenspeichern von Abfrageplänen für statische Abfragen und parametrisierte Abfragen kann Leistungsvorteile bieten. Im Folgenden sehen Sie ein Beispiel für eine statische Abfrage:

var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";

Damit Abfragen vom Abfrageplancache ordnungsgemäß abgeglichen werden, sollten sie die folgenden Anforderungen erfüllen:

  • Abfragetext sollte ein Konstantenmuster sein, vorzugsweise eine Konstante Zeichenfolge oder eine Ressource.

  • EntityParameter oder ObjectParameter sollte verwendet werden, wo ein vom Benutzer bereitgestellter Wert übergeben werden muss.

Sie sollten die folgenden Abfragemuster vermeiden, die unnötige Slots im Abfrageplancache verbrauchen:

  • Ändert die Groß-/Kleinschreibung im Text.

  • Ändert sich an Leerzeichen.

  • Änderungen an Literalwerten.

  • Änderungen an Text in Kommentaren.

Siehe auch