쿼리를 실행하려고 시도할 때마다 쿼리 파이프라인은 쿼리 계획 캐시를 조회하여 정확한 쿼리가 이미 컴파일되고 사용 가능한지 확인합니다. 이 경우 새 계획을 빌드하는 대신 캐시된 계획을 다시 사용합니다. 쿼리 계획 캐시에서 일치하는 항목을 찾을 수 없으면 쿼리가 컴파일되고 캐시됩니다. 쿼리는 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 사용자가 제공한 값을 전달해야 하는 위치에 사용해야 합니다.
쿼리 계획 캐시의 슬롯을 불필요하게 사용하는 다음 쿼리 패턴을 피해야 합니다.
텍스트의 문자 대/소문자를 변경합니다.
공백을 변경합니다.
리터럴 값을 변경합니다.
메모 내의 텍스트 변경 내용입니다.