Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Chaque fois qu’une tentative d’exécution d’une requête est effectuée, le pipeline de requête recherche son cache de plan de requête pour voir si la requête exacte est déjà compilée et disponible. Si c’est le cas, il réutilise le plan mis en cache plutôt que de créer un nouveau plan. Si une correspondance est introuvable dans le cache du plan de requête, la requête est compilée et mise en cache. Une requête est identifiée par son texte Entity SQL et sa collection de paramètres (noms et types). Toutes les comparaisons de texte respectent la casse.
Paramétrage
La mise en cache du plan de requête est configurable via le EntityCommand.
Pour activer ou désactiver la mise en cache du plan de requête via EntityCommand.EnablePlanCaching, définissez cette propriété sur true ou false. La désactivation de la mise en cache de plan pour des requêtes dynamiques individuelles qui ne sont pas susceptibles d’être utilisées plusieurs fois améliore les performances.
Vous pouvez activer la mise en cache du plan de requête via EnablePlanCaching.
Pratique recommandée
Les requêtes dynamiques doivent être évitées, en général. L’exemple de requête dynamique suivant est vulnérable aux attaques par injection SQL, car il prend directement l’entrée utilisateur sans validation.
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;
Si vous utilisez des requêtes générées dynamiquement, envisagez de désactiver la mise en cache du plan de requête pour éviter une consommation de mémoire inutile pour les entrées de cache qui ne sont pas susceptibles d’être réutilisées.
La mise en cache du plan de requête sur les requêtes statiques et les requêtes paramétrables peut offrir des avantages en matière de performances. Voici un exemple de requête statique :
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";
Pour que les requêtes soient correctement mises en correspondance par le cache du plan de requête, elles doivent respecter les exigences suivantes :
Le texte de requête doit être un modèle constant, de préférence une chaîne constante ou une ressource.
EntityParameter ou ObjectParameter doit être utilisé partout où une valeur fournie par l’utilisateur doit être passée.
Vous devez éviter les modèles de requête suivants, qui consomment inutilement des emplacements dans le cache du plan de requête :
Modifications apportées à la casse de lettre dans le texte.
Modifications apportées à l’espace blanc.
Modifications apportées aux valeurs littérales.
Modifications apportées au texte à l’intérieur des commentaires.