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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Изменения регистра буквы в тексте.

  • Изменения пробела.

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

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

См. также