Поделиться через


Кэширование планов запросов (язык Entity SQL)

При каждой попытке выполнения запроса конвейер запросов обращается в кэш планов запросов, чтобы определить, что конкретный запрос уже скомпилирован и доступен. Если это так, то кэшированный план используется повторно вместо построения нового плана. Если совпадение в кэше планов запросов не обнаружено, запрос компилируется и кэшируется. Запрос идентифицируется его текстом Entity SQL и коллекцией параметров (имен и типов). Все текстовые сравнения выполняются с учетом регистра.

Конфигурация

Кэширование планов запросов можно настроить с помощью EntityCommand.

Чтобы включить или выключить кэширование планов запросов с помощью свойства System.Data.EntityClient.EntityCommand.EnablePlanCaching, назначьте этому свойству значение true или false. Отключение кэширования планов для отдельных динамических запросов, которые вряд ли будут использованы повторно, повышает производительность.

Можно включить кэширование планов запросов с помощью EnablePlanCaching.

Рекомендации

Как правило, следует избегать динамических запросов. Динамический запрос в следующем примере уязвим для атак путем внедрения кода SQL, так как входные данные пользователя принимаются напрямую без проверки.

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

Если используются динамически формируемые запросы, подумайте об отключении кэширования плана запроса, чтобы избежать ненужного расходования памяти для записей кэша, которые вряд ли будут использоваться повторно.

Кэширование планов запросов для статических запросов и параметризованных запросов может увеличить производительность. Ниже приводится пример статического запроса:

"SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";

Для правильного сопоставления запросов кэшу планов запросов они должны соответствовать следующим требованиям.

  • Текст запроса должен быть постоянным шаблоном, предпочтительно постоянной строкой или ресурсом.

  • Экземпляр EntityParameter или ObjectParameter должен быть использован всегда, когда нужно передать введенное пользователем значение.

Необходимо избегать следующих шаблонов запросов, которые напрасно занимают слоты в кэше планов запросов.

  • Изменение регистра символов в тексте.

  • Изменение пробельных символов.

  • Изменение литеральных значений.

  • Изменение текста внутри комментариев.

См. также

Основные понятия

Общие сведения о языке Entity SQL