다음과 같은 상수가 주어집니다.
- 구조가 동일한 동일한 데이터베이스 (테이블, 인덱스 등)
- 동일한 데이터
- 동일한 SQL Server 및 하드웨어 구성
- 동일한 통계
- 클라이언트에서 동일한 SET 옵션
- 동일한 SQL Server 버전
- 동일한 추적 플래그
이러한 상수가 주어지면 SQL Server는 항상 주어진 쿼리에 대해 동일한 계획을 생성합니까?
그렇지 않은 경우 다른 고려 사항이 있습니까? 비결정론 적 요소도 고려해야 하는가?
다음과 같은 상수가 주어집니다.
이러한 상수가 주어지면 SQL Server는 항상 주어진 쿼리에 대해 동일한 계획을 생성합니까?
그렇지 않은 경우 다른 고려 사항이 있습니까? 비결정론 적 요소도 고려해야 하는가?
답변:
이러한 상수가 주어지면 SQL Server는 항상 주어진 쿼리에 대해 동일한 계획을 생성합니까? 그렇지 않은 경우 다른 고려 사항이 있습니까? 비결정론 적 요소도 고려해야 하는가?
내가 아는 한 쿼리 컴파일은 결정적입니다. 원래 QO 디자인 목표 중 하나는 통계 전용 사본을 사용하여 다른 시스템에서 실행 계획을 재현 할 수 있어야한다는 것이 었습니다. 데이터베이스 을 . 사용 가능한 메모리 양 및 논리 프로세서 수와 같은 구성 매개 변수와 관련하여 몇 가지 미묘한 점이 있지만 동기화 할 항목 목록으로 덮여 있습니다.
주의 사항 : 목록에서 '동일한'이라는 단어 가 모든면에서 정확히 동일한 의미로 사용 되는 경우에 해당됩니다 . 예를 들어, '같은'통계는 두 시스템에 존재할 수 있지만, 그들은 단지입니다 정확히 같은 히스토그램 단계와 밀도 정보가있는 경우 동일 .
즉, 최적화 프로세스도 매우 복잡 하므로이 결정적 프로세스에 대한 모든 입력이 동일한 지 확인하기가 어려울 수 있습니다. 하고 모든 내부 상태가 동일하여 특정 코드 최적화 프로그램을 통해 동일한 코드 경로가 사용 편집. 쿼리에 데이터베이스 외부 (다른 데이터베이스 또는 인스턴스에 대한 액세스)가 포함 된 경우 해당 환경도 동일해야합니다.
목록에 추가 할 한 가지 계획 은 두 번째 데이터베이스에도 계획 지침 이 있는지 확인하는 것 입니다.
GETDATE()
쿼리에서 와 같이 비 결정적 기능을 사용 하면 다른 계획도 얻을 수 있습니다. 기본 옵티마이 저는 값을 직접 사용하지 않지만 카디널리티 추정은 카디널리티 추정 중 상수 폴딩 및 표현식 평가를 참조하십시오 . 이 두 클래스의 차이가 문제의 범위에 해당되는지 확실하지 않습니다. 두 시스템이 동시에 실행될 경우 동일한 계획을 생성하기 때문입니다 (보다 일반적으로 동일한 입력 변수, 매개 변수 및 함수 값으로).