쿼리 계획이 쿼리에 의해 컴파일, 저장 및 검색되는 방법에 대한 제한된 지식을 통해 다중 문 쿼리 또는 저장 프로 시저가 쿼리 계획 캐시에 저장되어 향후 실행에서 쿼리에 사용될 쿼리 계획을 생성한다는 것을 이해합니다.
이 계획은 쿼리 해시가있는 쿼리 계획 캐시에서 검색됩니다. 즉, 쿼리를 편집하고 실행하면 해시가 다르고 쿼리 계획 캐시에서 일치하는 해시를 찾을 수 없으므로 새 계획이 생성됩니다.
내 질문은 : 사용자가 다중 문 쿼리의 문 중 하나 인 문을 실행하면 이미 다중 문 쿼리의 캐시에있는 쿼리 계획의 관련 부분을 사용할 수 있습니까? 해시 값이 분명히 일치하지 않기 때문에 대답이 ‘아니요’라고 예상하지만 다중 문 쿼리에서 각 문을 해시하는 것이 더 좋으므로 쿼리에서 개별 문을 실행하는 사용자가 사용할 수 있습니까?
나는 고려하지 않은 합병증이있을 것으로 예상합니다 (그리고 실제로 알고 싶은 것들입니다). 그러나 더 많은 공간을 차지하고 더 많은 것을 취하는 많은 쿼리 계획에 동일한 ‘상태 계획’을 저장할 수있는 것처럼 보입니다. CPU 및 생성 시간
그래도 내 무지를 보일 수 있습니다.
답변
사용자가 다중 문 쿼리의 문 중 하나 인 문을 실행하면 다중 문 쿼리의 캐시에 이미있는 쿼리 계획의 관련 부분을 사용할 수 있습니까?
아니요. SQL Server의 기본 계획 재사용 단위는 배치 입니다.
다중 문 쿼리에서 각 문을 해시하여 쿼리에서 개별 문을 실행하는 사용자가 사용할 수 있도록하는 것이 더 좋습니까?
높은 수준의 계획 재사용을 위해 조정 된 시스템은 SQL Server의 재사용 가능한 개체 (예 : 절차, 기능, 트리거)에 공통 코드 (적절한 단위로)를 배치합니다. 또한 응용 프로그램 생성 코드 또는 클라이언트 측 코드를 명시 적으로 매개 변수화합니다. 최대 계획 재사용을 위해 생성 된 배치는 매개 변수 값에서만 달라야합니다.
고려하지 않은 합병증이 있다고 생각합니다.
SQL Server가 명령문 수준이 아닌 배치 수준에서 캐시 및 재사용하도록 설계된 이유 를 묻는 것처럼 들립니다 . 오리지널 디자이너를 제외하고는 누구나이 질문에 권위있게 대답 할 수있을 것입니다. 어쨌든, 배치는 상대적으로 자체 포함 된 자연 작업 단위이기 때문에 사용하는 자연스러운 세분성이며 구현 복잡성과 계획 재사용 확률 사이의 합리적인 균형을 나타냅니다.
배치가 완전히 독립적 인 것은 아닌 몇 가지 사항이 있습니다 (예 : 저장 프로 시저 경계에서 생성 및 참조 된 로컬 임시 테이블). 이러한 예외는 직교성을 감소시키고 수년에 걸쳐 예기치 않은 ‘설계에 의한’행동 및 버그와 관련이 있습니다.