Кэширование плана запроса (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 должен быть использован всегда, когда нужно передать введенное пользователем значение.
Необходимо избегать следующих шаблонов запросов, которые напрасно занимают слоты в кэше планов запросов.
Изменение регистра символов в тексте.
Изменение пробельных символов.
Изменение литеральных значений.
Изменение текста внутри комментариев.