다음을 통해 공유


쿼리 계획 캐싱(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 사용자가 제공한 값을 전달해야 하는 위치에 사용해야 합니다.

쿼리 계획 캐시의 슬롯을 불필요하게 사용하는 다음 쿼리 패턴을 피해야 합니다.

  • 텍스트의 문자 대/소문자를 변경합니다.

  • 공백을 변경합니다.

  • 리터럴 값을 변경합니다.

  • 메모 내의 텍스트 변경 내용입니다.

참고하십시오