Delen via


Queryplan opslaan in cache (Entiteit SQL)

Wanneer er een poging wordt gedaan om een query uit te voeren, zoekt de querypijplijn de cache van het queryplan op om te zien of de exacte query al is gecompileerd en beschikbaar is. Zo ja, dan wordt het plan in de cache opnieuw gebruikt in plaats van een nieuw plan te bouwen. Als er geen overeenkomst wordt gevonden in de cache van het queryplan, wordt de query gecompileerd en in de cache opgeslagen. Een query wordt geïdentificeerd door de entiteits-SQL-tekst en parameterverzameling (namen en typen). Alle tekstvergelijkingen zijn hoofdlettergevoelig.

Configuratie

Het opslaan van queryplannen kan worden geconfigureerd via de EntityCommand.

Als u het opslaan van queryplannen wilt in EntityCommand.EnablePlanCaching- of uitschakelen, stelt u deze eigenschap true in op of false. Het uitschakelen van plancaching voor afzonderlijke dynamische query's die waarschijnlijk meer dan niet meer worden gebruikt, verbetert de prestaties.

U kunt het opslaan van queryplannen inschakelen via EnablePlanCaching.

Dynamische query's moeten worden vermeden, in het algemeen. Het volgende dynamische queryvoorbeeld is kwetsbaar voor SQL-injectieaanvallen, omdat er rechtstreeks gebruikersinvoer wordt gebruikt zonder validatie.

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

Als u dynamisch gegenereerde query's gebruikt, kunt u overwegen het opslaan van queryplannen uit te schakelen om onnodig geheugenverbruik te voorkomen voor cachevermeldingen die waarschijnlijk niet opnieuw worden gebruikt.

Het opslaan van queryplannen voor statische query's en geparameteriseerde query's kan prestatievoordelen bieden. Hier volgt een voorbeeld van een statische query:

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

Om query's correct te laten overeenkomen met de cache van het queryplan, moeten ze voldoen aan de volgende vereisten:

  • Querytekst moet een constant patroon zijn, bij voorkeur een constante tekenreeks of een resource.

  • EntityParameter of ObjectParameter moet worden gebruikt waar een door de gebruiker opgegeven waarde moet worden doorgegeven.

Vermijd de volgende querypatronen, die onnodig sleuven gebruiken in de cache van het queryplan:

  • Wijzigingen in hoofdletters in de tekst.

  • Wijzigingen in witruimte.

  • Wijzigingen in letterlijke waarden.

  • Wijzigingen in tekst in opmerkingen.

Zie ook